@simai-studio/view 1.3.0 → 1.4.0

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 (46) hide show
  1. package/README.md +4 -4
  2. package/dist/package-receipt.json +106 -106
  3. package/dist/set.json +1 -1
  4. package/dist/smart/view/component.json +19 -10
  5. package/dist/smart/view/component.json.gz +0 -0
  6. package/dist/smart/view/js/view.js +2 -2
  7. package/dist/smart/view/js/view.js.gz +0 -0
  8. package/dist/smart/view/js/view.min.js +1 -1
  9. package/dist/smart/view/js/view.min.js.gz +0 -0
  10. package/dist/smart/view/smart.manifest.json +14 -6
  11. package/dist/smart/view/smart.manifest.json.gz +0 -0
  12. package/dist/smart/view/static/default/open-record.html +1 -1
  13. package/dist/smart/view/static/default/open-record.html.gz +0 -0
  14. package/dist/smart/view/static/default/reference.html +1 -1
  15. package/dist/smart/view/static/default/reference.html.gz +0 -0
  16. package/dist/smart/view-flow/js/view-flow.js +388 -31
  17. package/dist/smart/view-flow/js/view-flow.js.gz +0 -0
  18. package/dist/smart/view-flow/js/view-flow.min.js +213 -201
  19. package/dist/smart/view-flow/js/view-flow.min.js.gz +0 -0
  20. package/dist/smart/view-flow/static/default/ask.html +1 -1
  21. package/dist/smart/view-flow/static/default/ask.html.gz +0 -0
  22. package/dist/smart/view-flow/static/default/reference.html +2 -2
  23. package/dist/smart/view-flow/static/default/reference.html.gz +0 -0
  24. package/dist/smart/view-properties/component.json +8 -1
  25. package/dist/smart/view-properties/component.json.gz +0 -0
  26. package/dist/smart/view-properties/css/view-properties.css +17 -4
  27. package/dist/smart/view-properties/css/view-properties.css.gz +0 -0
  28. package/dist/smart/view-properties/css/view-properties.min.css +1 -1
  29. package/dist/smart/view-properties/css/view-properties.min.css.gz +0 -0
  30. package/dist/smart/view-properties/js/view-properties.js +389 -32
  31. package/dist/smart/view-properties/js/view-properties.js.gz +0 -0
  32. package/dist/smart/view-properties/js/view-properties.min.js +167 -155
  33. package/dist/smart/view-properties/js/view-properties.min.js.gz +0 -0
  34. package/dist/smart/view-properties/smart.manifest.json +9 -2
  35. package/dist/smart/view-properties/smart.manifest.json.gz +0 -0
  36. package/dist/smart/view-properties/template/default.css +13 -2
  37. package/dist/smart/view-properties/template/default.css.gz +0 -0
  38. package/dist/smart/view-table/component.json +8 -1
  39. package/dist/smart/view-table/component.json.gz +0 -0
  40. package/dist/smart/view-table/js/view-table.js +393 -33
  41. package/dist/smart/view-table/js/view-table.js.gz +0 -0
  42. package/dist/smart/view-table/js/view-table.min.js +152 -139
  43. package/dist/smart/view-table/js/view-table.min.js.gz +0 -0
  44. package/dist/smart/view-table/smart.manifest.json +9 -2
  45. package/dist/smart/view-table/smart.manifest.json.gz +0 -0
  46. package/package.json +1 -1
@@ -672,6 +672,173 @@ function composeTime(original, text) {
672
672
 
673
673
  /***/ },
674
674
 
