@limetech/lime-crm-building-blocks 1.103.7 → 1.104.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 (37) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/{lime-query-validation-6be10fa7.js → lime-query-validation-82aa2855.js} +84 -84
  3. package/dist/cjs/limebb-icon-picker.cjs.entry.js +10 -0
  4. package/dist/cjs/limebb-lime-query-builder.cjs.entry.js +44 -43
  5. package/dist/cjs/limebb-lime-query-filter-builder_3.cjs.entry.js +1 -1
  6. package/dist/cjs/limebb-lime-query-response-format-builder.cjs.entry.js +42 -42
  7. package/dist/collection/components/lime-query-builder/lime-query-builder.css +9 -9
  8. package/dist/collection/components/lime-query-builder/lime-query-builder.js +42 -41
  9. package/dist/collection/components/lime-query-builder/lime-query-response-format-builder.css +5 -5
  10. package/dist/collection/components/lime-query-builder/lime-query-response-format-builder.js +42 -42
  11. package/dist/collection/components/lime-query-builder/lime-query-validation.js +84 -84
  12. package/dist/collection/components/lime-query-builder/order-by/order-by-editor.css +2 -2
  13. package/dist/collection/components/lime-query-builder/response-format/response-format-helpers.js +2 -2
  14. package/dist/components/lime-query-validation.js +84 -84
  15. package/dist/components/limebb-icon-picker.js +10 -0
  16. package/dist/components/limebb-lime-query-builder.js +43 -42
  17. package/dist/components/limebb-lime-query-response-format-builder.js +41 -41
  18. package/dist/components/order-by-editor.js +1 -1
  19. package/dist/esm/{lime-query-validation-573223a5.js → lime-query-validation-9e386da8.js} +84 -84
  20. package/dist/esm/limebb-icon-picker.entry.js +10 -0
  21. package/dist/esm/limebb-lime-query-builder.entry.js +44 -43
  22. package/dist/esm/limebb-lime-query-filter-builder_3.entry.js +1 -1
  23. package/dist/esm/limebb-lime-query-response-format-builder.entry.js +42 -42
  24. package/dist/lime-crm-building-blocks/lime-crm-building-blocks.esm.js +1 -1
  25. package/dist/lime-crm-building-blocks/{p-6c7af6bb.entry.js → p-7d2188aa.entry.js} +1 -1
  26. package/dist/lime-crm-building-blocks/p-7fbb6eba.entry.js +1 -0
  27. package/dist/lime-crm-building-blocks/p-ac9e81c9.entry.js +1 -0
  28. package/dist/lime-crm-building-blocks/{p-e35299e0.entry.js → p-ef042c82.entry.js} +1 -1
  29. package/dist/lime-crm-building-blocks/p-efa5bcd4.js +1 -0
  30. package/dist/types/components/lime-query-builder/lime-query-builder.d.ts +3 -3
  31. package/dist/types/components/lime-query-builder/lime-query-response-format-builder.d.ts +13 -13
  32. package/dist/types/components/lime-query-builder/lime-query-validation.d.ts +17 -17
  33. package/dist/types/components.d.ts +12 -12
  34. package/package.json +2 -2
  35. package/dist/lime-crm-building-blocks/p-96fee7ee.entry.js +0 -1
  36. package/dist/lime-crm-building-blocks/p-fa2da6bc.js +0 -1
  37. package/dist/lime-crm-building-blocks/p-fe6a94a1.entry.js +0 -1
@@ -39,7 +39,7 @@ function parseResponseFormat(json) {
39
39
  `Only 'object' and 'aggregates' are allowed.`);
40
40
  }
41
41
  // Must have at least one of object or aggregates
42
- // Note: Empty objects {} are valid (starting point for GUI mode)
42
+ // Note: Empty objects {} are valid (starting point for visual mode)
43
43
  const hasProperties = keys.length > 0;
44
44
  if (hasProperties && !parsed.object && !parsed.aggregates) {
45
45
  throw new Error('Response format must contain at least one of: object, aggregates');
@@ -68,7 +68,7 @@ function getDefaultResponseFormat() {
68
68
  };
69
69
  }
70
70
 
