@datagouv/components-next 1.2.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 (138) hide show
  1. package/README.md +7 -6
  2. package/dist/{Control-ZFh5ta_U.js → Control-B9WQxlpJ.js} +1 -1
  3. package/dist/{Datafair.client-rf4T1IkA.js → Datafair.client-D_6yzJUG.js} +9 -9
  4. package/dist/{Event-DSQcW7OF.js → Event-iXDrp-fy.js} +11 -11
  5. package/dist/{Image-BijNEG0p.js → Image-mNMBOofs.js} +5 -5
  6. package/dist/ImagePreview.client-B0iPhFm3.js +36 -0
  7. package/dist/{JsonPreview.client-dzar6iuh.js → JsonPreview.client-DSl1kiwC.js} +5 -5
  8. package/dist/{Map-BUtPf5GN.js → Map-BfqKMw0S.js} +1306 -1166
  9. package/dist/{MapContainer.client-D-MoRNhG.js → MapContainer.client-BSfpk_rT.js} +15 -15
  10. package/dist/{OSM-D4MTdBtk.js → OSM-CcrUhItr.js} +15 -23
  11. package/dist/{PdfPreview.client-DoDYLmJD.js → PdfPreview.client-BANFeM6K.js} +441 -434
  12. package/dist/Pmtiles.client-DH9ZrsZR.js +26333 -0
  13. package/dist/PreviewWrapper.vue_vue_type_script_setup_true_lang-I8EZCgzp.js +60 -0
  14. package/dist/{ScaleLine-hJQIqcZm.js → ScaleLine-VGQ7nkMS.js} +2 -2
  15. package/dist/{Tile-Dcl7oIVu.js → Tile-CSpn0Ca8.js} +153 -156
  16. package/dist/{TileImage-BJeHipMX.js → TileImage-CpbaEFwd.js} +143 -131
  17. package/dist/{View-xp_P_OHw.js → View-BYBpt-AU.js} +167 -117
  18. package/dist/{XmlPreview.client-cOhwff6P.js → XmlPreview.client-KCB5mwVf.js} +5 -5
  19. package/dist/{common-BjQlan3k.js → common-BoeTUnDZ.js} +26 -26
  20. package/dist/components-next.css +1 -52
  21. package/dist/components-next.js +201 -170
  22. package/dist/components.css +2 -2
  23. package/dist/{index-NofRBuyf.js → index-DHWzX5vK.js} +5999 -5472
  24. package/dist/{leaflet-src-7m1mB8LI.js → leaflet-src-pVQfonBI.js} +162 -164
  25. package/dist/{main-Iz1ZCL6k.js → main-BDcYkhOc.js} +36671 -29402
  26. package/dist/{proj-CsNo9yH1.js → proj-DxGbobp7.js} +312 -296
  27. package/dist/{text-clamp.esm-B5kW_XMt.js → text-clamp.esm-DVseBqZZ.js} +4 -4
  28. package/dist/{tilecoord-A0fLnBZr.js → tilecoord-DvX7WWiA.js} +264 -255
  29. package/dist/{vue3-json-viewer-BXwup7nO.js → vue3-json-viewer-CJLQFzXZ.js} +10 -16
  30. package/dist/{vue3-xml-viewer.common-tVI9uXUz.js → vue3-xml-viewer.common-Bdcn54ST.js} +1 -1
  31. package/package.json +40 -39
  32. package/src/components/ActivityList/ActivityList.vue +21 -12
  33. package/src/components/AppLink.vue +3 -0
  34. package/src/components/BannerAction.vue +6 -2
  35. package/src/components/Chart/ChartViewer.vue +111 -17
  36. package/src/components/Chart/ChartViewerWrapper.vue +28 -16
  37. package/src/components/ChartCard.vue +112 -0
  38. package/src/components/CopyButton.vue +6 -2
  39. package/src/components/DataserviceCard.vue +23 -6
  40. package/src/components/DataserviceQuality.vue +82 -0
  41. package/src/components/DataserviceQualityInline.vue +31 -0
  42. package/src/components/DataserviceQualityTooltipContent.vue +79 -0
  43. package/src/components/DatasetCard.vue +17 -6
  44. package/src/components/DatasetInformation/DatasetTemporalitySection.vue +7 -4
  45. package/src/components/DatasetQuality.vue +11 -11
  46. package/src/components/DatasetQualityInline.vue +2 -2
  47. package/src/components/DatasetQualityTooltipContent.vue +1 -1
  48. package/src/components/DiscussionMessageCard.vue +14 -15
  49. package/src/components/Form/SchemaSelect.vue +2 -0
  50. package/src/components/FormattedDate.vue +69 -0
  51. package/src/components/LoadingBlock.vue +4 -1
  52. package/src/components/ObjectCard.vue +4 -1
  53. package/src/components/ObjectCardOwner.vue +13 -1
  54. package/src/components/Pagination.vue +18 -58
  55. package/src/components/Placeholder.vue +3 -2
  56. package/src/components/PostCard.vue +13 -15
  57. package/src/components/ResourceAccordion/Datafair.client.vue +1 -1
  58. package/src/components/ResourceAccordion/Downloads.vue +19 -7
  59. package/src/components/ResourceAccordion/ImagePreview.client.vue +48 -0
  60. package/src/components/ResourceAccordion/MapContainer.client.vue +1 -8
  61. package/src/components/ResourceAccordion/Metadata.vue +21 -5
  62. package/src/components/ResourceAccordion/PdfPreview.client.vue +36 -12
  63. package/src/components/ResourceAccordion/PdfSkeleton.vue +44 -0
  64. package/src/components/ResourceAccordion/Pmtiles.client.vue +30 -19
  65. package/src/components/ResourceAccordion/Preview.vue +8 -4
  66. package/src/components/ResourceAccordion/PreviewWrapper.vue +17 -10
  67. package/src/components/ResourceAccordion/ResourceAccordion.vue +31 -11
  68. package/src/components/ResourceExplorer/ResourceExplorer.vue +105 -210
  69. package/src/components/ResourceExplorer/ResourceExplorerHeader.vue +79 -0
  70. package/src/components/ResourceExplorer/ResourceExplorerSidebar.vue +104 -71
  71. package/src/components/ResourceExplorer/ResourceExplorerViewer.vue +140 -184
  72. package/src/components/ResourceExplorer/ResourceMainAction.vue +240 -0
  73. package/src/components/ResourceExplorer/ResourceSelector.vue +24 -86
  74. package/src/components/ResourceExplorer/ResourceViewerHeader.vue +124 -0
  75. package/src/components/ResourceExplorer/ResourceViewerSkeleton.vue +96 -0
  76. package/src/components/ResourceListItem.vue +168 -0
  77. package/src/components/ReuseCard.vue +18 -6
  78. package/src/components/ReuseDetails.vue +2 -2
  79. package/src/components/ReuseHorizontalCard.vue +4 -3
  80. package/src/components/SchemaCard.vue +10 -1
  81. package/src/components/Search/Filter/AccessTypeFilter.vue +2 -2
  82. package/src/components/Search/GlobalSearch.vue +28 -10
  83. package/src/components/Search/SearchInput.vue +1 -1
  84. package/src/components/Search/Sidemenu.vue +4 -3
  85. package/src/components/SmallChart.vue +11 -10
  86. package/src/components/StatBox.vue +13 -5
  87. package/src/components/TabularExplorer/TabularActiveFilters.vue +79 -0
  88. package/src/components/TabularExplorer/TabularCell.vue +7 -8
  89. package/src/components/TabularExplorer/TabularCellPopover.vue +21 -5
  90. package/src/components/TabularExplorer/TabularColumnsMenu.vue +112 -0
  91. package/src/components/TabularExplorer/TabularDateField.vue +41 -0
  92. package/src/components/TabularExplorer/TabularDateFilter.vue +403 -0
  93. package/src/components/TabularExplorer/TabularExplorer.vue +127 -780
  94. package/src/components/TabularExplorer/TabularFilterContent.vue +48 -38
  95. package/src/components/TabularExplorer/TabularFilterPopover.vue +27 -32
  96. package/src/components/TabularExplorer/TabularMobileFilterButton.vue +21 -0
  97. package/src/components/TabularExplorer/TabularMobileFilters.vue +150 -0
  98. package/src/components/TabularExplorer/TabularRowsInfo.vue +31 -0
  99. package/src/components/TabularExplorer/TabularSkeleton.vue +92 -0
  100. package/src/components/TabularExplorer/TabularTable.vue +484 -0
  101. package/src/components/TabularExplorer/TabularToolbar.vue +25 -0
  102. package/src/components/TabularExplorer/types.ts +40 -28
  103. package/src/components/TabularExplorer/useColumnMetadata.ts +98 -0
  104. package/src/components/TabularExplorer/useTabularContext.ts +82 -0
  105. package/src/components/TopicCard.vue +15 -14
  106. package/src/composables/useActiveDescendant.ts +5 -0
  107. package/src/composables/useDatasetResources.ts +164 -0
  108. package/src/composables/useHasTabularData.ts +2 -1
  109. package/src/composables/useResizable.ts +46 -0
  110. package/src/composables/useResourceCapabilities.ts +48 -40
  111. package/src/composables/useSearchFilter.ts +7 -5
  112. package/src/composables/useTranslation.ts +24 -9
  113. package/src/config.ts +1 -0
  114. package/src/functions/api.ts +13 -7
  115. package/src/functions/charts.ts +32 -1
  116. package/src/functions/dates.ts +26 -7
  117. package/src/functions/helpers.ts +15 -0
  118. package/src/functions/metrics.ts +57 -56
  119. package/src/functions/owned.ts +21 -0
  120. package/src/functions/paginate.ts +46 -0
  121. package/src/functions/resourceCapabilities.ts +34 -0
  122. package/src/functions/resources.ts +88 -0
  123. package/src/functions/schemas.ts +27 -0
  124. package/src/functions/scroll.ts +20 -0
  125. package/src/functions/tabular.ts +222 -5
  126. package/src/functions/tabularApi.ts +1 -43
  127. package/src/main.ts +32 -6
  128. package/src/types/dataservices.ts +15 -0
  129. package/src/types/organizations.ts +10 -0
  130. package/src/types/resources.ts +0 -1
  131. package/src/types/reuses.ts +12 -1
  132. package/src/types/search.ts +2 -2
  133. package/src/types/visualizations.ts +5 -0
  134. package/dist/Pmtiles.client-Dzm01Zfm.js +0 -25185
  135. package/dist/PreviewWrapper.vue_vue_type_script_setup_true_lang-BRNYswg3.js +0 -61
  136. /package/src/components/{DatasetQualityItem.vue → QualityItem.vue} +0 -0
  137. /package/src/components/{DatasetQualityItemWarning.vue → QualityItemWarning.vue} +0 -0
  138. /package/src/components/{DatasetQualityScore.vue → QualityScore.vue} +0 -0