675
+ /***/ "ab3947ea3647"
676
+ (module, __webpack_exports__, __webpack_require__) {
677
+
678
+ __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {
679
+ __webpack_require__.r(__webpack_exports__);
680
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
681
+ /* harmony export */ formatDecimal: () => (/* binding */ formatDecimal),
682
+ /* harmony export */ formatMoney: () => (/* binding */ formatMoney),
683
+ /* harmony export */ formatPercent: () => (/* binding */ formatPercent),
684
+ /* harmony export */ fractionDigits: () => (/* binding */ fractionDigits),
685
+ /* harmony export */ moneyParts: () => (/* binding */ moneyParts),
686
+ /* harmony export */ readDecimal: () => (/* binding */ readDecimal)
687
+ /* harmony export */ });
688
+ /* harmony import */ var _core_js_format_intl_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("15b4e93ff6ed");
689
+ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_core_js_format_intl_js__WEBPACK_IMPORTED_MODULE_0__]);
690
+ var __webpack_async_dependencies_result__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
691
+ _core_js_format_intl_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_async_dependencies_result__[0];
692
+ // Decimal numbers as strings, never as floats (simai.property-view-port
693
+ // 1.18.0; Larena property types standard, notes of 2026-11-03: «Never a float
694
+ // on the wire»). What a person typed is read into a canonical decimal string,
695
+ // and a decimal, a money amount and a percent are shown in the page's language
696
+ // through Intl, which formats a string by its digits: «1500.10» never passes
697
+ // through a float on the way to «1 500,10 ₽». Pure, so the unit suite reads it
698
+ // without a browser; the View set draws the editors of money, percent and
699
+ // items with its own copy of the same rules.
700
+
701
+ const TYPED = /^([+-]?)(\d*)(?:[.,](\d*))?$/u; // Spaces a person or a formatter puts between groups of digits: the plain
702
+ // space, the no-break space and the narrow no-break space ru-RU writes, and
703
+ // the apostrophe some locales group with.
704
+
705
+ const GROUP_SPACES = /[\s  ']/gu;
706
+ /**
707
+ * What a person typed, read as a decimal: `{ok: true, value}` with the
708
+ * canonical string (an optional minus, the integer digits without leading
709
+ * zeros, the fraction digits as typed; null for nothing typed), or
710
+ * `{ok: false}` for text that is not a number. A comma and a point both
711
+ * separate the fraction. A JSON integer is read as its digits; a float is not
712
+ * a decimal and is refused rather than guessed at.
713
+ */
714
+
715
+ function readDecimal(text) {
716
+ if (text === null || typeof text === 'undefined') return {
717
+ ok: true,
718
+ value: null
719
+ };
720
+
721
+ if (typeof text === 'number') {
722
+ return Number.isSafeInteger(text) ? {
723
+ ok: true,
724
+ value: String(text)
725
+ } : {
726
+ ok: false
727
+ };
728
+ }
729
+
730
+ const plain = String(text).replace(GROUP_SPACES, '');
731
+ if (plain === '') return {
732
+ ok: true,
733
+ value: null
734
+ };
735
+ const match = TYPED.exec(plain);
736
+ if (!match) return {
737
+ ok: false
738
+ };
739
+ const [, sign, whole, fraction] = match;
740
+ if (whole === '' && (fraction ?? '') === '') return {
741
+ ok: false
742
+ };
743
+ const integer = whole.replace(/^0+(?=\d)/u, '') || '0';
744
+ const digits = fraction ?? '';
745
+ const zero = /^0*$/u.test(integer + digits);
746
+ return {
747
+ ok: true,
748
+ value: `${sign === '-' && !zero ? '-' : ''}${integer}${digits ? `.${digits}` : ''}`
749
+ };
750
+ }
751
+ /** How many digits a canonical decimal string has after its point. */
752
+
753
+ function fractionDigits(value) {
754
+ const at = String(value ?? '').indexOf('.');
755
+ return at === -1 ? 0 : String(value).length - at - 1;
756
+ } // A float a host sent anyway is shown, not refused: a cell is not the place to
757
+ // argue with a stored value. Only what reads as a decimal is formatted.
758
+
759
+ function decimalOf(value) {
760
+ if (typeof value === 'number') return Number.isFinite(value) ? String(value) : null;
761
+ const read = readDecimal(value);
762
+ return read.ok ? read.value : null;
763
+ }
764
+ /** A decimal string in the locale's digits, with every digit it has: «1 500,5». */
765
+
766
+
767
+ function formatDecimal(value, locale) {
768
+ const decimal = decimalOf(value);
769
+ if (decimal === null) return '';
770
+ const digits = Math.min(20, fractionDigits(decimal));
771
+ return (0,_core_js_format_intl_js__WEBPACK_IMPORTED_MODULE_0__.intlFormatter)('NumberFormat', locale, {
772
+ minimumFractionDigits: digits,
773
+ maximumFractionDigits: digits
774
+ }).format(decimal);
775
+ }
776
+ /** A money value as {amount, currency}; a field that fixes the currency takes a bare amount. */
777
+
778
+ function moneyParts(value, fixed) {
779
+ const currency = typeof fixed === 'string' && fixed ? fixed : null;
780
+
781
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
782
+ return {
783
+ amount: value.amount ?? null,
784
+ currency: currency || (value.currency ?? null)
785
+ };
786
+ }
787
+
788
+ if (value === null || typeof value === 'undefined' || value === '') return {
789
+ amount: null,
790
+ currency
791
+ };
792
+ return {
793
+ amount: value,
794
+ currency
795
+ };
796
+ }
797
+ /**
798
+ * An amount with its currency, as a person reads it: «1 500,50 ₽», «$1,500.50».
799
+ * The digits after the point are at least the currency's minor units (ISO
800
+ * 4217) and every digit the amount has. Without a currency, the amount alone.
801
+ */
802
+
803
+ function formatMoney(value, field = {}, locale = 'en') {
804
+ const {
805
+ amount,
806
+ currency
807
+ } = moneyParts(value, field.currency);
808
+ const decimal = decimalOf(amount);
809
+ if (decimal === null) return '';
810
+ if (!currency) return formatDecimal(decimal, locale);
811
+ const minor = (0,_core_js_format_intl_js__WEBPACK_IMPORTED_MODULE_0__.intlFormatter)('NumberFormat', locale, {
812
+ style: 'currency',
813
+ currency
814
+ }).resolvedOptions().maximumFractionDigits ?? 2;
815
+ const digits = Math.min(20, Math.max(minor, fractionDigits(decimal)));
816
+ return (0,_core_js_format_intl_js__WEBPACK_IMPORTED_MODULE_0__.intlFormatter)('NumberFormat', locale, {
817
+ style: 'currency',
818
+ currency,
819
+ currencyDisplay: 'narrowSymbol',
820
+ minimumFractionDigits: digits,
821
+ maximumFractionDigits: digits
822
+ }).format(decimal);
823
+ }
824
+ /** A percent, «12,5 %» or «12.5%»: the value is the percent ("20" is 20 %), never the share. */
825
+
826
+ function formatPercent(value, locale = 'en') {
827
+ const decimal = decimalOf(value);
828
+ if (decimal === null) return '';
829
+ const digits = Math.min(20, fractionDigits(decimal));
830
+ return (0,_core_js_format_intl_js__WEBPACK_IMPORTED_MODULE_0__.intlFormatter)('NumberFormat', locale, {
831
+ style: 'unit',
832
+ unit: 'percent',
833
+ minimumFractionDigits: digits,
834
+ maximumFractionDigits: digits
835
+ }).format(decimal);
836
+ }
837
+ __webpack_async_result__();
838
+ } catch(e) { __webpack_async_result__(e); } });
839
+
840
+ /***/ },
841
+
675
842
  /***/ "01ae054f01b4"