71
- const limeQueryResponseFormatBuilderCss = ":host(limebb-lime-query-response-format-builder){display:block;width:100%}.response-format-builder{display:flex;flex-direction:column}.builder-label{color:rgb(var(--contrast-1100));font-size:1.625rem;line-height:1.25rem;font-weight:300;margin-top:1rem;margin-bottom:0.25rem}.builder-helper-text{margin-top:0px;margin-bottom:0.5rem;font-size:var(--limel-theme-default-font-size);color:rgb(var(--contrast-1100))}.mode-controls{display:flex;justify-content:flex-end;padding:0.5rem}.gui-mode,.code-mode{display:block}.code-editor-container{--code-editor-max-height:70vh;display:flex;flex-direction:column;gap:1rem}.code-editor-container .validation-errors{padding:0.75rem 1rem;color:rgb(var(--color-red-default));background-color:rgb(var(--color-red-lighter));border-left:0.25rem solid rgb(var(--color-red-default));border-radius:0.25rem;font-size:0.875rem}.code-editor-container .validation-errors strong{display:block;margin-bottom:0.5rem;font-weight:600}.code-editor-container .validation-errors ul{margin:0;padding-left:1.5rem}.code-editor-container .validation-errors li{margin:0.25rem 0}.code-editor-container .gui-limitations{padding:0.75rem 1rem;color:rgb(var(--color-blue-dark));background-color:rgb(var(--color-blue-lighter));border-left:0.25rem solid rgb(var(--color-blue-default));border-radius:0.25rem;font-size:0.875rem}.code-editor-container .gui-limitations strong{display:block;margin-bottom:0.5rem;font-weight:600}.code-editor-container .gui-limitations ul{margin:0;padding-left:1.5rem}.code-editor-container .gui-limitations li{margin:0.25rem 0}";
71
+ const limeQueryResponseFormatBuilderCss = ":host(limebb-lime-query-response-format-builder){display:block;width:100%}.response-format-builder{display:flex;flex-direction:column}.builder-label{color:rgb(var(--contrast-1100));font-size:1.625rem;line-height:1.25rem;font-weight:300;margin-top:1rem;margin-bottom:0.25rem}.builder-helper-text{margin-top:0px;margin-bottom:0.5rem;font-size:var(--limel-theme-default-font-size);color:rgb(var(--contrast-1100))}.mode-controls{display:flex;justify-content:flex-end;padding:0.5rem}.visual-mode,.code-mode{display:block}.code-editor-container{--code-editor-max-height:70vh;display:flex;flex-direction:column;gap:1rem}.code-editor-container .validation-errors{padding:0.75rem 1rem;color:rgb(var(--color-red-default));background-color:rgb(var(--color-red-lighter));border-left:0.25rem solid rgb(var(--color-red-default));border-radius:0.25rem;font-size:0.875rem}.code-editor-container .validation-errors strong{display:block;margin-bottom:0.5rem;font-weight:600}.code-editor-container .validation-errors ul{margin:0;padding-left:1.5rem}.code-editor-container .validation-errors li{margin:0.25rem 0}.code-editor-container .visual-mode-limitations{padding:0.75rem 1rem;color:rgb(var(--color-blue-dark));background-color:rgb(var(--color-blue-lighter));border-left:0.25rem solid rgb(var(--color-blue-default));border-radius:0.25rem;font-size:0.875rem}.code-editor-container .visual-mode-limitations strong{display:block;margin-bottom:0.5rem;font-weight:600}.code-editor-container .visual-mode-limitations ul{margin:0;padding-left:1.5rem}.code-editor-container .visual-mode-limitations li{margin:0.25rem 0}";
72
72
  const LimebbLimeQueryResponseFormatBuilderStyle0 = limeQueryResponseFormatBuilderCss;
73
73
 
74
74
  var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
