@zolomedia/bifrost-client 1.7.74

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 (140) hide show
  1. package/L1_Foundation/L1_Foundation.js +13 -0
  2. package/L1_Foundation/bootstrap/bootstrap.js +11 -0
  3. package/L1_Foundation/bootstrap/bootstrap_hooks.js +123 -0
  4. package/L1_Foundation/bootstrap/bootstrap_index.js +15 -0
  5. package/L1_Foundation/bootstrap/bootstrap_logger.js +135 -0
  6. package/L1_Foundation/bootstrap/cdn_loader.js +217 -0
  7. package/L1_Foundation/bootstrap/module_registry.js +102 -0
  8. package/L1_Foundation/bootstrap/prism_loader.js +164 -0
  9. package/L1_Foundation/config/client_config.js +110 -0
  10. package/L1_Foundation/config/config.js +7 -0
  11. package/L1_Foundation/connection/connection.js +8 -0
  12. package/L1_Foundation/connection/websocket_connection.js +122 -0
  13. package/L1_Foundation/constants/bifrost_constants.js +284 -0
  14. package/L1_Foundation/constants/constants.js +7 -0
  15. package/L1_Foundation/logger/logger.js +10 -0
  16. package/L2_Handling/L2_Handling.js +15 -0
  17. package/L2_Handling/cache/cache.js +22 -0
  18. package/L2_Handling/cache/cache_constants.js +69 -0
  19. package/L2_Handling/cache/orchestration/cache_manager.js +299 -0
  20. package/L2_Handling/cache/orchestration/cache_orchestrator.js +260 -0
  21. package/L2_Handling/cache/orchestration/orchestration.js +12 -0
  22. package/L2_Handling/cache/storage/session_manager.js +289 -0
  23. package/L2_Handling/cache/storage/storage.js +10 -0
  24. package/L2_Handling/cache/storage/storage_manager.js +590 -0
  25. package/L2_Handling/display/composite/composite.js +13 -0
  26. package/L2_Handling/display/composite/dashboard_renderer.js +221 -0
  27. package/L2_Handling/display/composite/swiper_renderer.js +564 -0
  28. package/L2_Handling/display/composite/terminal_renderer.js +922 -0
  29. package/L2_Handling/display/composite/wizard_conditional_renderer.js +274 -0
  30. package/L2_Handling/display/display.js +30 -0
  31. package/L2_Handling/display/feedback/feedback.js +11 -0
  32. package/L2_Handling/display/feedback/progressbar_renderer.js +418 -0
  33. package/L2_Handling/display/feedback/spinner_renderer.js +246 -0
  34. package/L2_Handling/display/inputs/button_renderer.js +634 -0
  35. package/L2_Handling/display/inputs/form_renderer.js +583 -0
  36. package/L2_Handling/display/inputs/input_renderer.js +658 -0
  37. package/L2_Handling/display/inputs/inputs.js +12 -0
  38. package/L2_Handling/display/navigation/menu_renderer.js +206 -0
  39. package/L2_Handling/display/navigation/navigation.js +11 -0
  40. package/L2_Handling/display/navigation/navigation_renderer.js +703 -0
  41. package/L2_Handling/display/orchestration/orchestration.js +11 -0
  42. package/L2_Handling/display/orchestration/renderer.js +430 -0
  43. package/L2_Handling/display/orchestration/zdisplay_orchestrator.js +1759 -0
  44. package/L2_Handling/display/outputs/alert_renderer.js +161 -0
  45. package/L2_Handling/display/outputs/audio_renderer.js +94 -0
  46. package/L2_Handling/display/outputs/card_renderer.js +229 -0
  47. package/L2_Handling/display/outputs/code_renderer.js +66 -0
  48. package/L2_Handling/display/outputs/dl_renderer.js +131 -0
  49. package/L2_Handling/display/outputs/header_renderer.js +162 -0
  50. package/L2_Handling/display/outputs/icon_renderer.js +107 -0
  51. package/L2_Handling/display/outputs/image_renderer.js +145 -0
  52. package/L2_Handling/display/outputs/list_renderer.js +190 -0
  53. package/L2_Handling/display/outputs/outputs.js +19 -0
  54. package/L2_Handling/display/outputs/table_renderer.js +765 -0
  55. package/L2_Handling/display/outputs/text_renderer.js +818 -0
  56. package/L2_Handling/display/outputs/typography_renderer.js +293 -0
  57. package/L2_Handling/display/outputs/video_renderer.js +116 -0
  58. package/L2_Handling/display/primitives/document_structure_primitives.js +319 -0
  59. package/L2_Handling/display/primitives/form_primitives.js +526 -0
  60. package/L2_Handling/display/primitives/generic_containers.js +109 -0
  61. package/L2_Handling/display/primitives/interactive_primitives.js +305 -0
  62. package/L2_Handling/display/primitives/link_primitives.js +552 -0
  63. package/L2_Handling/display/primitives/lists_primitives.js +262 -0
  64. package/L2_Handling/display/primitives/media_primitives.js +383 -0
  65. package/L2_Handling/display/primitives/primitives.js +19 -0
  66. package/L2_Handling/display/primitives/semantic_element_primitive.js +226 -0
  67. package/L2_Handling/display/primitives/table_primitives.js +528 -0
  68. package/L2_Handling/display/primitives/typography_primitives.js +175 -0
  69. package/L2_Handling/display/specialized/input_request_renderer.js +467 -0
  70. package/L2_Handling/display/specialized/specialized.js +10 -0
  71. package/L2_Handling/hooks/hooks.js +9 -0
  72. package/L2_Handling/hooks/menu_integration.js +57 -0
  73. package/L2_Handling/hooks/widget_hook_manager.js +292 -0
  74. package/L2_Handling/message/message.js +8 -0
  75. package/L2_Handling/message/message_handler.js +701 -0
  76. package/L2_Handling/navigation/navigation.js +8 -0
  77. package/L2_Handling/navigation/navigation_manager.js +403 -0
  78. package/L2_Handling/zhooks/features/cache_live.js +287 -0
  79. package/L2_Handling/zhooks/features/crumbs_live.js +292 -0
  80. package/L2_Handling/zhooks/zhooks_manager.js +65 -0
  81. package/L2_Handling/zvaf/zvaf.js +8 -0
  82. package/L2_Handling/zvaf/zvaf_manager.js +334 -0
  83. package/L3_Abstraction/L3_Abstraction.js +12 -0
  84. package/L3_Abstraction/orchestrator/container_unwrapper.js +101 -0
  85. package/L3_Abstraction/orchestrator/group_renderer.js +698 -0
  86. package/L3_Abstraction/orchestrator/input_event_handler.js +797 -0
  87. package/L3_Abstraction/orchestrator/metadata_processor.js +249 -0
  88. package/L3_Abstraction/orchestrator/navbar_builder.js +201 -0
  89. package/L3_Abstraction/orchestrator/orchestrator.js +13 -0
  90. package/L3_Abstraction/orchestrator/wizard_gate_handler.js +360 -0
  91. package/L3_Abstraction/renderer/renderer.js +1 -0
  92. package/L3_Abstraction/session/session.js +1 -0
  93. package/L4_Orchestration/L4_Orchestration.js +11 -0
  94. package/L4_Orchestration/client/client.js +1 -0
  95. package/L4_Orchestration/facade/facade.js +9 -0
  96. package/L4_Orchestration/facade/manager_registry.js +118 -0
  97. package/L4_Orchestration/facade/renderer_registry.js +274 -0
  98. package/L4_Orchestration/lifecycle/asset_loader.js +255 -0
  99. package/L4_Orchestration/lifecycle/initializer.js +135 -0
  100. package/L4_Orchestration/lifecycle/lifecycle.js +8 -0
  101. package/L4_Orchestration/rendering/facade.js +94 -0
  102. package/L4_Orchestration/rendering/rendering.js +7 -0
  103. package/LICENSE +21 -0
  104. package/README.md +82 -0
  105. package/bifrost_client.js +204 -0
  106. package/bifrost_core.js +1686 -0
  107. package/docs/ARCHITECTURE.md +111 -0
  108. package/docs/PROTOCOL.md +106 -0
  109. package/docs/RENDERERS.md +101 -0
  110. package/docs/SECURITY.md +92 -0
  111. package/package.json +24 -0
  112. package/syntax/prism-zconfig.js +41 -0
  113. package/syntax/prism-zenv.js +69 -0
  114. package/syntax/prism-zolo-theme.css +288 -0
  115. package/syntax/prism-zolo.js +380 -0
  116. package/syntax/prism-zschema.js +38 -0
  117. package/syntax/prism-zspark.js +25 -0
  118. package/syntax/prism-zui.js +68 -0
  119. package/zSys/accessibility/accessibility.js +10 -0
  120. package/zSys/accessibility/emoji_accessibility.js +173 -0
  121. package/zSys/dom/block_utils.js +122 -0
  122. package/zSys/dom/container_utils.js +370 -0
  123. package/zSys/dom/dom.js +13 -0
  124. package/zSys/dom/dom_utils.js +328 -0
  125. package/zSys/dom/encoding_utils.js +117 -0
  126. package/zSys/dom/style_utils.js +71 -0
  127. package/zSys/errors/error_display.js +299 -0
  128. package/zSys/errors/errors.js +10 -0
  129. package/zSys/theme/color_utils.js +274 -0
  130. package/zSys/theme/dark_mode_utils.js +272 -0
  131. package/zSys/theme/size_utils.js +256 -0
  132. package/zSys/theme/spacing_utils.js +405 -0
  133. package/zSys/theme/theme.js +14 -0
  134. package/zSys/theme/zbase.css +1735 -0
  135. package/zSys/theme/zbase_inject.js +161 -0
  136. package/zSys/theme/ztheme_utils.js +305 -0
  137. package/zSys/validation/error_boundary.js +201 -0
  138. package/zSys/validation/validation.js +11 -0
  139. package/zSys/validation/validation_utils.js +238 -0
  140. package/zSys/zSys.js +14 -0
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Wizard Conditional Renderer - Client-Side If Condition Evaluation
3
+ * ==================================================================
4
+ *
5
+ * Handles conditional rendering of wizard steps in Bifrost mode.
6
+ * When elements have data-zif attributes, this module evaluates them
7
+ * based on user input (radio/select changes) and shows/hides elements accordingly.
8
+ *
9
+ * Usage:
10
+ * 1. Elements with 'if' parameter get data-zif attribute and display:none initially
11
+ * 2. When a selection changes (radio, checkbox, select), evaluate all data-zif conditions
12
+ * 3. Show elements where condition is true, hide where false
13
+ *
14
+ * Condition Syntax:
15
+ * - zHat[0] == 'value' - Check first wizard result
16
+ * - zHat[1] == 'value' - Check second wizard result
17
+ * - zHat[0] != 'value' - Not equal check
18
+ * - zHat[0] > 5 - Numeric comparison
19
+ *
20
+ * Example:
21
+ * <div data-zif="zHat[0] == 'medium'" style="display: none;">
22
+ * <label>Medium input</label>
23
+ * <input type="text" />
24
+ * </div>
25
+ *
26
+ * Layer: 2, Position: Bifrost rendering
27
+ * Version: v1.0.0
28
+ */
29
+
30
+ export class WizardConditionalRenderer {
31
+ constructor(logger) {
32
+ this.logger = logger || console;
33
+ this.wizardStates = new WeakMap(); // Track zHat state per wizard container
34
+ }
35
+
36
+ /**
37
+ * Initialize conditional rendering for a wizard container
38
+ * Finds all selection controls (radio, select, checkbox) and attaches change handlers
39
+ *
40
+ * @param {HTMLElement} wizardContainer - The wizard container element
41
+ */
42
+ initializeWizard(wizardContainer) {
43
+ if (!wizardContainer) {
44
+ this.logger.error('[WizardConditionalRenderer] No wizard container provided');
45
+ return;
46
+ }
47
+
48
+ const containerId = wizardContainer.id || wizardContainer.getAttribute('data-zkey') || '(no id)';
49
+ this.logger.log(`[WizardConditionalRenderer] Initializing wizard container: ${containerId}`, wizardContainer);
50
+ this.logger.log(`[WizardConditionalRenderer] Initializing wizard container: ${containerId}`);
51
+
52
+ // Initialize zHat state for this wizard (array of values by step index)
53
+ const zHat = [];
54
+ this.wizardStates.set(wizardContainer, zHat);
55
+
56
+ // Find all input controls in order (radio, select, checkbox, text inputs)
57
+ const allInputs = Array.from(wizardContainer.querySelectorAll('input, select, textarea'));
58
+ this.logger.log(`[WizardConditionalRenderer] Found ${allInputs.length} input(s) in wizard container:`, allInputs.map(i => ({type: i.type, id: i.id, checked: i.checked, zkey: i.closest('[data-zkey]')?.getAttribute('data-zkey')})));
59
+ this.logger.log(`[WizardConditionalRenderer] Found ${allInputs.length} input(s) in wizard container`);
60
+
61
+ // Map inputs to their step index (order of appearance)
62
+ allInputs.forEach((input, index) => {
63
+ // Skip if this input is inside a conditional element that's hidden
64
+ const conditionalParent = input.closest('[data-zif]');
65
+ if (conditionalParent && conditionalParent.style.display === 'none') {
66
+ this.logger.log(`[WizardConditionalRenderer] Skipping hidden input at index ${index}: ${input.id || input.type}`);
67
+ return; // Don't track hidden inputs initially
68
+ }
69
+
70
+ const checkedValue = input.type === 'checkbox' || input.type === 'radio' ? input.checked : (input.value || 'N/A');
71
+ this.logger.log(`[WizardConditionalRenderer] Input ${index}: type=${input.type}, id=${input.id}, checked=${checkedValue}, zkey=${input.closest('[data-zkey]')?.getAttribute('data-zkey') || 'none'}`);
72
+ this.logger.log(`[WizardConditionalRenderer] Input ${index}: type=${input.type}, id=${input.id}, checked=${checkedValue}`);
73
+
74
+ // Track selection changes for radio/select/checkbox
75
+ if (input.type === 'radio' || input.type === 'checkbox' || input.tagName === 'SELECT') {
76
+ input.addEventListener('change', () => {
77
+ this.logger.log(`[WizardConditionalRenderer] Selection changed: ${input.name || input.id} = ${input.value || input.checked} (type: ${input.type})`);
78
+ this.logger.log(`[WizardConditionalRenderer] Selection changed: ${input.name || input.id} = ${input.value || input.checked}`);
79
+ this.updateWizardState(wizardContainer, input);
80
+ this.evaluateConditions(wizardContainer);
81
+ });
82
+ // Also listen for click events on checkboxes to catch any edge cases
83
+ if (input.type === 'checkbox') {
84
+ input.addEventListener('click', () => {
85
+ this.logger.log(`[WizardConditionalRenderer] Checkbox clicked: ${input.id}, checked=${input.checked}`);
86
+ });
87
+ }
88
+ }
89
+ });
90
+
91
+ // Initial evaluation (in case there are defaults)
92
+ this.logger.log(`[WizardConditionalRenderer] Running initial updateWizardState and evaluateConditions for: ${containerId}`);
93
+ this.updateWizardState(wizardContainer);
94
+ this.evaluateConditions(wizardContainer);
95
+ this.logger.log(`[WizardConditionalRenderer] Initialization complete for: ${containerId}`);
96
+ }
97
+
98
+ /**
99
+ * Update the zHat state for a wizard based on current input values
100
+ *
101
+ * @param {HTMLElement} wizardContainer - The wizard container
102
+ * @param {HTMLElement} changedInput - Optional specific input that changed
103
+ */
104
+ updateWizardState(wizardContainer, changedInput = null) {
105
+ const zHat = this.wizardStates.get(wizardContainer) || [];
106
+
107
+ // Find all input controls in order (radio, checkbox, select, text inputs)
108
+ // This matches the order they appear in the wizard
109
+ const allInputs = Array.from(wizardContainer.querySelectorAll('input, select, textarea'));
110
+
111
+ this.logger.log(`[WizardConditionalRenderer] Updating zHat state from ${allInputs.length} input(s)`);
112
+
113
+ // Clear and rebuild zHat from current input values
114
+ zHat.length = 0;
115
+
116
+ allInputs.forEach((input, index) => {
117
+ // Skip if this input is inside a conditional element that's hidden
118
+ const conditionalParent = input.closest('[data-zif]');
119
+ if (conditionalParent && conditionalParent.style.display === 'none') {
120
+ this.logger.log(`[WizardConditionalRenderer] Skipping hidden input at index ${index} for zHat`);
121
+ return; // Don't track hidden inputs
122
+ }
123
+
124
+ if (input.type === 'radio') {
125
+ // Only track checked radio buttons
126
+ if (input.checked) {
127
+ zHat[index] = input.value;
128
+ this.logger.log(`[WizardConditionalRenderer] zHat[${index}] = '${input.value}' (radio)`);
129
+ }
130
+ } else if (input.type === 'checkbox') {
131
+ // Track checkbox boolean state
132
+ zHat[index] = input.checked;
133
+ this.logger.log(`[WizardConditionalRenderer] zHat[${index}] = ${input.checked} (checkbox, id: ${input.id})`);
134
+ this.logger.log(`[WizardConditionalRenderer] zHat[${index}] = ${input.checked} (checkbox)`);
135
+ } else if (input.tagName === 'SELECT') {
136
+ zHat[index] = input.value;
137
+ this.logger.log(`[WizardConditionalRenderer] zHat[${index}] = '${input.value}' (select)`);
138
+ } else if (input.type === 'text' || input.type === 'email' || input.type === 'password' || input.type === 'number') {
139
+ // Track text input values (for conditional logic based on input values)
140
+ zHat[index] = input.value || '';
141
+ this.logger.log(`[WizardConditionalRenderer] zHat[${index}] = '${input.value || ''}' (text input)`);
142
+ }
143
+ });
144
+
145
+ this.wizardStates.set(wizardContainer, zHat);
146
+ this.logger.log(`[WizardConditionalRenderer] Updated zHat state:`, zHat);
147
+ this.logger.log(`[WizardConditionalRenderer] Updated zHat state:`, zHat);
148
+ }
149
+
150
+ /**
151
+ * Evaluate all data-zif conditions in a wizard container
152
+ * Shows elements where condition is true, hides where false
153
+ *
154
+ * @param {HTMLElement} wizardContainer - The wizard container
155
+ */
156
+ evaluateConditions(wizardContainer) {
157
+ const zHat = this.wizardStates.get(wizardContainer) || [];
158
+
159
+ // Check if zCross is enabled (terminal-first behavior)
160
+ // Find checkbox or radio button in this wizard container to check zCross flag
161
+ const checkbox = wizardContainer.querySelector('input[type="checkbox"]');
162
+ const radio = wizardContainer.querySelector('input[type="radio"]');
163
+ const controlElement = checkbox || radio;
164
+ const zCross = controlElement ? (controlElement.getAttribute('data-zcross') === 'true') : false;
165
+
166
+ this.logger.log(`[WizardConditionalRenderer] zCross mode: ${zCross} (control found: ${!!controlElement}, type: ${controlElement ? controlElement.type : 'none'})`);
167
+ this.logger.log(`[WizardConditionalRenderer] zCross mode: ${zCross} (terminal-first behavior: ${zCross}, HTML-like behavior: ${!zCross})`);
168
+
169
+ // Find all elements with data-zif conditions
170
+ const conditionalElements = Array.from(wizardContainer.querySelectorAll('[data-zif]'));
171
+
172
+ this.logger.log(`[WizardConditionalRenderer] Evaluating ${conditionalElements.length} condition(s) with zHat:`, zHat);
173
+ this.logger.log(`[WizardConditionalRenderer] Conditional elements:`, conditionalElements.map(el => ({id: el.id, zkey: el.getAttribute('data-zkey'), zif: el.getAttribute('data-zif'), display: el.style.display})));
174
+ this.logger.log(`[WizardConditionalRenderer] Evaluating ${conditionalElements.length} condition(s) with zHat:`, zHat);
175
+
176
+ if (conditionalElements.length === 0) {
177
+ this.logger.log(`[WizardConditionalRenderer] [WARN] No conditional elements found in wizard container`);
178
+ }
179
+
180
+ conditionalElements.forEach((element, idx) => {
181
+ const condition = element.getAttribute('data-zif');
182
+ const elementId = element.id || element.getAttribute('data-zkey') || `element-${idx}`;
183
+
184
+ this.logger.log(`[WizardConditionalRenderer] Evaluating condition ${idx + 1}/${conditionalElements.length}: "${condition}" for element: ${elementId}`);
185
+
186
+ try {
187
+ // If zCross is false (HTML-like behavior), always show the element
188
+ // Only apply conditional rendering if zCross is true (terminal-first behavior)
189
+ if (!zCross) {
190
+ element.style.display = ''; // Always visible in HTML-like mode
191
+ this.logger.log(`[WizardConditionalRenderer] Show element (HTML-like mode, zCross=false): ${elementId}`);
192
+ this.logger.log(`[WizardConditionalRenderer] Show element (HTML-like mode, zCross=false): ${elementId}`);
193
+ return; // Skip condition evaluation
194
+ }
195
+
196
+ // Evaluate condition safely (only in terminal-first mode)
197
+ // Replace zHat[N] with actual values from zHat array
198
+ const result = this.evaluateCondition(condition, zHat);
199
+
200
+ // Show/hide based on result (terminal-first mode)
201
+ if (result) {
202
+ element.style.display = ''; // Show (use default display)
203
+ this.logger.log(`[WizardConditionalRenderer] Show element: ${elementId} (condition: ${condition})`);
204
+ this.logger.log(`[WizardConditionalRenderer] Show element: ${elementId} (condition: ${condition})`);
205
+ } else {
206
+ element.style.display = 'none'; // Hide
207
+ this.logger.log(`[WizardConditionalRenderer] [ERROR] Hide element: ${elementId} (condition: ${condition})`);
208
+ this.logger.log(`[WizardConditionalRenderer] [ERROR] Hide element: ${elementId} (condition: ${condition})`);
209
+ }
210
+ } catch (err) {
211
+ this.logger.error(`[WizardConditionalRenderer] [ERROR] Failed to evaluate condition '${condition}' for ${elementId}:`, err);
212
+ element.style.display = 'none'; // Hide on error (safe default)
213
+ }
214
+ });
215
+ }
216
+
217
+ /**
218
+ * Evaluate a single condition expression
219
+ *
220
+ * @param {string} condition - The condition string (e.g., "zHat[0] == 'medium'")
221
+ * @param {Array} zHat - The current zHat state
222
+ * @returns {boolean} - True if condition passes
223
+ */
224
+ evaluateCondition(condition, zHat) {
225
+ // Build a safe evaluation context
226
+ // Replace zHat[N] references with actual values
227
+ let evalExpression = condition;
228
+
229
+ // Strip YAML-style comments (everything after # that's not inside quotes)
230
+ // This handles cases where YAML parsers include comments in the condition string
231
+ evalExpression = evalExpression.replace(/#.*$/gm, '').trim();
232
+
233
+ // Replace zHat[0], zHat[1], etc. with actual values
234
+ evalExpression = evalExpression.replace(/zHat\[(\d+)\]/g, (match, index) => {
235
+ const idx = parseInt(index);
236
+ const value = zHat[idx];
237
+ // Quote string values for comparison
238
+ if (typeof value === 'string') {
239
+ return `'${value.replace(/'/g, "\\'")}'`; // Escape quotes
240
+ }
241
+ return String(value !== undefined ? value : 'undefined');
242
+ });
243
+
244
+ this.logger.log(`[WizardConditionalRenderer] Evaluating: "${condition}" → "${evalExpression}"`);
245
+ this.logger.log(`[WizardConditionalRenderer] Evaluating: "${condition}" → "${evalExpression}"`);
246
+
247
+ // Safe eval using Function constructor (only comparing values, no access to globals)
248
+ try {
249
+ const result = new Function(`return ${evalExpression}`)();
250
+ const boolResult = Boolean(result);
251
+ this.logger.log(`[WizardConditionalRenderer] Evaluation result: ${result} → ${boolResult}`);
252
+ this.logger.log(`[WizardConditionalRenderer] Condition result: ${boolResult} (raw: ${result})`);
253
+ return boolResult;
254
+ } catch (err) {
255
+ this.logger.error(`[WizardConditionalRenderer] [ERROR] Evaluation error for "${evalExpression}":`, err);
256
+ return false;
257
+ }
258
+ }
259
+ }
260
+
261
+ // Auto-initialize for all wizard containers on page load
262
+ document.addEventListener('DOMContentLoaded', () => {
263
+ const logger = window.BifrostClient?.logger || console;
264
+ const renderer = new WizardConditionalRenderer(logger);
265
+
266
+ // Find all wizard containers (elements with zWizard class or data-zkey="zWizard")
267
+ const wizards = document.querySelectorAll('[data-zkey*="Wizard"], .zInputGroup');
268
+
269
+ logger.log(`[WizardConditionalRenderer] Found ${wizards.length} wizard container(s) for conditional rendering`);
270
+
271
+ wizards.forEach(wizard => {
272
+ renderer.initializeWizard(wizard);
273
+ });
274
+ });
@@ -0,0 +1,30 @@
1
+ /**
2
+ * L2_Handling/display - Display Event Rendering
3
+ *
4
+ * Renders zDisplay events, manages DOM construction, handles UI primitives.
5
+ * Depends on: L1_Foundation (Logger, Constants), zSys (DOM, Theme, Accessibility)
6
+ */
7
+
8
+ // Orchestration
9
+ export * from './orchestration/orchestration.js';
10
+
11
+ // Navigation
12
+ export * from './navigation/navigation.js';
13
+
14
+ // Inputs
15
+ export * from './inputs/inputs.js';
16
+
17
+ // Outputs
18
+ export * from './outputs/outputs.js';
19
+
20
+ // Composite
21
+ export * from './composite/composite.js';
22
+
23
+ // Feedback
24
+ export * from './feedback/feedback.js';
25
+
26
+ // Specialized
27
+ export * from './specialized/specialized.js';
28
+
29
+ // Primitives
30
+ export * from './primitives/primitives.js';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Feedback Rendering Module Barrel Export
3
+ *
4
+ * User feedback components (progress bars, spinners).
5
+ *
6
+ * @module rendering/feedback
7
+ * @layer 3 (Feedback Rendering)
8
+ */
9
+
10
+ export * from './progressbar_renderer.js';
11
+ export * from './spinner_renderer.js';