package/README.md CHANGED
@@ -65,7 +65,7 @@ app.vueApp.use(datagouv, {
65
65
  `@datagouv/components` is using [TailwindCSS](https://tailwindcss.com/docs) and some [DSFR](https://www.systeme-de-design.gouv.fr/) right now. The user needs to provide the correct version of the DSFR. Concerning TailwindCSS, there are two modes:
66
66
 
67
67
  1. If the user is using TailwindCSS, it can import a full TailwindCSS config with `@import "@datagouv/components-next/assets/main.css";`, then build the CSS via TailwindCSS CLI or Vite plugin.
68
- 2. If the user is not using TailwindCSS, it can import an already built CSS file with `@import '@datagouv/components-next/dist/components.css';`. Note @dev, this file should be built before publishing the package to NPM with `npm run css`. For more details on the [technology stack](../README.md#-technology-stack), see the main README.
68
+ 2. If the user is not using TailwindCSS, it can import an already built CSS file with `@import '@datagouv/components-next/dist/components.css';`. Note @dev, this file should be built before publishing the package to PNPM with `pnpm run css`. For more details on the [technology stack](../README.md#-technology-stack), see the main README.
69
69
 
70
70
  ### I18n
71
71
 
@@ -94,8 +94,8 @@ For general development guidelines and contributing, see the [contributing secti
94
94
  This component library uses both ESLint and Prettier for code quality and formatting:
95
95
 
96
96
  ```bash
97
- npm run lint # Lint and auto-fix ESLint issues
98
- npm run format # Format code with Prettier
97
+ pnpm run lint # Lint and auto-fix ESLint issues
98
+ pnpm run format # Format code with Prettier
99
99
  ```
100
100
 
101
101
  **Note:** Make sure to run both commands before submitting contributions to ensure consistent code style.
@@ -172,10 +172,10 @@ To make a new release, you have to :
172
172
 
173
173
  ### Update the version
174
174
 
175
- Use the dedicated npm command, with the correct parameter :
175
+ Use the dedicated pnpm command, with the correct parameter :
176
176
 
177
177
  ```
178
- npm version VERSION
178
+ pnpm version VERSION
179
179
  ```
180
180
 
181
181
  Where VERSION is :
@@ -187,7 +187,8 @@ Additional labels for pre-release and build metadata are available as extensions
187
187
  ### Publish to NPM
188
188
 
189
189
  ```
190
- npm run publish-stable
190
+ pnpm login
191
+ pnpm run publish-stable
191
192
  ```
192
193
 
193
194
  ## 📄 License
@@ -1,4 +1,4 @@
1
- import { B as o, u as h, V as m, l as c } from "./proj-CsNo9yH1.js";
1
+ import { B as o, u as h, V as m, l as c } from "./proj-DxGbobp7.js";
2
2
  const g = {
3
3
  /**
4
4
  * Triggered after a map frame is rendered.
@@ -1,24 +1,24 @@
1
- import { defineComponent as l, computed as a, createElementBlock as o, openBlock as t, createBlock as u, createElementVNode as f, withCtx as p, createTextVNode as m, toDisplayString as _, unref as h } from "vue";
2
- import { a as x, _ as g } from "./main-Iz1ZCL6k.js";
3
- const v = { class: "fr-text--xs" }, b = { key: 0 }, k = ["src"], $ = /* @__PURE__ */ l({
1
+ import { defineComponent as u, computed as a, openBlock as t, createElementBlock as o, createElementVNode as l, createBlock as f, withCtx as p, createTextVNode as m, toDisplayString as _, unref as x } from "vue";
2
+ import { a as h, d as v } from "./main-BDcYkhOc.js";
3
+ const g = { class: "fr-text--xs" }, b = { key: 0 }, k = ["src"], B = /* @__PURE__ */ u({
4
4
  __name: "Datafair.client",
5
5
  props: {
6
6
  resource: {},
7
7
  dataset: {}
8
8
  },
9
9
  setup(c) {
10
- const e = c, { t: i } = x(), r = a(() => e.resource.extras.datafairOrigin || e.dataset.extras.datafairOrigin), s = a(() => e.resource.extras.datafairDatasetId || e.dataset.extras.datafairDatasetId), d = a(() => e.resource.extras.datafairEmbed), n = a(() => !r.value || !s.value ? null : `${r.value}/embed/dataset/${s.value}/${d.value}`);
11
- return (D, y) => (t(), o("div", v, [
10
+ const e = c, { t: i } = h(), r = a(() => e.resource.extras.datafairOrigin || e.dataset.extras.datafairOrigin), s = a(() => e.resource.extras.datafairDatasetId || e.dataset.extras.datafairDatasetId), d = a(() => e.resource.extras.datafairEmbed), n = a(() => !r.value || !s.value ? null : `${r.value}/embed/dataset/${s.value}/${d.value}`);
11
+ return (D, y) => (t(), o("div", g, [
12
12
  n.value ? (t(), o("div", b, [
13
- f("iframe", {
13
+ l("iframe", {
14
14
  src: n.value,
15
15
  width: "100%",
16
16
  height: "500px",
17
17
  style: { "background-color": "transparent", border: "none" }
18
18
  }, null, 8, k)
19
- ])) : (t(), u(g, { key: 1 }, {
19
+ ])) : (t(), f(v, { key: 1 }, {
20
20
  default: p(() => [
21
- m(_(h(i)("L'aperçu de ce fichier n'a pas pu être chargé. Téléchargez-le depuis l'onglet Téléchargements.")), 1)
21
+ m(_(x(i)("L'aperçu de ce fichier n'a pas pu être chargé. Téléchargez-le pour le consulter.")), 1)
22
22
  ]),
23
23
  _: 1
24
24
  }))
@@ -26,5 +26,5 @@ const v = { class: "fr-text--xs" }, b = { key: 0 }, k = ["src"], $ = /* @__PURE_
26
26
  }
27
27
  });
28
28
  export {
29
- $ as default
29
+ B as default
30
30
  };
@@ -1,7 +1,7 @@
1
- import { I as x } from "./View-xp_P_OHw.js";
2
- import { a as I } from "./common-BjQlan3k.js";
3
- import { B as C, a7 as h, al as m, u as S, l as p, E as N, i as L, a4 as P, J as Z } from "./proj-CsNo9yH1.js";
4
- import { c as T } from "./Image-BijNEG0p.js";
1
+ import { I as x } from "./View-BYBpt-AU.js";
2
+ import { a as I } from "./common-BoeTUnDZ.js";
3
+ import { B as C, a6 as h, al as m, u as S, l as p, E as N, i as L, a3 as P, G as Z } from "./proj-DxGbobp7.js";
4
+ import { c as T } from "./Image-mNMBOofs.js";
5
5
  const n = {
6
6
  OPACITY: "opacity",
7
7
  VISIBLE: "visible",
@@ -16,7 +16,7 @@ const n = {
16
16
  };
17
17
  class D extends C {
18
18
  /**
19
- * @param {Options} options Layer options.
19
+ * @param {Options<NoInfer<Properties>>} options Layer options.
20
20
  */
21
21
  constructor(e) {
22
22
  super(), this.on, this.once, this.un, this.background_ = e.background;
@@ -313,9 +313,9 @@ const K = {
313
313
  */
314
314
  RENDERCOMPLETE: "rendercomplete"
315
315
  };
316
- class G extends D {
316
+ class q extends D {
317
317
  /**
318
- * @param {Options<SourceType>} options Layer options.
318
+ * @param {Options<SourceType, NoInfer<Properties>>} options Layer options.
319
319
  */
320
320
  constructor(e) {
321
321
  const r = Object.assign({}, e);
@@ -393,15 +393,15 @@ class G extends D {
393
393
  }, 0))), this.changed();
394
394
  }
395
395
  /**
396
- * @param {import("../pixel").Pixel} pixel Pixel.
397
- * @return {Promise<Array<import("../Feature").FeatureLike>>} Promise that resolves with
396
+ * @param {import("../pixel.js").Pixel} pixel Pixel.
397
+ * @return {Promise<Array<import("../Feature.js").FeatureLike>>} Promise that resolves with
398
398
  * an array of features.
399
399
  */
400
400
  getFeatures(e) {
401
401
  return this.renderer_ ? this.renderer_.getFeatures(e) : Promise.resolve([]);
402
402
  }
403
403
  /**
404
- * @param {import("../pixel").Pixel} pixel Pixel.
404
+ * @param {import("../pixel.js").Pixel} pixel Pixel.
405
405
  * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.
406
406
  */
407
407
  getData(e) {
@@ -723,7 +723,7 @@ class re extends Z {
723
723
  }
724
724
  export {
725
725
  D as B,
726
- G as L,
726
+ q as L,
727
727
  U as N,
728
728
  K as R,
729
729
  te as a,
@@ -1,4 +1,4 @@
1
- import { aD as v, E as f, ar as C, aC as h, u as R } from "./proj-CsNo9yH1.js";
1
+ import { aD as v, E as f, ar as C, aC as h, u as R } from "./proj-DxGbobp7.js";
2
2
  const r = typeof navigator < "u" && typeof navigator.userAgent < "u" ? navigator.userAgent.toLowerCase() : "", I = r.includes("safari") && !r.includes("chrom");
3
3
  I && (r.includes("version/15.4") || /cpu (os|iphone os) 15_4 like mac os x/.test(r));
4
4
  const D = r.includes("webkit") && !r.includes("edge"), L = r.includes("macintosh"), w = typeof devicePixelRatio < "u" ? devicePixelRatio : 1, y = typeof WorkerGlobalScope < "u" && typeof OffscreenCanvas < "u" && self instanceof WorkerGlobalScope, u = typeof Image < "u" && Image.prototype.decode, p = typeof createImageBitmap == "function", O = (function() {
@@ -281,16 +281,16 @@ export {
281
281
  L as M,
282
282
  O as P,
283
283
  _ as T,
284
- y as W,
284
+ D as W,
285
285
  M as a,
286
286
  T as b,
287
287
  m as c,
288
288
  a as d,
289
289
  Y as e,
290
290
  P as f,
291
- D as g,
292
- N as h,
293
- g as i,
291
+ N as g,
292
+ g as h,
293
+ y as i,
294
294
  G as j,
295
295
  B as k,
296
296
  W as l,
@@ -0,0 +1,36 @@
1
+ import { defineComponent as _, ref as y, computed as o, openBlock as t, createElementBlock as u, createBlock as p, withCtx as f, createTextVNode as m, toDisplayString as d, unref as l } from "vue";
2
+ import { a as z, u as T, b as k, d as h } from "./main-BDcYkhOc.js";
3
+ const w = { class: "text-xs" }, B = ["src"], E = /* @__PURE__ */ _({
4
+ __name: "ImagePreview.client",
5
+ props: {
6
+ resource: {}
7
+ },
8
+ setup(a) {
9
+ const n = a, { t: r } = z(), v = T(), c = y(!1), g = o(() => n.resource.format?.toUpperCase() ?? r("Fichier")), i = o(() => k(n.resource)), x = o(() => {
10
+ const s = i.value, e = v.maxImagePreviewByteSize;
11
+ return !s || !e ? !1 : s <= e;
12
+ });
13
+ return (s, e) => (t(), u("div", w, [
14
+ x.value ? c.value ? (t(), p(h, { key: 1 }, {
15
+ default: f(() => [
16
+ m(d(l(r)("L'aperçu de ce fichier n'a pas pu être chargé. Téléchargez-le pour le consulter.")), 1)
17
+ ]),
18
+ _: 1
19
+ })) : (t(), u("img", {
20
+ key: 2,
21
+ src: a.resource.url,
22
+ alt: "",
23
+ class: "block w-full h-auto max-w-[800px]",
24
+ onError: e[0] || (e[0] = (C) => c.value = !0)
25
+ }, null, 40, B)) : (t(), p(h, { key: 0 }, {
26
+ default: f(() => [
27
+ m(d(i.value ? l(r)("Le fichier {fileType} est trop volumineux pour être prévisualisé. Téléchargez-le pour le consulter.", { fileType: g.value }) : l(r)("La taille du fichier est inconnue, l'aperçu n'est pas disponible. Téléchargez-le pour le consulter.")), 1)
28
+ ]),
29
+ _: 1
30
+ }))
31
+ ]));
32
+ }
33
+ });
34
+ export {
35
+ E as default
36
+ };
@@ -1,6 +1,6 @@
1
- import { defineComponent as c, defineAsyncComponent as u, createBlock as m, openBlock as p, unref as r, withCtx as f, createVNode as l } from "vue";
2
- import { u as d } from "./main-Iz1ZCL6k.js";
3
- import { _ as h } from "./PreviewWrapper.vue_vue_type_script_setup_true_lang-BRNYswg3.js";
1
+ import { defineComponent as c, defineAsyncComponent as u, openBlock as m, createBlock as p, unref as r, withCtx as f, createVNode as l } from "vue";
2
+ import { u as d } from "./main-BDcYkhOc.js";
3
+ import { _ as h } from "./PreviewWrapper.vue_vue_type_script_setup_true_lang-I8EZCgzp.js";
4
4
  const J = /* @__PURE__ */ c({
5
5
  __name: "JsonPreview.client",
6
6
  props: {
@@ -8,13 +8,13 @@ const J = /* @__PURE__ */ c({
8
8
  },
9
9
  setup(o) {
10
10
  const t = u(
11
- () => import("./vue3-json-viewer-BXwup7nO.js").then((e) => (Promise.resolve({ }), e.JsonViewer))
11
+ () => import("./vue3-json-viewer-CJLQFzXZ.js").then((e) => (Promise.resolve({ }), e.JsonViewer))
12
12
  ), n = o, s = d(), i = async () => {
13
13
  const e = await fetch(n.resource.url);
14
14
  if (!e.ok) throw new Error(`HTTP error! status: ${e.status}`);
15
15
  return e.json();
16
16
  };
17
- return (e, w) => (p(), m(h, {
17
+ return (e, w) => (m(), p(h, {
18
18
  "file-type": "JSON",
19
19
  resource: o.resource,
20
20
  "max-size": r(s).maxJsonPreviewCharSize,