@@ -95,34 +95,34 @@ const LimeQueryResponseFormatBuilder = /*@__PURE__*/ proxyCustomElement(class Li
95
95
  * Optional helper text for the builder
96
96
  */
97
97
  this.helperText = '';
98
- this.mode = 'gui';
98
+ this.mode = 'visual';
99
99
  this.codeValue = '';
100
100
  this.handleModeChange = (event) => {
101
101
  event.stopPropagation();
102
102
  const mode = event.detail.id;
103
- if (mode === 'gui') {
104
- this.switchToGui();
103
+ if (mode === 'visual') {
104
+ this.switchToVisualMode();
105
105
  }
106
106
  else if (mode === 'code') {
107
107
  this.switchToCode();
108
108
  }
109
109
  };
110
110
  /**
111
- * Switch from code mode to GUI mode
111
+ * Switch from code mode to visual mode
112
112
  */
113
- this.switchToGui = () => {
113
+ this.switchToVisualMode = () => {
114
114
  // Validate JSON before switching
115
115
  try {
116
116
  const parsed = parseResponseFormat(this.codeValue);
117
- // Check if it's supported in GUI
118
- const support = validateResponseFormatOnly(parsed, this.limetypes, this.limetype, this.guiModeEnabled);
119
- if (!support.guiSupported) {
120
- // Don't switch if GUI can't render this response format
117
+ // Check if it's supported in visual mode
118
+ const support = validateResponseFormatOnly(parsed, this.limetypes, this.limetype, this.visualModeEnabled);
119
+ if (!support.visualModeSupported) {
120
+ // Don't switch if visual mode can't render this response format
121
121
  return;
122
122
  }
123
123
  // Update internal state from parsed value
124
124
  this.internalValue = parsed;
125
- this.mode = 'gui';
125
+ this.mode = 'visual';
126
126
  this.change.emit(parsed);
127
127
  }
128
128
  catch (_a) {
@@ -130,7 +130,7 @@ const LimeQueryResponseFormatBuilder = /*@__PURE__*/ proxyCustomElement(class Li
130
130
  }
131
131
  };
132
132
  /**
133
- * Switch from GUI mode to code mode
133
+ * Switch from visual mode to code mode
134
134
  */
135
135
  this.switchToCode = () => {
136
136
  this.updateCodeValue();
@@ -151,14 +151,14 @@ const LimeQueryResponseFormatBuilder = /*@__PURE__*/ proxyCustomElement(class Li
151
151
  }
152
152
  catch (_a) {
153
153
  // Invalid JSON - don't emit change
154
- // Validation errors will be shown by checkGuiSupport()
154
+ // Validation errors will be shown by checkVisualModeSupport()
155
155
  }
156
156
  };
157
157
  /**
158
- * Handle GUI mode changes
158
+ * Handle visual mode changes
159
159
  * @param event
160
160
  */
161
- this.handleGuiChange = (event) => {
161
+ this.handleVisualModeChange = (event) => {
162
162
  event.stopPropagation();
163
163
  this.internalValue = event.detail;
164
164
  this.updateCodeValue();
@@ -166,9 +166,9 @@ const LimeQueryResponseFormatBuilder = /*@__PURE__*/ proxyCustomElement(class Li
166
166
  };
167
167
  }
168
168
  /**
169
- * Check if GUI mode is enabled via feature flag
169
+ * Check if visual mode is enabled via feature flag
170
170
  */
171
- get guiModeEnabled() {
171
+ get visualModeEnabled() {
172
172
  var _a, _b, _c;
173
173
  return ((_c = (_b = (_a = this.platform) === null || _a === void 0 ? void 0 : _a.isFeatureEnabled) === null || _b === void 0 ? void 0 : _b.call(_a, 'useLimeQueryBuilderGuiMode')) !== null && _c !== void 0 ? _c : false);
174
174
  }
@@ -177,32 +177,32 @@ const LimeQueryResponseFormatBuilder = /*@__PURE__*/ proxyCustomElement(class Li
177
177
  this.internalValue = this.value || getDefaultResponseFormat();
178
178
  // Update code value from internal value
179
179
  this.updateCodeValue();
180
- // Force code mode if GUI is disabled
181
- if (!this.guiModeEnabled) {
180
+ // Force code mode if visual mode is disabled
181
+ if (!this.visualModeEnabled) {
182
182
  this.mode = 'code';
183
183
  return;
184
184
  }
185
- // Check if GUI mode is supported for current value
186
- const support = this.checkGuiSupport();
187
- if (!support.guiSupported) {
185
+ // Check if visual mode is supported for current value
186
+ const support = this.checkVisualModeSupport();
187
+ if (!support.visualModeSupported) {
188
188
  this.mode = 'code';
189
189
  }
190
190
  }
191
191
  componentWillUpdate() {
192
192
  // Sync internal value when prop changes externally
193
- if (this.value && this.mode === 'gui') {
193
+ if (this.value && this.mode === 'visual') {
194
194
  this.internalValue = this.value;
195
195
  }
196
196
  }
197
197
  render() {
198
- const guiSupported = this.checkGuiSupport();
199
- return (h("div", { key: '6bc723110dcd545534e93db64a0d6a14963b6bda', class: "response-format-builder" }, this.label && h("h1", { key: '405d373ccb5056af3c0e6201ef5ebf819a3b8154', class: "builder-label" }, this.label), this.helperText && (h("p", { key: '5fb07f0fcd9e57b7c358957afc13485156bd041f', class: "builder-helper-text" }, this.helperText)), this.guiModeEnabled && (h("div", { key: 'd2241f702cfe9e75077542d4d21acb038be0a348', class: "mode-controls" }, this.renderModeSwitch(guiSupported))), !this.guiModeEnabled || this.mode === 'code' ? (h("div", { class: "code-mode" }, this.renderCodeEditor(guiSupported))) : (h("div", { class: "gui-mode" }, this.renderGuiMode()))));
198
+ const visualModeSupported = this.checkVisualModeSupport();
199
+ return (h("div", { key: '7ae23c1366da49b591c0914f49f25c179e4d6712', class: "response-format-builder" }, this.label && h("h1", { key: '0cd528a69dd1b05769c678151f0827de15d167a8', class: "builder-label" }, this.label), this.helperText && (h("p", { key: 'b636ca0d32b244d051e74ed538cbd11438f29cd1', class: "builder-helper-text" }, this.helperText)), this.visualModeEnabled && (h("div", { key: 'dc7248cb27d99aa654b0f1659938c3f2933d89e0', class: "mode-controls" }, this.renderModeSwitch(visualModeSupported))), !this.visualModeEnabled || this.mode === 'code' ? (h("div", { class: "code-mode" }, this.renderCodeEditor(visualModeSupported))) : (h("div", { class: "visual-mode" }, this.renderVisualMode()))));
200
200
  }
201
201
  renderModeSwitch(support) {
202
- const guiDisabled = !support.guiSupported;
202
+ const visualDisabled = !support.visualModeSupported;
203
203
  const buttons = [
204
204
  {
205
- id: 'gui',
205
+ id: 'visual',
206
206
  title: 'Visual',
207
207
  },
208
208
  {
@@ -210,27 +210,27 @@ const LimeQueryResponseFormatBuilder = /*@__PURE__*/ proxyCustomElement(class Li
210
210
  title: 'Code',
211
211
  },
212
212
  ].map((button) => (Object.assign(Object.assign({}, button), { selected: button.id === this.mode })));
213
- return (h("limel-button-group", { value: buttons, disabled: guiDisabled, onChange: this.handleModeChange }));
213
+ return (h("limel-button-group", { value: buttons, disabled: visualDisabled, onChange: this.handleModeChange }));
214
214
  }
215
215
  renderCodeEditor(support) {
216
- return (h("div", { class: "code-editor-container" }, h("limel-code-editor", { value: this.codeValue, language: "json", lineNumbers: true, fold: true, lint: true, onChange: this.handleCodeChange }), !support.valid && support.validationErrors.length > 0 && (h("div", { class: "validation-errors" }, h("strong", null, "Invalid Response Format:"), h("ul", null, support.validationErrors.map((error) => (h("li", null, error)))))), this.guiModeEnabled &&
216
+ return (h("div", { class: "code-editor-container" }, h("limel-code-editor", { value: this.codeValue, language: "json", lineNumbers: true, fold: true, lint: true, onChange: this.handleCodeChange }), !support.valid && support.validationErrors.length > 0 && (h("div", { class: "validation-errors" }, h("strong", null, "Invalid Response Format:"), h("ul", null, support.validationErrors.map((error) => (h("li", null, error)))))), this.visualModeEnabled &&
217
217
  support.valid &&
218
- !support.guiSupported &&
219
- support.guiLimitations.length > 0 && (h("div", { class: "gui-limitations" }, h("strong", null, "Cannot switch to GUI mode:"), h("ul", null, support.guiLimitations.map((limitation) => (h("li", null, limitation))))))));
218
+ !support.visualModeSupported &&
219
+ support.visualModeLimitations.length > 0 && (h("div", { class: "visual-mode-limitations" }, h("strong", null, "Cannot switch to visual mode:"), h("ul", null, support.visualModeLimitations.map((limitation) => (h("li", null, limitation))))))));
220
220
  }
221
- renderGuiMode() {
222
- return (h("limebb-lime-query-response-format-editor", { platform: this.platform, context: this.context, limetype: this.limetype, value: this.internalValue, onChange: this.handleGuiChange }));
221
+ renderVisualMode() {
222
+ return (h("limebb-lime-query-response-format-editor", { platform: this.platform, context: this.context, limetype: this.limetype, value: this.internalValue, onChange: this.handleVisualModeChange }));
223
223
  }
224
224
  /**
225
- * Check if current value can be rendered in GUI mode
225
+ * Check if current value can be rendered in visual mode
226
226
  */
227
- checkGuiSupport() {
227
+ checkVisualModeSupport() {
228
228
  if (!this.limetypes) {
229
229
  return {
230
230
  valid: false,
231
- guiSupported: false,
231
+ visualModeSupported: false,
232
232
  validationErrors: ['Limetypes not loaded'],
233
- guiLimitations: [],
233
+ visualModeLimitations: [],
234
234
  };
235
235
  }
236
236
  // Try to parse code value if in code mode
@@ -242,16 +242,16 @@ const LimeQueryResponseFormatBuilder = /*@__PURE__*/ proxyCustomElement(class Li
242
242
  catch (error) {
243
243
  return {
244
244
  valid: false,
245
- guiSupported: false,
245
+ visualModeSupported: false,
246
246
  validationErrors: [error.message],
247
- guiLimitations: [],
247
+ visualModeLimitations: [],
248
248
  };
249
249
  }
250
250
  }
251
251
  else {
252
252
  valueToCheck = this.internalValue;
253
253
  }
254
- return validateResponseFormatOnly(valueToCheck, this.limetypes, this.limetype, this.guiModeEnabled);
254
+ return validateResponseFormatOnly(valueToCheck, this.limetypes, this.limetype, this.visualModeEnabled);
255
255
  }
256
256
  /**
257
257
  * Update code value from internal state
@@ -2,7 +2,7 @@ import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/
2
2
  import { d as defineCustomElement$2 } from './order-by-item.js';
3
3
  import { d as defineCustomElement$1 } from './property-selector.js';
4
4
 
5
- const orderByEditorCss = ":host(limebb-lime-query-order-by-editor){display:flex;flex-direction:column;gap:1rem;padding:1rem 0}.header{display:flex;justify-content:space-between;align-items:center;gap:1rem}.header h4{margin:0;font-size:1rem;font-weight:600;color:rgb(var(--contrast-1000))}.order-by-list{display:flex;flex-direction:column;gap:1rem;border:1px solid rgb(var(--contrast-300));border-radius:0.25rem;background-color:rgb(var(--contrast-50));min-height:4rem}.order-by-item{padding:0.5rem;border-radius:0.25rem;transition:background-color 0.2s}.order-by-item:hover{background-color:rgb(var(--contrast-100))}.actions{display:flex;width:100%}.summary{display:flex;justify-content:space-between;align-items:center;padding-top:0.5rem;border-top:1px solid rgb(var(--contrast-300))}.summary .count{font-size:0.875rem;font-weight:500;color:rgb(var(--contrast-900))}limel-header.is-narrow{--header-top-right-left-border-radius:0;width:calc(100% + var(--limebb-lime-query-builder-gui-mode-padding) * 2);margin-left:calc(var(--limebb-lime-query-builder-gui-mode-padding) * -1)}.empty-state{padding:0 2rem;text-align:center;color:rgb(var(--contrast-700))}";
5
+ const orderByEditorCss = ":host(limebb-lime-query-order-by-editor){display:flex;flex-direction:column;gap:1rem;padding:1rem 0}.header{display:flex;justify-content:space-between;align-items:center;gap:1rem}.header h4{margin:0;font-size:1rem;font-weight:600;color:rgb(var(--contrast-1000))}.order-by-list{display:flex;flex-direction:column;gap:1rem;border:1px solid rgb(var(--contrast-300));border-radius:0.25rem;background-color:rgb(var(--contrast-50));min-height:4rem}.order-by-item{padding:0.5rem;border-radius:0.25rem;transition:background-color 0.2s}.order-by-item:hover{background-color:rgb(var(--contrast-100))}.actions{display:flex;width:100%}.summary{display:flex;justify-content:space-between;align-items:center;padding-top:0.5rem;border-top:1px solid rgb(var(--contrast-300))}.summary .count{font-size:0.875rem;font-weight:500;color:rgb(var(--contrast-900))}limel-header.is-narrow{--header-top-right-left-border-radius:0;width:calc(100% + var(--limebb-lime-query-builder-visual-mode-padding) * 2);margin-left:calc(var(--limebb-lime-query-builder-visual-mode-padding) * -1)}.empty-state{padding:0 2rem;text-align:center;color:rgb(var(--contrast-700))}";
6
6
  const LimebbLimeQueryOrderByEditorStyle0 = orderByEditorCss;
7
7
 
8
8
  const OrderByEditor = /*@__PURE__*/ proxyCustomElement(class OrderByEditor extends HTMLElement {
@@ -88,47 +88,47 @@ function validatePlaceholder(value, activeLimetype, limetypes) {
88
88
  /**
89
89
  * Validate a response format against limetype schemas
90
90
  * Throws errors for invalid property references
91
- * Returns GUI limitations for features not yet supported in GUI
91
+ * Returns visual mode limitations for features not yet supported in visual mode
92
92
  * @param responseFormat
93
93
  * @param limetypes Record of all available limetypes
94
94
  * @param limetype The root limetype for this query
95
- * @param guiModeEnabled Whether GUI mode is enabled
96
- * @returns GUI limitations found (if any)
95
+ * @param visualModeEnabled Whether visual mode is enabled
96
+ * @returns Visual mode limitations found (if any)
97
97
  */
98
- function validateResponseFormat(responseFormat, limetypes, limetype, guiModeEnabled = true) {
99
- const guiLimitations = [];
100
- // Check for GUI-unsupported features
101
- if (guiModeEnabled && responseFormat.aggregates) {
102
- guiLimitations.push('responseFormat.aggregates is not yet supported in GUI mode');
98
+ function validateResponseFormat(responseFormat, limetypes, limetype, visualModeEnabled = true) {
99
+ const visualModeLimitations = [];
100
+ // Check for visual-mode-unsupported features
101
+ if (visualModeEnabled && responseFormat.aggregates) {
102
+ visualModeLimitations.push('responseFormat.aggregates is not yet supported in visual mode');
103
103
  }
104
104
  // Validate object properties (throws on invalid properties)
105
105
  if (responseFormat.object) {
106
- const objectLimitations = validatePropertySelection(responseFormat.object, limetypes, limetype, guiModeEnabled);
107
- guiLimitations.push(...objectLimitations);
106
+ const objectLimitations = validatePropertySelection(responseFormat.object, limetypes, limetype, visualModeEnabled);
107
+ visualModeLimitations.push(...objectLimitations);
108
108
  }
109
- return guiLimitations;
109
+ return visualModeLimitations;
110
110
  }
111
111
  /**
112
112
  * Extract non-metadata keys from a property value object
113
113
  * Filters out _alias and all # properties (which are treated as comments)
114
114
  * @param propValue Property value object
115
115
  * @param propName Property name (for error messages)
116
- * @param guiModeEnabled Whether GUI mode is enabled (affects validation)
117
- * @returns Object with non-metadata keys and any GUI limitations found
116
+ * @param visualModeEnabled Whether visual mode is enabled (affects validation)
117
+ * @returns Object with non-metadata keys and any visual mode limitations found
118
118
  */
119
- function extractNonMetadataKeys(propValue, propName, guiModeEnabled = true) {
119
+ function extractNonMetadataKeys(propValue, propName, visualModeEnabled = true) {
120
120
  const keys = Object.keys(propValue);
121
- const guiLimitations = [];
122
- // Check for # properties other than #description (GUI limitation)
123
- if (guiModeEnabled) {
121
+ const visualModeLimitations = [];
122
+ // Check for # properties other than #description (visual mode limitation)
123
+ if (visualModeEnabled) {
124
124
  const unsupportedHashProps = keys.filter((k) => k.startsWith('#') && k !== '#description');
125
125
  if (unsupportedHashProps.length > 0) {
126
- guiLimitations.push(`Property '${propName}' contains # properties not supported in GUI: ${unsupportedHashProps.join(', ')}`);
126
+ visualModeLimitations.push(`Property '${propName}' contains # properties not supported in visual mode: ${unsupportedHashProps.join(', ')}`);
127
127
  }
128
128
  }
129
129
  // Filter out _alias and all # properties (they are metadata/comments)
130
130
  const nonMetadataKeys = keys.filter((k) => k !== '_alias' && !k.startsWith('#'));
131
- return { keys: nonMetadataKeys, guiLimitations };
131
+ return { keys: nonMetadataKeys, visualModeLimitations };
132
132
  }
133
133
  /**
134
134
  * Validate a relation property value
@@ -136,10 +136,10 @@ function extractNonMetadataKeys(propValue, propName, guiModeEnabled = true) {
136
136
  * @param propValue Property value
137
137
  * @param limetypes Record of all available limetypes
138
138
  * @param property
139
- * @param guiModeEnabled Whether GUI mode is enabled (affects validation)
140
- * @returns GUI limitations found (if any)
139
+ * @param visualModeEnabled Whether visual mode is enabled (affects validation)
140
+ * @returns Visual mode limitations found (if any)
141
141
  */
142
- function validateRelationProperty(propName, propValue, limetypes, property, guiModeEnabled = true) {
142
+ function validateRelationProperty(propName, propValue, limetypes, property, visualModeEnabled = true) {
143
143
  // null is valid - just return the relation ID
144
144
  if (propValue === null) {
145
145
  return [];
@@ -148,10 +148,10 @@ function validateRelationProperty(propName, propValue, limetypes, property, guiM
148
148
  throw new TypeError(`Relation property '${propName}' must be null or an object`);
149
149
  }
150
150
  const propValueObj = propValue;
151
- const { keys: otherKeys, guiLimitations } = extractNonMetadataKeys(propValueObj, propName, guiModeEnabled);
151
+ const { keys: otherKeys, visualModeLimitations } = extractNonMetadataKeys(propValueObj, propName, visualModeEnabled);
152
152
  // If it's just {} or { _alias: "...", "#...": "..." }, that's valid
153
153
  if (otherKeys.length === 0) {
154
- return guiLimitations;
154
+ return visualModeLimitations;
155
155
  }
156
156
  // Otherwise, validate nested properties
157
157
  const relatedLimetype = property.relation.getLimetype();
@@ -163,27 +163,27 @@ function validateRelationProperty(propName, propValue, limetypes, property, guiM
163
163
  for (const key of otherKeys) {
164
164
  cleanSelection[key] = propValueObj[key];
165
165
  }
166
- const nestedLimitations = validatePropertySelection(cleanSelection, limetypes, relatedLimetype.name, guiModeEnabled);
167
- return [...guiLimitations, ...nestedLimitations];
166
+ const nestedLimitations = validatePropertySelection(cleanSelection, limetypes, relatedLimetype.name, visualModeEnabled);
167
+ return [...visualModeLimitations, ...nestedLimitations];
168
168
  }
169
169
  /**
170
170
  * Validate a non-relation property value
171
171
  * @param propName Property name
172
172
  * @param propValue Property value
173
- * @param guiModeEnabled Whether GUI mode is enabled (affects validation)
174
- * @returns GUI limitations found (if any)
173
+ * @param visualModeEnabled Whether visual mode is enabled (affects validation)
174
+ * @returns Visual mode limitations found (if any)
175
175
  */
176
- function validateNonRelationProperty(propName, propValue, guiModeEnabled = true) {
176
+ function validateNonRelationProperty(propName, propValue, visualModeEnabled = true) {
177
177
  // null is valid
178
178
  if (propValue === null) {
179
179
  return [];
180
180
  }
181
181
  // Allow empty object {} or object with only metadata (_alias, #...)
182
182
  if (typeof propValue === 'object') {
183
- const { keys: nonMetadataKeys, guiLimitations } = extractNonMetadataKeys(propValue, propName, guiModeEnabled);
183
+ const { keys: nonMetadataKeys, visualModeLimitations } = extractNonMetadataKeys(propValue, propName, visualModeEnabled);
184
184
  if (nonMetadataKeys.length === 0) {
185
185
  // {} or { _alias: "...", "#...": "..." } is valid
186
- return guiLimitations;
186
+ return visualModeLimitations;
187
187
  }
188
188
  throw new Error(`Non-relation property '${propName}' cannot have nested properties other than _alias or # properties (got: ${nonMetadataKeys.join(', ')})`);
189
189
  }
@@ -196,14 +196,14 @@ function validateNonRelationProperty(propName, propValue, guiModeEnabled = true)
196
196
  * @param normalizedProperties Normalized properties of the limetype
197
197
  * @param limetypes Record of all available limetypes
198
198
  * @param limetype Current limetype name
199
- * @param guiModeEnabled Whether GUI mode is enabled (affects validation)
200
- * @returns GUI limitations found (if any)
199
+ * @param visualModeEnabled Whether visual mode is enabled (affects validation)
200
+ * @returns Visual mode limitations found (if any)
201
201
  */
202
- function validateSinglePropertyEntry(propName, propValue, normalizedProperties, limetypes, limetype, guiModeEnabled = true) {
203
- // Allow empty string (editing state in GUI)
202
+ function validateSinglePropertyEntry(propName, propValue, normalizedProperties, limetypes, limetype, visualModeEnabled = true) {
203
+ // Allow empty string (editing state in visual mode)
204
204
  if (propName === '') {
205
- // Only validate empty property name in GUI mode
206
- if (guiModeEnabled && propValue !== null) {
205
+ // Only validate empty property name in visual mode
206
+ if (visualModeEnabled && propValue !== null) {
207
207
  throw new Error('Empty property name must have null value');
208
208
  }
209
209
  return [];
@@ -215,10 +215,10 @@ function validateSinglePropertyEntry(propName, propValue, normalizedProperties,
215
215
  }
216
216
  // Validate value based on property type
217
217
  if (property.relation) {
218
- return validateRelationProperty(propName, propValue, limetypes, property, guiModeEnabled);
218
+ return validateRelationProperty(propName, propValue, limetypes, property, visualModeEnabled);
219
219
  }
220
220
  else {
221
- return validateNonRelationProperty(propName, propValue, guiModeEnabled);
221
+ return validateNonRelationProperty(propName, propValue, visualModeEnabled);
222
222
  }
223
223
  }
224
224
  /**
@@ -227,26 +227,26 @@ function validateSinglePropertyEntry(propName, propValue, normalizedProperties,
227
227
  * @param selection
228
228
  * @param limetypes Record of all available limetypes
229
229
  * @param limetype The limetype for this level of the selection
230
- * @param guiModeEnabled Whether GUI mode is enabled (affects validation)
231
- * @returns GUI limitations found (if any)
230
+ * @param visualModeEnabled Whether visual mode is enabled (affects validation)
231
+ * @returns Visual mode limitations found (if any)
232
232
  */
233
- function validatePropertySelection(selection, limetypes, limetype, guiModeEnabled = true) {
233
+ function validatePropertySelection(selection, limetypes, limetype, visualModeEnabled = true) {
234
234
  const limetypeObj = limetypes[limetype];
235
235
  if (!limetypeObj) {
236
236
  throw new Error(`Unknown limetype: ${limetype}`);
237
237
  }
238
238
  const normalizedProperties = getNormalizedProperties(limetypeObj);
239
- const allGuiLimitations = [];
239
+ const allVisualModeLimitations = [];
240
240
  for (const [propName, propValue] of Object.entries(selection)) {
241
241
  // Skip # properties (comments/metadata that backend accepts via unknown=INCLUDE)
242
242
  // Note: _alias only appears inside property value objects, not at this level
243
243
  if (propName.startsWith('#')) {
244
244
  continue;
245
245
  }
246
- const limitations = validateSinglePropertyEntry(propName, propValue, normalizedProperties, limetypes, limetype, guiModeEnabled);
247
- allGuiLimitations.push(...limitations);
246
+ const limitations = validateSinglePropertyEntry(propName, propValue, normalizedProperties, limetypes, limetype, visualModeEnabled);
247
+ allVisualModeLimitations.push(...limitations);
248
248
  }
249
- return allGuiLimitations;
249
+ return allVisualModeLimitations;
250
250
  }
251
251
  /**
252
252
  * Validate a comparison expression (has 'key' property)
@@ -271,9 +271,9 @@ function validateComparisonExpression(filter, activeLimetype, limetypes) {
271
271
  * @param filter
272
272
  * @param activeLimetype
273
273
  * @param limetypes
274
- * @param guiModeEnabled
274
+ * @param visualModeEnabled
275
275
  */
276
- function validateGroupExpression(filter, activeLimetype, limetypes, guiModeEnabled) {
276
+ function validateGroupExpression(filter, activeLimetype, limetypes, visualModeEnabled) {
277
277
  // Validate operator
278
278
  if (filter.op !== Zt.AND &&
279
279
  filter.op !== Zt.OR &&
@@ -282,12 +282,12 @@ function validateGroupExpression(filter, activeLimetype, limetypes, guiModeEnabl
282
282
  }
283
283
  // Recursively validate children
284
284
  if (filter.op === Zt.NOT) {
285
- validateFilterPlaceholders(filter.exp, activeLimetype, limetypes, guiModeEnabled);
285
+ validateFilterPlaceholders(filter.exp, activeLimetype, limetypes, visualModeEnabled);
286
286
  }
287
287
  else if (filter.op === Zt.AND || filter.op === Zt.OR) {
288
288
  const expressions = filter.exp;
289
289
  for (const expr of expressions) {
290
- validateFilterPlaceholders(expr, activeLimetype, limetypes, guiModeEnabled);
290
+ validateFilterPlaceholders(expr, activeLimetype, limetypes, visualModeEnabled);
291
291
  }
292
292
  }
293
293
  }
@@ -296,9 +296,9 @@ function validateGroupExpression(filter, activeLimetype, limetypes, guiModeEnabl
296
296
  * @param filter Filter expression to validate
297
297
  * @param activeLimetype The limetype of the active object
298
298
  * @param limetypes Record of all available limetypes
299
- * @param guiModeEnabled Whether GUI mode is enabled (affects validation)
299
+ * @param visualModeEnabled Whether visual mode is enabled (affects validation)
300
300
  */
301
- function validateFilterPlaceholders(filter, activeLimetype, limetypes, guiModeEnabled = true) {
301
+ function validateFilterPlaceholders(filter, activeLimetype, limetypes, visualModeEnabled = true) {
302
302
  if (!filter) {
303
303
  return;
304
304
  }
@@ -307,7 +307,7 @@ function validateFilterPlaceholders(filter, activeLimetype, limetypes, guiModeEn
307
307
  return;
308
308
  }
309
309
  if ('exp' in filter) {
310
- validateGroupExpression(filter, activeLimetype, limetypes, guiModeEnabled);
310
+ validateGroupExpression(filter, activeLimetype, limetypes, visualModeEnabled);
311
311
  }
312
312
  }
313
313
  /**
@@ -315,13 +315,13 @@ function validateFilterPlaceholders(filter, activeLimetype, limetypes, guiModeEn
315
315
  * @param filter The filter expression or group to validate
316
316
  * @param activeLimetype Optional active object limetype for placeholder validation
317
317
  * @param limetypes Record of all available limetypes
318
- * @param guiModeEnabled Whether GUI mode is enabled
318
+ * @param visualModeEnabled Whether visual mode is enabled
319
319
  * @returns Array of validation error messages
320
320
  */
321
- function validateLimeQueryFilterInternal(filter, activeLimetype, limetypes, guiModeEnabled) {
321
+ function validateLimeQueryFilterInternal(filter, activeLimetype, limetypes, visualModeEnabled) {
322
322
  const errors = [];
323
323
  try {
324
- validateFilterPlaceholders(filter, activeLimetype, limetypes, guiModeEnabled);
324
+ validateFilterPlaceholders(filter, activeLimetype, limetypes, visualModeEnabled);
325
325
  }
326
326
  catch (error) {
327
327
  errors.push(`Invalid filter: ${error.message}`);
@@ -440,14 +440,14 @@ function validateOrderByPropertyPath(propertyPath, limetypes, limetype, index) {
440
440
  * @param responseFormat The response format to validate
441
441
  * @param limetypes Record of all available limetypes
442
442
  * @param limetype The limetype for this Lime Query
443
- * @param guiModeEnabled Whether GUI mode is enabled
444
- * @returns Object with validation errors and GUI limitations
443
+ * @param visualModeEnabled Whether visual mode is enabled
444
+ * @returns Object with validation errors and visual mode limitations
445
445
  */
446
- function validateLimeQueryResponseFormatInternal(responseFormat, limetypes, limetype, guiModeEnabled) {
446
+ function validateLimeQueryResponseFormatInternal(responseFormat, limetypes, limetype, visualModeEnabled) {
447
447
  const errors = [];
448
448
  const limitations = [];
449
449
  try {
450
- const formatLimitations = validateResponseFormat(responseFormat, limetypes, limetype, guiModeEnabled);
450
+ const formatLimitations = validateResponseFormat(responseFormat, limetypes, limetype, visualModeEnabled);
451
451
  limitations.push(...formatLimitations);
452
452
  }
453
453
  catch (error) {
@@ -457,25 +457,25 @@ function validateLimeQueryResponseFormatInternal(responseFormat, limetypes, lime
457
457
  }
458
458
  /**
459
459
  * Validate a Lime Query
460
- * Returns validation result with separate arrays for validity errors and GUI limitations
460
+ * Returns validation result with separate arrays for validity errors and visual mode limitations
461
461
  * @param limeQuery The Lime Query to validate
462
462
  * @param limetypes Record of all available limetypes
463
463
  * @param activeLimetype Optional active object limetype for placeholder validation
464
- * @param guiModeEnabled Whether GUI mode is enabled (affects validation)
464
+ * @param visualModeEnabled Whether visual mode is enabled (affects validation)
465
465
  * @returns LimeQueryValidationResult with validity status and any errors/limitations
466
466
  */
467
- function isLimeQuerySupported(limeQuery, limetypes, activeLimetype, guiModeEnabled = true) {
467
+ function isLimeQuerySupported(limeQuery, limetypes, activeLimetype, visualModeEnabled = true) {
468
468
  // Handle empty/undefined Lime Query
469
469
  if (!limeQuery) {
470
470
  return {
471
471
  valid: true,
472
- guiSupported: true,
472
+ visualModeSupported: true,
473
473
  validationErrors: [],
474
- guiLimitations: [],
474
+ visualModeLimitations: [],
475
475
  };
476
476
  }
477
477
  const validationErrors = [];
478
- const guiLimitations = [];
478
+ const visualModeLimitations = [];
479
479
  // Validate limetype exists
480
480
  if (limeQuery.limetype && !limetypes[limeQuery.limetype]) {
481
481
  validationErrors.push(`Unknown limetype: ${limeQuery.limetype}`);
@@ -489,26 +489,26 @@ function isLimeQuerySupported(limeQuery, limetypes, activeLimetype, guiModeEnabl
489
489
  const orderByErrors = validateOrderBy(limeQuery.orderBy, limetypes, limeQuery.limetype);
490
490
  validationErrors.push(...orderByErrors);
491
491
  }
492
- // Check for GUI-unsupported top-level properties
493
- if (guiModeEnabled && limeQuery.offset !== undefined) {
494
- guiLimitations.push('offset is not yet supported in GUI mode');
492
+ // Check for visual-mode-unsupported top-level properties
493
+ if (visualModeEnabled && limeQuery.offset !== undefined) {
494
+ visualModeLimitations.push('offset is not yet supported in visual mode');
495
495
  }
496
496
  // Validate filter
497
497
  if (limeQuery.filter) {
498
- const filterErrors = validateLimeQueryFilterInternal(limeQuery.filter, activeLimetype, limetypes, guiModeEnabled);
498
+ const filterErrors = validateLimeQueryFilterInternal(limeQuery.filter, activeLimetype, limetypes, visualModeEnabled);
499
499
  validationErrors.push(...filterErrors);
500
500
  }
501
501
  // Validate responseFormat
502
502
  if (limeQuery.responseFormat) {
503
- const { errors, limitations } = validateLimeQueryResponseFormatInternal(limeQuery.responseFormat, limetypes, limeQuery.limetype, guiModeEnabled);
503
+ const { errors, limitations } = validateLimeQueryResponseFormatInternal(limeQuery.responseFormat, limetypes, limeQuery.limetype, visualModeEnabled);
504
504
  validationErrors.push(...errors);
505
- guiLimitations.push(...limitations);
505
+ visualModeLimitations.push(...limitations);
506
506
  }
507
507
  return {
508
508
  valid: validationErrors.length === 0,
509
- guiSupported: guiLimitations.length === 0,
509
+ visualModeSupported: visualModeLimitations.length === 0,
510
510
  validationErrors,
511
- guiLimitations,
511
+ visualModeLimitations,
512
512
  };
513
513
  }
514
514
  // ============================================================================
@@ -523,32 +523,32 @@ function isLimeQuerySupported(limeQuery, limetypes, activeLimetype, guiModeEnabl
523
523
  * @param responseFormat - The response format to validate
524
524
  * @param limetypes - Record of all available limetypes
525
525
  * @param limetype - The limetype context for validation
526
- * @param guiModeEnabled - Whether GUI mode is enabled (affects validation)
527
- * @returns Validation result with errors and GUI limitations
526
+ * @param visualModeEnabled - Whether visual mode is enabled (affects validation)
527
+ * @returns Validation result with errors and visual mode limitations
528
528
  */
529
- function validateResponseFormatOnly(responseFormat, limetypes, limetype, guiModeEnabled = true) {
529
+ function validateResponseFormatOnly(responseFormat, limetypes, limetype, visualModeEnabled = true) {
530
530
  const validationErrors = [];
531
- const guiLimitations = [];
531
+ const visualModeLimitations = [];
532
532
  // Validate limetype exists
533
533
  if (!limetypes[limetype]) {
534
534
  validationErrors.push(`Unknown limetype: ${limetype}`);
535
535
  // Can't proceed with property validation if limetype is unknown
536
536
  return {
537
537
  valid: false,
538
- guiSupported: false,
538
+ visualModeSupported: false,
539
539
  validationErrors,
540
- guiLimitations,
540
+ visualModeLimitations,
541
541
  };
542
542
  }
543
543
  // Use internal validation logic
544
- const { errors, limitations } = validateLimeQueryResponseFormatInternal(responseFormat, limetypes, limetype, guiModeEnabled);
544
+ const { errors, limitations } = validateLimeQueryResponseFormatInternal(responseFormat, limetypes, limetype, visualModeEnabled);
545
545
  validationErrors.push(...errors);
546
- guiLimitations.push(...limitations);
546
+ visualModeLimitations.push(...limitations);
547
547
  return {
548
548
  valid: validationErrors.length === 0,
549
- guiSupported: guiLimitations.length === 0,
549
+ visualModeSupported: visualModeLimitations.length === 0,
550
550
  validationErrors,
551
- guiLimitations,
551
+ visualModeLimitations,
552
552
  };
553
553
  }
554
554
 
@@ -35540,6 +35540,16 @@ const icons = [
35540
35540
  tags: [
35541
35541
  ]
35542
35542
  },
35543
+ {
35544
+ id: "-lime-portal_incoming_message.svg",
35545
+ tags: [
35546
+ ]
35547
+ },
35548
+ {
35549
+ id: "-lime-portal_outgoing_message.svg",
35550
+ tags: [
35551
+ ]
35552
+ },
35543
35553
  {
35544
35554
  id: "portable_speaker.svg",
35545
35555
  tags: [