676
843
  (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
677
844
 
@@ -738,8 +905,9 @@ __webpack_require__.r(__webpack_exports__);
738
905
  /* harmony import */ var _datetime_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("9ce1a42b2a85");
739
906
  /* harmony import */ var _mask_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("dd6973f77245");
740
907
  /* harmony import */ var _html_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("01ae054f01b4");
741
- var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([lit__WEBPACK_IMPORTED_MODULE_0__, lit_directives_unsafe_html_js__WEBPACK_IMPORTED_MODULE_1__, _core_js_page_language__WEBPACK_IMPORTED_MODULE_3__]);
742
- ([lit__WEBPACK_IMPORTED_MODULE_0__, lit_directives_unsafe_html_js__WEBPACK_IMPORTED_MODULE_1__, _core_js_page_language__WEBPACK_IMPORTED_MODULE_3__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
908
+ /* harmony import */ var _decimal_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("ab3947ea3647");
909
+ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([lit__WEBPACK_IMPORTED_MODULE_0__, lit_directives_unsafe_html_js__WEBPACK_IMPORTED_MODULE_1__, _core_js_page_language__WEBPACK_IMPORTED_MODULE_3__, _decimal_js__WEBPACK_IMPORTED_MODULE_8__]);
910
+ ([lit__WEBPACK_IMPORTED_MODULE_0__, lit_directives_unsafe_html_js__WEBPACK_IMPORTED_MODULE_1__, _core_js_page_language__WEBPACK_IMPORTED_MODULE_3__, _decimal_js__WEBPACK_IMPORTED_MODULE_8__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);
743
911
  /* harmony import */ var lit__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lit__WEBPACK_IMPORTED_MODULE_0__);
744
912
  /* harmony import */ var lit_directives_unsafe_html_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lit_directives_unsafe_html_js__WEBPACK_IMPORTED_MODULE_1__);
745
913
  /* harmony import */ var _core_js_page_language__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_core_js_page_language__WEBPACK_IMPORTED_MODULE_3__);
@@ -750,6 +918,7 @@ var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([lit_
750
918
 
751
919
 
752
920
 
921
+
753
922
  // The Framework's field renderers, addressed by a property type and a template
754
923
  // rather than by a control name.
755
924
  //
@@ -1109,7 +1278,13 @@ const FILTER_RENDERERS = {
1109
1278
  relation: renderEntityMultiSelectFilterControl,
1110
1279
  lookup: renderEntityMultiSelectFilterControl,
1111
1280
  file: renderFileFilterControl,
1112
- color: renderColorFilterControl
1281
+ color: renderColorFilterControl,
1282
+ // The types a component set draws (property-view port 1.18.0): a money
1283
+ // amount and a percent are filtered as numbers (the host compares the
1284
+ // amount, as a decimal), and an items field by its number of rows.
1285
+ money: renderNumberFilterControl,
1286
+ percent: renderNumberFilterControl,
1287
+ items: renderNumberFilterControl
1113
1288
  }; // What a field asks to be filtered by: its own declared control if it has one,
1114
1289
  // otherwise its property type, otherwise text.
1115
1290
 
@@ -1363,7 +1538,10 @@ const CELL_RENDERERS = {
1363
1538
  record: renderReferenceCell,
1364
1539
  relation: renderReferenceCell,
1365
1540
  lookup: renderLookupCell,
1366
- html: renderHtmlCell
1541
+ html: renderHtmlCell,
1542
+ money: renderMoneyCell,
1543
+ percent: renderPercentCell,
1544
+ items: renderItemsCell
1367
1545
  }; // A consumer found this on their stand: the words were written into the set, so
1368
1546
  // an English admin saw «Да». The set must not decide what a value is called in
1369
1547
  // anyone's language. They come from the field, which is where the rest of the
@@ -1423,6 +1601,41 @@ function renderChoiceCell(field, value) {
1423
1601
  function renderHostFormattedCell(field, value, host) {
1424
1602
  const formatted = host?.formatFieldValue?.(field, value);
1425
1603
  return typeof formatted === 'string' && formatted !== '' ? formatted : null;
1604
+ } // The types a component set draws (property-view port 1.18.0) have their
1605
+ // cells here, so a table shows them wherever the set's editors live. A host's
1606
+ // formatFieldValue wins, as for a date; otherwise the page's language:
1607
+ //
1608
+ // money {amount, currency} or a bare amount under a fixed `currency`;
1609
+ // «1 500,50 ₽», every digit the amount has and at least the
1610
+ // currency's minor units, formatted from the digits, never a float
1611
+ // percent a decimal string of the percent, «12,5 %»
1612
+ // items a list of rows; how many, «3 строки»
1613
+ //
1614
+ // A value that is not one of these shapes falls through to the plain value.
1615
+
1616
+
1617
+ function renderMoneyCell(field, value, host) {
1618
+ const formatted = renderHostFormattedCell(field, value, host);
1619
+ if (formatted !== null) return formatted;
1620
+ const text = (0,_decimal_js__WEBPACK_IMPORTED_MODULE_8__.formatMoney)(scalarValue(value), field, (0,_core_js_page_language__WEBPACK_IMPORTED_MODULE_3__.pageLocale)(host ?? null));
1621
+ return text || null;
1622
+ }
1623
+
1624
+ function renderPercentCell(field, value, host) {
1625
+ const formatted = renderHostFormattedCell(field, value, host);
1626
+ if (formatted !== null) return formatted;
1627
+ const text = (0,_decimal_js__WEBPACK_IMPORTED_MODULE_8__.formatPercent)(scalarValue(value), (0,_core_js_page_language__WEBPACK_IMPORTED_MODULE_3__.pageLocale)(host ?? null));
1628
+ return text || null;
1629
+ }
1630
+
1631
+ function renderItemsCell(field, value, host) {
1632
+ const formatted = renderHostFormattedCell(field, value, host);
1633
+ if (formatted !== null) return formatted;
1634
+ if (!Array.isArray(value)) return null;
1635
+ return value.length ? (0,_core_js_page_language__WEBPACK_IMPORTED_MODULE_3__.pageWord)(SET_TEXT, 'rowCount', host ?? null, {
1636
+ component: SET_NAME,
1637
+ count: value.length
1638
+ }) : '';
1426
1639
  }
1427
1640
 
1428
1641
  function renderNumericCell(field, value, host) {
@@ -1597,10 +1810,14 @@ function renderPhoneEdit(field, value, host) {
1597
1810
  // Clearing a set password is not offered: an empty field means «keep».
1598
1811
  //
1599
1812
  // The typed text lives in the input and nowhere else: no `value` attribute on
1600
- // sf-input, no data-*, no text node, no log. «Показать» is an icon button that
1601
- // switches the input's type and says so with its pressed setting (aria-pressed); it changes the DOM
1602
- // directly, so a host's re-render (its attributes are static in the template)
1603
- // leaves the person's choice as it is.
1813
+ // sf-input, no data-*, no text node, no log. «Показать пароль» is an icon button
1814
+ // that switches the input's type and says what it will do next by its name and
1815
+ // icon: «Показать пароль» (visibility) while hidden, «Скрыть пароль»
1816
+ // (visibility_off) while shown. A toggle whose name changes is not a pressed
1817
+ // toggle (rule C12, point 3): it carries no aria-pressed and no pressed look,
1818
+ // or a reader would hear «Скрыть пароль, нажата». It changes the DOM directly,
1819
+ // so a host's re-render (its attributes are static in the template) leaves the
1820
+ // person's choice as it is.
1604
1821
 
1605
1822
 
1606
1823
  function isPasswordField(field) {
@@ -1616,13 +1833,13 @@ function passwordState(host, value) {
1616
1833
  return setText(host, passwordIsSet(value) ? 'passwordSet' : 'passwordUnset');
1617
1834
  }
1618
1835
 
1619
- function togglePasswordShown(event) {
1836
+ function togglePasswordShown(event, host) {
1620
1837
  const button = event.currentTarget;
1621
1838
  const input = button?.closest?.('.sf-field-password')?.querySelector?.('sf-input');
1622
1839
  if (!input) return;
1623
- const shown = button.getAttribute('pressed') === 'false';
1840
+ const shown = input.getAttribute('input-type') !== 'text';
1624
1841
  input.setAttribute('input-type', shown ? 'text' : 'password');
1625
- button.setAttribute('pressed', shown ? '' : 'false');
1842
+ button.setAttribute('aria-label', setText(host, shown ? 'hidePassword' : 'showPassword'));
1626
1843
  button.setAttribute('icon', shown ? 'visibility_off' : 'visibility');
1627
1844
  }
1628
1845
 
@@ -1658,9 +1875,8 @@ function renderPasswordEdit(field, value, host) {
1658
1875
  appearance="link"
1659
1876
  scheme="on-surface"
1660
1877
  icon="visibility"
1661
- pressed="false"
1662
1878
  aria-label=${setText(host, 'showPassword')}
1663
- @click=${togglePasswordShown}
1879
+ @click=${event => togglePasswordShown(event, host)}
1664
1880
  ></sf-button-icon>
1665
1881
  </span>
1666
1882
  `;
@@ -1923,29 +2139,98 @@ function renderStepperEdit(field, value, host) {
1923
2139
  @change=${write}
1924
2140
  ></sf-input-quantity>
1925
2141
  `;
2142
+ } // A number is a decimal (property-view port 1.18.0: «never a float on the
2143
+ // wire»). What is typed is read with a comma or a point and spaces between
2144
+ // groups. A number field whose value arrives as a string, or that declares
2145
+ // `precision`, is a decimal-string field: it writes the canonical decimal
2146
+ // string («1500.50»), never a float, and refuses more digits after the point
2147
+ // than `precision` allows. Any other number field writes a number, as before;
2148
+ // an integer field is unchanged. Text that is not a number is reported as a
2149
+ // masked string's incomplete entry is: through setFieldError, which holds the
2150
+ // save, and under the field once the person leaves it.
2151
+
2152
+
2153
+ function isDecimalStringField(field, value) {
2154
+ return (field.propertyType || field.type) === 'number' && (typeof value === 'string' || Number.isInteger(field.precision));
1926
2155
  }
1927
2156
 
1928
2157
  function renderNumberEdit(field, value, host) {
1929
2158
  if (isStepperField(field)) return renderStepperEdit(field, value, host);
1930
2159
  const decimal = (field.propertyType || field.type) === 'number';
1931
2160
  value = scalarValue(value);
2161
+
2162
+ if (!decimal) {
2163
+ return (0,lit__WEBPACK_IMPORTED_MODULE_0__.html)`
2164
+ <sf-input
2165
+ size=${EDIT_SIZE}
2166
+ appearance="bordered"
2167
+ name=${fieldName(field)}
2168
+ value=${value ?? ''}
2169
+ inputmode="numeric"
2170
+ ?required=${Boolean(field.required)}
2171
+ aria-label=${field.label || field.key || ''}
2172
+ @input=${event => {
2173
+ const next = event.target?.value ?? '';
2174
+ host.setFieldValue(field, next === '' ? null : Number(next));
2175
+ }}
2176
+ @change=${event => {
2177
+ const next = event.target?.value ?? '';
2178
+ host.setFieldValue(field, next === '' ? null : Number(next));
2179
+ }}
2180
+ ></sf-input>
2181
+ `;
2182
+ }
2183
+
2184
+ const asString = isDecimalStringField(field, value);
2185
+
2186
+ const write = (event, left) => {
2187
+ const input = event.currentTarget ?? event.target;
2188
+ const text = String(input?.value ?? '');
2189
+ const read = (0,_decimal_js__WEBPACK_IMPORTED_MODULE_8__.readDecimal)(text);
2190
+ let message = null;
2191
+ if (!read.ok) message = setText(host, 'notNumber');else if (read.value !== null && Number.isInteger(field.precision) && (0,_decimal_js__WEBPACK_IMPORTED_MODULE_8__.fractionDigits)(read.value) > field.precision) {
2192
+ message = (0,_core_js_page_language__WEBPACK_IMPORTED_MODULE_3__.pageWord)(SET_TEXT, 'precisionMax', host ?? null, {
2193
+ component: SET_NAME,
2194
+ count: field.precision
2195
+ });
2196
+ }
2197
+
2198
+ if (message) {
2199
+ if (left && input) {
2200
+ input.setAttribute('error-message', message);
2201
+ input.toggleAttribute('invalid', true);
2202
+ }
2203
+
2204
+ if (typeof host.setFieldError === 'function') {
2205
+ host.setFieldError(field, message);
2206
+ host.setFieldValue(field, text);
2207
+ } else {
2208
+ host.setFieldValue(field, undefined);
2209
+ }
2210
+
2211
+ return;
2212
+ }
2213
+
2214
+ if (input?.hasAttribute?.('invalid')) {
2215
+ input.toggleAttribute('invalid', false);
2216
+ input.removeAttribute('error-message');
2217
+ }
2218
+
2219
+ host.setFieldError?.(field, null);
2220
+ if (read.value === null) host.setFieldValue(field, null);else host.setFieldValue(field, asString ? read.value : Number(read.value));
2221
+ };
2222
+
1932
2223
  return (0,lit__WEBPACK_IMPORTED_MODULE_0__.html)`
1933
2224
  <sf-input
1934
2225
  size=${EDIT_SIZE}
1935
2226
  appearance="bordered"
1936
2227
  name=${fieldName(field)}
1937
2228
  value=${value ?? ''}
1938
- inputmode=${decimal ? 'decimal' : 'numeric'}
2229
+ inputmode="decimal"
1939
2230
  ?required=${Boolean(field.required)}
1940
2231
  aria-label=${field.label || field.key || ''}
1941
- @input=${event => {
1942
- const next = event.target?.value ?? '';
1943
- host.setFieldValue(field, next === '' ? null : Number(next));
1944
- }}
1945
- @change=${event => {
1946
- const next = event.target?.value ?? '';
1947
- host.setFieldValue(field, next === '' ? null : Number(next));
1948
- }}
2232
+ @input=${event => write(event, false)}
2233
+ @change=${event => write(event, true)}
1949
2234
  ></sf-input>
1950
2235
  `;
1951
2236
  } // A date control has no clock. `sf-input-date` declares a format and a date,
@@ -2388,7 +2673,14 @@ const SET_TEXT = {
2388
2673
  passwordUnset: 'Not set',
2389
2674
  passwordKeep: 'Set; type a new one to replace it',
2390
2675
  showPassword: 'Show password',
2391
- maskIncomplete: 'Complete the field'
2676
+ hidePassword: 'Hide password',
2677
+ maskIncomplete: 'Complete the field',
2678
+ notNumber: 'Enter a number',
2679
+ precisionMax: 'At most {n} digits after the point',
2680
+ rowCount: {
2681
+ one: '{n} row',
2682
+ other: '{n} rows'
2683
+ }
2392
2684
  },
2393
2685
  ru: {
2394
2686
  yes: 'Да',
@@ -2416,7 +2708,16 @@ const SET_TEXT = {
2416
2708
  passwordUnset: 'Не задан',
2417
2709
  passwordKeep: 'Задан; введите новый, чтобы заменить',
2418
2710
  showPassword: 'Показать пароль',
2419
- maskIncomplete: 'Заполните поле полностью'
2711
+ hidePassword: 'Скрыть пароль',
2712
+ maskIncomplete: 'Заполните поле полностью',
2713
+ notNumber: 'Введите число',
2714
+ precisionMax: 'Не больше {n} знаков после запятой',
2715
+ rowCount: {
2716
+ one: '{n} строка',
2717
+ few: '{n} строки',
2718
+ many: '{n} строк',
2719
+ other: '{n} строки'
2720
+ }
2420
2721
  }
2421
2722
  }; // The host's word wins, as it always did; the set's own fallback now follows
2422
2723
  // the page's language instead of being Russian whatever the page is. `host` is
@@ -2933,10 +3234,13 @@ function renderChoiceView(field, value) {
2933
3234
  const options = field.options || field.filter?.options || field.constraints?.options;
2934
3235
  const option = Array.isArray(options) ? options.find(item => String(item?.value) === String(value)) : null;
2935
3236
  if (!option) return lit__WEBPACK_IMPORTED_MODULE_0__.nothing;
2936
- const badge = (0,_helpers_option_badge_js__WEBPACK_IMPORTED_MODULE_2__.optionBadgeProps)(option);
3237
+ const badge = (0,_helpers_option_badge_js__WEBPACK_IMPORTED_MODULE_2__.optionBadgeProps)(option); // A table cell is a dense place: the badge keeps the tight side room
3238
+ // (sf-badge tight), as it had before sf-badge 1.3.0 widened the default.
3239
+
2937
3240
  return (0,lit__WEBPACK_IMPORTED_MODULE_0__.html)`
2938
3241
  <sf-badge
2939
3242
  line=${VIEW_LINE}
3243
+ tight
2940
3244
  appearance=${field.badgeAppearance ?? CELL_BADGE_APPEARANCE}
2941
3245
  scheme=${badge.scheme}
2942
3246
  style=${badge.rootStyle || lit__WEBPACK_IMPORTED_MODULE_0__.nothing}
@@ -3262,12 +3566,13 @@ __webpack_require__.r(__webpack_exports__);
3262
3566
  /* harmony export */ modesOf: () => (/* binding */ modesOf)
3263
3567
  /* harmony export */ });
3264
3568
  // The registry of universal properties (owner, 2026-10-15): every property
3265
- // type the Framework renders, its variants and the parameters a field of it
3266
- // reads -- one list a host (Larena's fields and settings), the property
3267
- // workbench and the documentation read, instead of each learning the types
3268
- // from the renderers' source. Which modes a type has is not written here: it
3269
- // is read from the renderer maps themselves (modesOf), so the registry cannot
3270
- // claim a mode the set does not draw. A contract keeps the two the same.
3569
+ // type the Framework renders, or a component set renders beside it (`set`),
3570
+ // its variants and the parameters a field of it reads -- one list a host
3571
+ // (Larena's fields and settings), the property workbench and the documentation
3572
+ // read, instead of each learning the types from the renderers' source. Which
3573
+ // modes a type has is not written here: it is read from the renderer maps
3574
+ // themselves (modesOf), so the registry cannot claim a mode the set does not
3575
+ // draw. A contract keeps the two the same.
3271
3576
  //
3272
3577
  // `params` are the field keys the type's renderers read -- each one, and no
3273
3578
  // other (the probe field-renderer-params calls them with a field that records
@@ -3522,6 +3827,58 @@ const PROPERTY_TYPES = Object.freeze([{
3522
3827
  },
3523
3828
  variants: [],
3524
3829
  params: ['language', 'required', 'readonly']
3830
+ }, // The types a component set draws (property-view port 1.18.0; Larena
3831
+ // property types standard, notes of 2026-11-03): `set` names the set whose
3832
+ // components show and edit them -- the View set's sf-view-properties and
3833
+ // sf-view-flow -- and the Framework draws their table cells and filters
3834
+ // (money and percent as numbers, items by its number of rows). `params` are
3835
+ // the keys the type reads, in the set's renderers and in these. Every
3836
+ // number is a decimal string, never a float.
3837
+ {
3838
+ type: 'money',
3839
+ label: {
3840
+ ru: 'Деньги',
3841
+ en: 'Money'
3842
+ },
3843
+ set: 'view',
3844
+ variants: [],
3845
+ params: ['currency', 'min', 'max', 'required', 'readonly']
3846
+ }, {
3847
+ type: 'percent',
3848
+ label: {
3849
+ ru: 'Процент',
3850
+ en: 'Percent'
3851
+ },
3852
+ set: 'view',
3853
+ variants: [],
3854
+ params: ['min', 'max', 'required', 'readonly']
3855
+ }, {
3856
+ type: 'items',
3857
+ label: {
3858
+ ru: 'Строки',
3859
+ en: 'Rows'
3860
+ },
3861
+ set: 'view',
3862
+ variants: [],
3863
+ params: ['columns', 'minRows', 'maxRows', 'required', 'readonly']
3864
+ }, {
3865
+ type: 'compound',
3866
+ label: {
3867
+ ru: 'Составное',
3868
+ en: 'Compound'
3869
+ },
3870
+ set: 'view',
3871
+ variants: [],
3872
+ params: ['parts', 'required', 'readonly']
3873
+ }, {
3874
+ type: 'ru.requisites',
3875
+ label: {
3876
+ ru: 'Реквизиты',
3877
+ en: 'Requisites (Russia)'
3878
+ },
3879
+ set: 'view',
3880
+ variants: [],
3881
+ params: ['parts', 'required', 'readonly']
3525
3882
  }]); // The modes a type has, read from the renderer maps: view and edit (a record),
3526
3883
  // cell (a table) and filter -- `own` when the set has a filter control for the
3527
3884
  // type, `text` when a filter falls back to a text search.
@@ -8159,7 +8516,9 @@ class SfTable extends TableElement {
8159
8516
  renderFilterOption(field = {}, option = {}, selected = new Set()) {
8160
8517
  const value = option.value ?? option.id ?? option.key ?? option.label ?? option.title;
8161
8518
  const label = option.label || option.title || String(value || '');
8162
- const badge = field.filter?.optionRenderer === 'badge' ? (0,_helpers_option_badge_js__WEBPACK_IMPORTED_MODULE_8__.optionBadgeProps)(option) : null;
8519
+ const badge = field.filter?.optionRenderer === 'badge' ? (0,_helpers_option_badge_js__WEBPACK_IMPORTED_MODULE_8__.optionBadgeProps)(option) : null; // An option list is a dense place: its badge keeps the size's own narrow
8520
+ // side room (sf-badge tight, sf-badge 1.3.0), as a cell's choice badge does.
8521
+
8163
8522
  return (0,lit__WEBPACK_IMPORTED_MODULE_12__.html)`
8164
8523
  <div
8165
8524
  ${(0,lit_directives_ref_js__WEBPACK_IMPORTED_MODULE_13__.ref)(this.getItemRef(option.label))}
@@ -8168,6 +8527,7 @@ class SfTable extends TableElement {
8168
8527
  ${badge ? (0,lit__WEBPACK_IMPORTED_MODULE_12__.html)`
8169
8528
  <sf-badge
8170
8529
  appearance="tonal"
8530
+ tight
8171
8531
  scheme=${badge.scheme}
8172
8532
  root-style=${badge.rootStyle || lit__WEBPACK_IMPORTED_MODULE_12__.nothing}
8173
8533
  icon=${option.icon || lit__WEBPACK_IMPORTED_MODULE_12__.nothing}
@@ -13975,7 +14335,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"$comment":"Dated aliases of sf-view-
13975
14335
  /***/ "c1f17ed5a348"
13976
14336
  (module) {
13977
14337
 
13978
- module.exports = /*#__PURE__*/JSON.parse('{"id":"smart.view-table","tag":"sf-view-table","version":"1.15.0","kind":"leaf","settings":{"selectable":{"type":"boolean","default":true},"settings":{"type":"boolean","default":true},"actions":{"type":"boolean","default":true},"row-actions":{"type":"boolean","default":true},"creatable":{"type":"boolean","default":true},"filter-templates":{"type":"boolean","default":true},"settings-menu":{"type":"boolean","default":true},"pagin":{"type":"boolean","default":false},"filter-text":{"type":"string","default-from":"runtime.filter-text"},"clear-text":{"type":"string","default-from":"runtime.clear-text"},"search-placeholder":{"type":"string","default-from":"runtime.search-placeholder"},"create-text":{"type":"string","default-from":"runtime.create-text"},"pagination-total":{"type":"number","default":10,"integer":true,"min":0},"pagination-page-size":{"type":"number","default":10,"integer":true,"min":1,"max":100},"page-sizes":{"type":"string","default":"10,20,30,40"},"context-menu-columns":{"type":"number","default":1,"integer":true,"min":1,"max":4},"remember-widths":{"type":"boolean","default":false},"table-settings-key":{"type":"string","default":""},"data-state":{"type":"enum","values":["auto","loading","ready","populated","empty","error"],"default":"auto","x-alias":{"populated":"ready"}},"loading-text":{"type":"string","default-from":"runtime.loading-text"},"empty-text":{"type":"string","default-from":"runtime.empty-text"},"empty-description":{"type":"string"},"error-text":{"type":"string","default-from":"runtime.error-text"},"retry-text":{"type":"string","default-from":"runtime.retry-text"},"toolbar":{"type":"boolean","default":true},"pin-column-label":{"type":"string","default-from":"runtime.pin-column-label"},"unpin-column-label":{"type":"string","default-from":"runtime.unpin-column-label"},"column-move-label":{"type":"string","default-from":"runtime.column-move-label"},"column-search-placeholder":{"type":"string","default-from":"runtime.column-search-placeholder"},"column-search-empty-text":{"type":"string","default-from":"runtime.column-search-empty-text"},"vertical-scroll":{"type":"enum","values":["self","page"],"default":"self"},"filter-apply-text":{"type":"string","default-from":"runtime.filter-apply-text"},"layout":{"type":"enum","values":["auto","table","list"],"default":"table"},"list-below":{"type":"number","default":600},"list-fields":{"type":"number","default":3},"size":{"type":"enum","values":["1/2","1"],"default":"1"},"preferences-key":{"type":"string","default":""},"row-actions-visible":{"type":"enum","values":["hover","always"],"default":"hover"},"drag-rows":{"type":"boolean","default":false},"row-reorder":{"type":"boolean","default":false},"inline-edit":{"type":"boolean","default":false},"active-filter-fields":{"type":"list","entries":{"key":"id"}},"bulk-actions":{"type":"list"},"columns":{"type":"list","of":{"key":"string","label":"string"}},"create-items":{"type":"list"},"filter-fields":{"type":"list"},"rows":{"type":"list","entries":{"key":"id","changes":"revision"},"of":{"id":"id","revision":{"type":"string","optional":true}}},"table-data":{"type":"object"},"table-settings":{"type":"object"},"templates":{"type":"list"},"toolbar-actions":{"type":"list"},"sort":{"type":"list","of":{"key":"string","direction":{"type":"enum","values":["asc","desc"]}},"controlled":true},"current":{"type":"string","default":""}},"values":{"selected":{"type":"id","optional":true},"selection":{"type":"list","default":[]}},"events":{"select":{"carries":{"ids":"list"}},"apply":{"carries":{"action":"string","scope":{"type":"enum","values":["entry","selection","filter"]},"ids":"list","revisions":{"type":"object","optional":true}}},"save":{"carries":{"kind":{"type":"enum","values":["columns"]},"reason":"string","column-settings":{"type":"object"},"table-settings-key":{"type":"string"}}},"column-settings-reset":{"carries":{"target":{"type":"enum","values":["personal"]},"table-settings-key":{"type":"string","nullable":true}},"own-verb":true},"create":{"carries":{"item":{"type":"string","nullable":true,"optional":true}}},"filter-change":{"carries":{"template-key":{"type":"string"},"template-label":{"type":"string"},"values":{"type":"object"},"tags":{"type":"object"}},"own-verb":true},"query":{"carries":{"reason":"string","context":"object","sequence":{"type":"number","integer":true}}},"refresh":{"carries":{}},"search-change":{"carries":{"search":"string"},"own-verb":true},"sort-change":{"carries":{"key":{"type":"string","schema":{"minLength":1}},"direction":{"type":"enum","values":["asc","desc",null],"nullable":true}},"own-verb":true},"template-delete":{"carries":{"key":{"type":"string","schema":{"minLength":1}}},"own-verb":true},"template-save":{"carries":{},"own-verb":true},"template-select":{"carries":{"key":{"type":"string","schema":{"minLength":1}}},"own-verb":true},"toolbar-action":{"carries":{"action":"string","href":{"type":"string","nullable":true,"optional":true}},"cancelable":true,"own-verb":true},"reference-open":{"carries":{"field":"string","value":"object","href":"string"},"cancelable":true,"own-verb":true},"expand":{"carries":{"id":"id","expanded":{"type":"boolean","optional":true}}},"load-more":{"carries":{"direction":{"type":"enum","values":["after"]},"parent":{"type":"id","nullable":true},"cursor":{"type":"string","nullable":true}}},"rows-drag":{"carries":{"ids":{"type":"list","schema":{"items":{"type":"string"},"minItems":1}},"source":{"type":"string","nullable":true}},"own-verb":true},"move":{"carries":{"ids":"list","before":{"type":"id","nullable":true},"order":"list"}},"cell-set":{"carries":{"id":"object","key":"string","value":"object","revision":"object"},"own-verb":true},"view-change":{"carries":{"view":"object","everywhere":"boolean"},"own-verb":true},"window":{"carries":{"first":{"type":"number","integer":true},"last":{"type":"number","integer":true}},"own-verb":true}},"actions":{"add-rows":{"with":{"rows":"list"}},"apply-query-result":{"with":{"sequence":{"type":"number","integer":true,"schema":{"minimum":1}},"rows":"list"}},"clear-selection":{},"request-action-intent":{"with":{"action-id":{"type":"string","schema":{"minLength":1}},"record-ids":{"type":"list","schema":{"items":{"type":["string","integer"],"minLength":1},"minItems":1}}},"emits":"apply"},"request-create-intent":{"with":{"item-id":{"type":"string","optional":true,"nullable":true}},"emits":"create"},"request-retry":{"emits":"refresh"},"set-sort":{"with":{"key":{"type":"string","nullable":true},"direction":{"type":"enum","values":["asc","desc"],"nullable":true}}},"toggle-tree-row":{"with":{"row":"object"},"emits":"expand"},"request-tree-more":{"with":{"row":"object"},"emits":"load-more"},"focus-row":{"with":{"id":"id"}}},"port":{"id":"simai.dataview-port","version":"1.0.0","contract":"src/core/contracts/ports/simai.dataview-port/1.0.0/port.json"},"presentation":{"skeleton":{"late":["rows"]}},"host-states":{"data-sf-view-stripes":"boolean","data-sf-page-scroll":"boolean"},"css-variables":{"--sf-table-row-block-size-1/2":{"type":"length","state":"default"},"--sf-table-row-block-size-1":{"type":"length","state":"default"},"--sf-table-row-2-lines-block-size-1/2":{"type":"length","state":"default"},"--sf-table-row-2-lines-block-size-1":{"type":"length","state":"default"},"--sf-table-head-block-size-1/2":{"type":"length","state":"default"},"--sf-table-head-block-size-1":{"type":"length","state":"default"},"--sf-table-toolbar-block-size-1/2":{"type":"length","state":"default"},"--sf-table-toolbar-block-size-1":{"type":"length","state":"default"},"--sf-table-toolbar-gap":{"type":"length","state":"default"},"--sf-table-head--background-color":{"type":"color","state":"default"},"--sf-table-row--background-color":{"type":"color","state":"default"},"--sf-table--cell-spacing":{"type":"length","state":"default"},"--sf-table-cell--line-clamp":{"type":"number","state":"default"},"--sf-table-context-menu--z-index":{"type":"number","state":"open"},"--sf-table-context-menu--max-width":{"type":"length","state":"open"}}}');
14338
+ module.exports = /*#__PURE__*/JSON.parse('{"id":"smart.view-table","tag":"sf-view-table","version":"1.15.1","kind":"leaf","settings":{"selectable":{"type":"boolean","default":true},"settings":{"type":"boolean","default":true},"actions":{"type":"boolean","default":true},"row-actions":{"type":"boolean","default":true},"creatable":{"type":"boolean","default":true},"filter-templates":{"type":"boolean","default":true},"settings-menu":{"type":"boolean","default":true},"pagin":{"type":"boolean","default":false},"filter-text":{"type":"string","default-from":"runtime.filter-text"},"clear-text":{"type":"string","default-from":"runtime.clear-text"},"search-placeholder":{"type":"string","default-from":"runtime.search-placeholder"},"create-text":{"type":"string","default-from":"runtime.create-text"},"pagination-total":{"type":"number","default":10,"integer":true,"min":0},"pagination-page-size":{"type":"number","default":10,"integer":true,"min":1,"max":100},"page-sizes":{"type":"string","default":"10,20,30,40"},"context-menu-columns":{"type":"number","default":1,"integer":true,"min":1,"max":4},"remember-widths":{"type":"boolean","default":false},"table-settings-key":{"type":"string","default":""},"data-state":{"type":"enum","values":["auto","loading","ready","populated","empty","error"],"default":"auto","x-alias":{"populated":"ready"}},"loading-text":{"type":"string","default-from":"runtime.loading-text"},"empty-text":{"type":"string","default-from":"runtime.empty-text"},"empty-description":{"type":"string"},"error-text":{"type":"string","default-from":"runtime.error-text"},"retry-text":{"type":"string","default-from":"runtime.retry-text"},"toolbar":{"type":"boolean","default":true},"pin-column-label":{"type":"string","default-from":"runtime.pin-column-label"},"unpin-column-label":{"type":"string","default-from":"runtime.unpin-column-label"},"column-move-label":{"type":"string","default-from":"runtime.column-move-label"},"column-search-placeholder":{"type":"string","default-from":"runtime.column-search-placeholder"},"column-search-empty-text":{"type":"string","default-from":"runtime.column-search-empty-text"},"vertical-scroll":{"type":"enum","values":["self","page"],"default":"self"},"filter-apply-text":{"type":"string","default-from":"runtime.filter-apply-text"},"layout":{"type":"enum","values":["auto","table","list"],"default":"table"},"list-below":{"type":"number","default":600},"list-fields":{"type":"number","default":3},"size":{"type":"enum","values":["1/2","1"],"default":"1"},"preferences-key":{"type":"string","default":""},"row-actions-visible":{"type":"enum","values":["hover","always"],"default":"hover"},"drag-rows":{"type":"boolean","default":false},"row-reorder":{"type":"boolean","default":false},"inline-edit":{"type":"boolean","default":false},"active-filter-fields":{"type":"list","entries":{"key":"id"}},"bulk-actions":{"type":"list"},"columns":{"type":"list","of":{"key":"string","label":"string"}},"create-items":{"type":"list"},"filter-fields":{"type":"list"},"rows":{"type":"list","entries":{"key":"id","changes":"revision"},"of":{"id":"id","revision":{"type":"string","optional":true}}},"table-data":{"type":"object"},"table-settings":{"type":"object"},"templates":{"type":"list"},"toolbar-actions":{"type":"list"},"sort":{"type":"list","of":{"key":"string","direction":{"type":"enum","values":["asc","desc"]}},"controlled":true},"current":{"type":"string","default":""}},"values":{"selected":{"type":"id","optional":true},"selection":{"type":"list","default":[]}},"events":{"select":{"carries":{"ids":"list"}},"apply":{"carries":{"action":"string","scope":{"type":"enum","values":["entry","selection","filter"]},"ids":"list","revisions":{"type":"object","optional":true}}},"save":{"carries":{"kind":{"type":"enum","values":["columns"]},"reason":"string","column-settings":{"type":"object"},"table-settings-key":{"type":"string"}}},"column-settings-reset":{"carries":{"target":{"type":"enum","values":["personal"]},"table-settings-key":{"type":"string","nullable":true}},"own-verb":true},"create":{"carries":{"item":{"type":"string","nullable":true,"optional":true}}},"filter-change":{"carries":{"template-key":{"type":"string"},"template-label":{"type":"string"},"values":{"type":"object"},"tags":{"type":"object"}},"own-verb":true},"query":{"carries":{"reason":"string","context":"object","sequence":{"type":"number","integer":true}}},"refresh":{"carries":{}},"search-change":{"carries":{"search":"string"},"own-verb":true},"sort-change":{"carries":{"key":{"type":"string","schema":{"minLength":1}},"direction":{"type":"enum","values":["asc","desc",null],"nullable":true}},"own-verb":true},"template-delete":{"carries":{"key":{"type":"string","schema":{"minLength":1}}},"own-verb":true},"template-save":{"carries":{},"own-verb":true},"template-select":{"carries":{"key":{"type":"string","schema":{"minLength":1}}},"own-verb":true},"toolbar-action":{"carries":{"action":"string","href":{"type":"string","nullable":true,"optional":true}},"cancelable":true,"own-verb":true},"reference-open":{"carries":{"field":"string","value":"object","href":"string"},"cancelable":true,"own-verb":true},"expand":{"carries":{"id":"id","expanded":{"type":"boolean","optional":true}}},"load-more":{"carries":{"direction":{"type":"enum","values":["after"]},"parent":{"type":"id","nullable":true},"cursor":{"type":"string","nullable":true}}},"rows-drag":{"carries":{"ids":{"type":"list","schema":{"items":{"type":"string"},"minItems":1}},"source":{"type":"string","nullable":true}},"own-verb":true},"move":{"carries":{"ids":"list","before":{"type":"id","nullable":true},"order":"list"}},"cell-set":{"carries":{"id":"object","key":"string","value":"object","revision":"object"},"own-verb":true},"view-change":{"carries":{"view":"object","everywhere":"boolean"},"own-verb":true},"window":{"carries":{"first":{"type":"number","integer":true},"last":{"type":"number","integer":true}},"own-verb":true}},"actions":{"add-rows":{"with":{"rows":"list"}},"apply-query-result":{"with":{"sequence":{"type":"number","integer":true,"schema":{"minimum":1}},"rows":"list"}},"clear-selection":{},"request-action-intent":{"with":{"action-id":{"type":"string","schema":{"minLength":1}},"record-ids":{"type":"list","schema":{"items":{"type":["string","integer"],"minLength":1},"minItems":1}}},"emits":"apply"},"request-create-intent":{"with":{"item-id":{"type":"string","optional":true,"nullable":true}},"emits":"create"},"request-retry":{"emits":"refresh"},"set-sort":{"with":{"key":{"type":"string","nullable":true},"direction":{"type":"enum","values":["asc","desc"],"nullable":true}}},"toggle-tree-row":{"with":{"row":"object"},"emits":"expand"},"request-tree-more":{"with":{"row":"object"},"emits":"load-more"},"focus-row":{"with":{"id":"id"}}},"port":{"id":"simai.dataview-port","version":"1.0.0","contract":"src/core/contracts/ports/simai.dataview-port/1.0.0/port.json"},"presentation":{"skeleton":{"late":["rows"]}},"host-states":{"data-sf-view-stripes":"boolean","data-sf-page-scroll":"boolean"},"css-variables":{"--sf-table-row-block-size-1/2":{"type":"length","state":"default"},"--sf-table-row-block-size-1":{"type":"length","state":"default"},"--sf-table-row-2-lines-block-size-1/2":{"type":"length","state":"default"},"--sf-table-row-2-lines-block-size-1":{"type":"length","state":"default"},"--sf-table-head-block-size-1/2":{"type":"length","state":"default"},"--sf-table-head-block-size-1":{"type":"length","state":"default"},"--sf-table-toolbar-block-size-1/2":{"type":"length","state":"default"},"--sf-table-toolbar-block-size-1":{"type":"length","state":"default"},"--sf-table-toolbar-gap":{"type":"length","state":"default"},"--sf-table-head--background-color":{"type":"color","state":"default"},"--sf-table-row--background-color":{"type":"color","state":"default"},"--sf-table--cell-spacing":{"type":"length","state":"default"},"--sf-table-cell--line-clamp":{"type":"number","state":"default"},"--sf-table-context-menu--z-index":{"type":"number","state":"open"},"--sf-table-context-menu--max-width":{"type":"length","state":"open"}}}');
13979
14339
 
13980
14340
  /***/ },
13981
14341