@ogc-maps/storybook-components 0.4.1 → 0.5.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 (128) hide show
  1. package/dist/{FeatureDetailPanel-DpcaTS9I.js → FeatureDetailPanel-CkFpdEKW.js} +8 -7
  2. package/dist/{FeatureTooltip-CM0ZTudi.js → FeatureTooltip-Db1LgLQV.js} +9 -7
  3. package/dist/{LayerPanel-BHpb8dbm.js → LayerPanel-SCdJ8948.js} +21 -21
  4. package/dist/{Legend-D4cc1JzQ.js → Legend-BMrkY-rw.js} +4 -4
  5. package/dist/PropertyList-BGXHLVBM.js +33 -0
  6. package/dist/SearchPanel-DCY01Wa-.js +363 -0
  7. package/dist/components/BasemapEditor/BasemapEditor.d.ts +7 -0
  8. package/dist/components/BasemapEditor/BasemapEditor.d.ts.map +1 -0
  9. package/dist/components/BasemapEditor/BasemapList.d.ts +7 -0
  10. package/dist/components/BasemapEditor/BasemapList.d.ts.map +1 -0
  11. package/dist/components/BasemapEditor/index.d.ts +5 -0
  12. package/dist/components/BasemapEditor/index.d.ts.map +1 -0
  13. package/dist/components/CollectionBrowser/CollectionBrowser.d.ts +8 -0
  14. package/dist/components/CollectionBrowser/CollectionBrowser.d.ts.map +1 -0
  15. package/dist/components/CollectionBrowser/index.d.ts +3 -0
  16. package/dist/components/CollectionBrowser/index.d.ts.map +1 -0
  17. package/dist/components/ConfigPreview/ConfigPreview.d.ts +5 -0
  18. package/dist/components/ConfigPreview/ConfigPreview.d.ts.map +1 -0
  19. package/dist/components/ConfigPreview/index.d.ts +3 -0
  20. package/dist/components/ConfigPreview/index.d.ts.map +1 -0
  21. package/dist/components/FeatureDetailPanel/FeatureDetailPanel.d.ts +2 -1
  22. package/dist/components/FeatureDetailPanel/FeatureDetailPanel.d.ts.map +1 -1
  23. package/dist/components/FeatureDetailPanel/index.js +1 -1
  24. package/dist/components/FeatureTooltip/FeatureTooltip.d.ts +2 -1
  25. package/dist/components/FeatureTooltip/FeatureTooltip.d.ts.map +1 -1
  26. package/dist/components/FeatureTooltip/index.js +1 -1
  27. package/dist/components/LayerEditor/LayerEditor.d.ts +8 -0
  28. package/dist/components/LayerEditor/LayerEditor.d.ts.map +1 -0
  29. package/dist/components/LayerEditor/LayerList.d.ts +8 -0
  30. package/dist/components/LayerEditor/LayerList.d.ts.map +1 -0
  31. package/dist/components/LayerEditor/index.d.ts +5 -0
  32. package/dist/components/LayerEditor/index.d.ts.map +1 -0
  33. package/dist/components/LayerPanel/index.js +1 -1
  34. package/dist/components/Legend/index.js +1 -1
  35. package/dist/components/LegendEditor/LegendEditor.d.ts +7 -0
  36. package/dist/components/LegendEditor/LegendEditor.d.ts.map +1 -0
  37. package/dist/components/LegendEditor/LegendEntryEditor.d.ts +7 -0
  38. package/dist/components/LegendEditor/LegendEntryEditor.d.ts.map +1 -0
  39. package/dist/components/LegendEditor/index.d.ts +5 -0
  40. package/dist/components/LegendEditor/index.d.ts.map +1 -0
  41. package/dist/components/PropertyDisplayEditor/PropertyDisplayEditor.d.ts +15 -0
  42. package/dist/components/PropertyDisplayEditor/PropertyDisplayEditor.d.ts.map +1 -0
  43. package/dist/components/PropertyDisplayEditor/__tests__/PropertyDisplayEditor.test.d.ts +2 -0
  44. package/dist/components/PropertyDisplayEditor/__tests__/PropertyDisplayEditor.test.d.ts.map +1 -0
  45. package/dist/components/PropertyDisplayEditor/index.d.ts +3 -0
  46. package/dist/components/PropertyDisplayEditor/index.d.ts.map +1 -0
  47. package/dist/components/SearchFieldEditor/SearchFieldEditor.d.ts +8 -0
  48. package/dist/components/SearchFieldEditor/SearchFieldEditor.d.ts.map +1 -0
  49. package/dist/components/SearchFieldEditor/SearchFieldList.d.ts +8 -0
  50. package/dist/components/SearchFieldEditor/SearchFieldList.d.ts.map +1 -0
  51. package/dist/components/SearchFieldEditor/index.d.ts +5 -0
  52. package/dist/components/SearchFieldEditor/index.d.ts.map +1 -0
  53. package/dist/components/SearchPanel/AutocompleteInput.d.ts +12 -0
  54. package/dist/components/SearchPanel/AutocompleteInput.d.ts.map +1 -0
  55. package/dist/components/SearchPanel/DateRangeInput.d.ts +11 -0
  56. package/dist/components/SearchPanel/DateRangeInput.d.ts.map +1 -0
  57. package/dist/components/SearchPanel/NumberInput.d.ts +11 -0
  58. package/dist/components/SearchPanel/NumberInput.d.ts.map +1 -0
  59. package/dist/components/SearchPanel/SearchPanel.d.ts +7 -3
  60. package/dist/components/SearchPanel/SearchPanel.d.ts.map +1 -1
  61. package/dist/components/SearchPanel/index.js +1 -1
  62. package/dist/components/SourceEditor/SourceEditor.d.ts +10 -0
  63. package/dist/components/SourceEditor/SourceEditor.d.ts.map +1 -0
  64. package/dist/components/SourceEditor/SourceList.d.ts +7 -0
  65. package/dist/components/SourceEditor/SourceList.d.ts.map +1 -0
  66. package/dist/components/SourceEditor/index.d.ts +5 -0
  67. package/dist/components/SourceEditor/index.d.ts.map +1 -0
  68. package/dist/components/StyleEditor/StyleEditor.d.ts +11 -0
  69. package/dist/components/StyleEditor/StyleEditor.d.ts.map +1 -0
  70. package/dist/components/StyleEditor/index.d.ts +3 -0
  71. package/dist/components/StyleEditor/index.d.ts.map +1 -0
  72. package/dist/components/UIConfigEditor/UIConfigEditor.d.ts +7 -0
  73. package/dist/components/UIConfigEditor/UIConfigEditor.d.ts.map +1 -0
  74. package/dist/components/UIConfigEditor/index.d.ts +3 -0
  75. package/dist/components/UIConfigEditor/index.d.ts.map +1 -0
  76. package/dist/components/ViewEditor/ViewEditor.d.ts +7 -0
  77. package/dist/components/ViewEditor/ViewEditor.d.ts.map +1 -0
  78. package/dist/components/ViewEditor/index.d.ts +3 -0
  79. package/dist/components/ViewEditor/index.d.ts.map +1 -0
  80. package/dist/components/_shared/PropertyList.d.ts +2 -1
  81. package/dist/components/_shared/PropertyList.d.ts.map +1 -1
  82. package/dist/components/admin/ColorPicker.d.ts +7 -0
  83. package/dist/components/admin/ColorPicker.d.ts.map +1 -0
  84. package/dist/components/admin/ConfirmDialog.d.ts +9 -0
  85. package/dist/components/admin/ConfirmDialog.d.ts.map +1 -0
  86. package/dist/components/admin/FormField.d.ts +10 -0
  87. package/dist/components/admin/FormField.d.ts.map +1 -0
  88. package/dist/components/admin/index.d.ts +7 -0
  89. package/dist/components/admin/index.d.ts.map +1 -0
  90. package/dist/components/index.d.ts +24 -0
  91. package/dist/components/index.d.ts.map +1 -1
  92. package/dist/cql2-Dhe6Ny6v.js +352 -0
  93. package/dist/hooks/index.d.ts +6 -2
  94. package/dist/hooks/index.d.ts.map +1 -1
  95. package/dist/hooks/index.js +38 -10
  96. package/dist/hooks/useCsvExport.d.ts +2 -1
  97. package/dist/hooks/useCsvExport.d.ts.map +1 -1
  98. package/dist/hooks/useOgcCollectionDetail.d.ts +14 -0
  99. package/dist/hooks/useOgcCollectionDetail.d.ts.map +1 -0
  100. package/dist/hooks/useOgcQueryables.d.ts +14 -0
  101. package/dist/hooks/useOgcQueryables.d.ts.map +1 -0
  102. package/dist/index-Bw9lUiuL.js +2860 -0
  103. package/dist/main.js +2090 -54
  104. package/dist/schemas/config.d.ts +917 -69
  105. package/dist/schemas/config.d.ts.map +1 -1
  106. package/dist/schemas/index.js +21 -2822
  107. package/dist/style.css +1 -1
  108. package/dist/types/index.d.ts +30 -3
  109. package/dist/types/index.d.ts.map +1 -1
  110. package/dist/types/index.js +22 -16
  111. package/dist/utils/__tests__/cql2.test.d.ts +2 -0
  112. package/dist/utils/__tests__/cql2.test.d.ts.map +1 -0
  113. package/dist/utils/__tests__/propertyDisplay.test.d.ts +2 -0
  114. package/dist/utils/__tests__/propertyDisplay.test.d.ts.map +1 -0
  115. package/dist/utils/cql2.d.ts +75 -0
  116. package/dist/utils/cql2.d.ts.map +1 -0
  117. package/dist/utils/index.d.ts +3 -0
  118. package/dist/utils/index.d.ts.map +1 -1
  119. package/dist/utils/ogcApi.d.ts +61 -0
  120. package/dist/utils/ogcApi.d.ts.map +1 -1
  121. package/dist/utils/propertyDisplay.d.ts +6 -0
  122. package/dist/utils/propertyDisplay.d.ts.map +1 -0
  123. package/dist/utils/queryableHelpers.d.ts +35 -0
  124. package/dist/utils/queryableHelpers.d.ts.map +1 -0
  125. package/package.json +4 -2
  126. package/dist/PropertyList-BH_DTkcU.js +0 -32
  127. package/dist/SearchPanel-B5GPX1gF.js +0 -106
  128. package/dist/useCsvExport-C4WAm7kG.js +0 -146
@@ -1,13 +1,14 @@
1
1
  import { jsxs as p, jsx as a } from "react/jsx-runtime";
2
- import { P as s } from "./PropertyList-BH_DTkcU.js";
3
- function x({
2
+ import { P as c } from "./PropertyList-BGXHLVBM.js";
3
+ function f({
4
4
  isOpen: r,
5
5
  onClose: m,
6
6
  properties: i,
7
7
  title: t = "Feature Properties",
8
8
  fields: l,
9
+ labels: o,
9
10
  variant: e = "panel",
10
- className: o = ""
11
+ className: n = ""
11
12
  }) {
12
13
  if (!r) return null;
13
14
  const u = /* @__PURE__ */ p(
@@ -16,9 +17,9 @@ function x({
16
17
  className: [
17
18
  "mapui:flex mapui:flex-col mapui:rounded mapui:border mapui:border-gray-200 mapui:bg-white mapui:shadow-md",
18
19
  e === "modal" ? "mapui:max-h-[80vh] mapui:w-full mapui:max-w-lg" : "mapui:max-h-[calc(100vh-4rem)] mapui:w-72",
19
- o
20
+ n
20
21
  ].filter(Boolean).join(" ").trim(),
21
- onClick: e === "modal" ? (n) => n.stopPropagation() : void 0,
22
+ onClick: e === "modal" ? (s) => s.stopPropagation() : void 0,
22
23
  children: [
23
24
  /* @__PURE__ */ p("div", { className: "mapui:flex mapui:shrink-0 mapui:items-center mapui:justify-between mapui:border-b mapui:border-gray-200 mapui:px-4 mapui:py-3", children: [
24
25
  /* @__PURE__ */ a("h3", { className: "mapui:m-0 mapui:text-sm mapui:font-semibold mapui:text-gray-700", children: t }),
@@ -32,7 +33,7 @@ function x({
32
33
  }
33
34
  )
34
35
  ] }),
35
- /* @__PURE__ */ a("div", { className: "mapui:overflow-y-auto mapui:px-4 mapui:py-3", children: i && Object.keys(i).length > 0 ? /* @__PURE__ */ a(s, { properties: i, fields: l, density: "default" }) : /* @__PURE__ */ a("p", { className: "mapui:m-0 mapui:text-sm mapui:text-gray-400", children: "No properties available." }) })
36
+ /* @__PURE__ */ a("div", { className: "mapui:overflow-y-auto mapui:px-4 mapui:py-3", children: i && Object.keys(i).length > 0 ? /* @__PURE__ */ a(c, { properties: i, fields: l, labels: o, density: "default" }) : /* @__PURE__ */ a("p", { className: "mapui:m-0 mapui:text-sm mapui:text-gray-400", children: "No properties available." }) })
36
37
  ]
37
38
  }
38
39
  );
@@ -46,5 +47,5 @@ function x({
46
47
  ) : u;
47
48
  }
48
49
  export {
49
- x as F
50
+ f as F
50
51
  };
@@ -1,9 +1,10 @@
1
1
  import { jsx as a, jsxs as e } from "react/jsx-runtime";
2
- import { P as s } from "./PropertyList-BH_DTkcU.js";
3
- function x({
2
+ import { P as n } from "./PropertyList-BGXHLVBM.js";
3
+ function h({
4
4
  title: p,
5
5
  properties: m,
6
6
  fields: t,
7
+ labels: o,
7
8
  maxItems: i = 4,
8
9
  className: u = ""
9
10
  }) {
@@ -15,7 +16,7 @@ function x({
15
16
  children: /* @__PURE__ */ a("p", { className: "mapui:m-0 mapui:text-xs mapui:text-gray-400", children: "No data" })
16
17
  }
17
18
  );
18
- const r = t ?? Object.keys(m), o = r.length > i, d = r.length - i;
19
+ const r = t ?? Object.keys(m), d = r.length > i, s = r.length - i;
19
20
  return /* @__PURE__ */ e(
20
21
  "div",
21
22
  {
@@ -23,17 +24,18 @@ function x({
23
24
  children: [
24
25
  p && /* @__PURE__ */ a("p", { className: "mapui:mb-1.5 mapui:mt-0 mapui:text-xs mapui:font-semibold mapui:text-gray-700", children: p }),
25
26
  /* @__PURE__ */ a(
26
- s,
27
+ n,
27
28
  {
28
29
  properties: m,
29
30
  fields: t,
31
+ labels: o,
30
32
  maxItems: i,
31
33
  density: "compact"
32
34
  }
33
35
  ),
34
- o && /* @__PURE__ */ e("p", { className: "mapui:mb-0 mapui:mt-1 mapui:text-xs mapui:text-gray-400", children: [
36
+ d && /* @__PURE__ */ e("p", { className: "mapui:mb-0 mapui:mt-1 mapui:text-xs mapui:text-gray-400", children: [
35
37
  "+",
36
- d,
38
+ s,
37
39
  " more"
38
40
  ] })
39
41
  ]
@@ -41,5 +43,5 @@ function x({
41
43
  );
42
44
  }
43
45
  export {
44
- x as F
46
+ h as F
45
47
  };
@@ -1,40 +1,40 @@
1
- import { jsxs as o, jsx as s } from "react/jsx-runtime";
2
- import { useState as g, useCallback as u } from "react";
1
+ import { jsxs as o, jsx as u } from "react/jsx-runtime";
2
+ import { useState as g, useCallback as m } from "react";
3
3
  function E({
4
- layers: l,
4
+ layers: r,
5
5
  activeLayerIds: f,
6
6
  onToggleVisibility: v,
7
7
  onReorder: i,
8
8
  className: x = "",
9
9
  hideTitle: h
10
10
  }) {
11
- const [n, r] = g(null), [D, m] = g(null), b = u(
11
+ const [n, l] = g(null), [D, s] = g(null), b = m(
12
12
  (a, e) => {
13
- r(e), a.dataTransfer.effectAllowed = "move", a.dataTransfer.setData("text/plain", e);
13
+ l(e), a.dataTransfer.effectAllowed = "move", a.dataTransfer.setData("text/plain", e);
14
14
  },
15
15
  []
16
- ), N = u(
16
+ ), N = m(
17
17
  (a, e) => {
18
- a.preventDefault(), a.dataTransfer.dropEffect = "move", m(e);
18
+ a.preventDefault(), a.dataTransfer.dropEffect = "move", s(e);
19
19
  },
20
20
  []
21
- ), O = u(() => {
22
- m(null);
23
- }, []), I = u(
21
+ ), O = m(() => {
22
+ s(null);
23
+ }, []), I = m(
24
24
  (a, e) => {
25
- if (a.preventDefault(), m(null), r(null), !i || !n || n === e) return;
26
- const p = l.map((j) => j.id), c = p.indexOf(n), t = p.indexOf(e);
25
+ if (a.preventDefault(), s(null), l(null), !i || !n || n === e) return;
26
+ const p = r.map((w) => w.id), c = p.indexOf(n), t = p.indexOf(e);
27
27
  if (c === -1 || t === -1) return;
28
28
  const d = [...p];
29
29
  d.splice(c, 1), d.splice(t, 0, n), i(d);
30
30
  },
31
- [n, l, i]
32
- ), L = u(() => {
33
- r(null), m(null);
31
+ [n, r, i]
32
+ ), L = m(() => {
33
+ l(null), s(null);
34
34
  }, []);
35
35
  return /* @__PURE__ */ o("div", { className: `mapui:flex mapui:flex-col mapui:gap-1 ${x}`.trim(), children: [
36
- !h && /* @__PURE__ */ s("h3", { className: "mapui:m-0 mapui:mb-2 mapui:text-sm mapui:font-semibold mapui:text-gray-700", children: "Layers" }),
37
- /* @__PURE__ */ s("ul", { className: "mapui:m-0 mapui:list-none mapui:p-0", children: l.map((a) => {
36
+ !h && /* @__PURE__ */ u("h3", { className: "mapui:m-0 mapui:mb-2 mapui:text-sm mapui:font-semibold mapui:text-gray-700", children: "Layers" }),
37
+ /* @__PURE__ */ u("ul", { className: "mapui:m-0 mapui:list-none mapui:p-0", children: r.map((a) => {
38
38
  const e = f.includes(a.id), p = n === a.id, c = D === a.id;
39
39
  return /* @__PURE__ */ o(
40
40
  "li",
@@ -52,7 +52,7 @@ function E({
52
52
  p ? "mapui:opacity-50" : "mapui:opacity-100"
53
53
  ].join(" "),
54
54
  children: [
55
- i && /* @__PURE__ */ s(
55
+ i && /* @__PURE__ */ u(
56
56
  "span",
57
57
  {
58
58
  className: "mapui:cursor-grab mapui:text-gray-400 active:mapui:cursor-grabbing",
@@ -60,8 +60,8 @@ function E({
60
60
  children: "⠿"
61
61
  }
62
62
  ),
63
- /* @__PURE__ */ o("label", { className: "mapui:flex mapui:flex-1 mapui:cursor-pointer mapui:items-center mapui:gap-2", children: [
64
- /* @__PURE__ */ s(
63
+ /* @__PURE__ */ o("label", { className: "mapui:flex mapui:flex-1 mapui:cursor-pointer mapui:items-center mapui:gap-2 mapui:min-w-0", children: [
64
+ /* @__PURE__ */ u(
65
65
  "input",
66
66
  {
67
67
  type: "checkbox",
@@ -70,7 +70,7 @@ function E({
70
70
  className: "mapui:h-4 mapui:w-4 mapui:cursor-pointer mapui:accent-blue-600"
71
71
  }
72
72
  ),
73
- /* @__PURE__ */ s("span", { className: "mapui:text-sm mapui:text-gray-800", children: a.label })
73
+ /* @__PURE__ */ u("span", { className: "mapui:text-sm mapui:text-gray-800 mapui:truncate", children: a.label })
74
74
  ] })
75
75
  ]
76
76
  },
@@ -62,7 +62,7 @@ function g({ layers: i, visibleLayerIds: p, className: n }) {
62
62
  className: `mapui:rounded-lg mapui:bg-white mapui:p-3 mapui:shadow-md mapui:text-sm${n ? ` ${n}` : ""}`,
63
63
  children: [
64
64
  /* @__PURE__ */ e("h3", { className: "mapui:m-0 mapui:mb-2 mapui:text-xs mapui:font-semibold mapui:uppercase mapui:tracking-wide mapui:text-gray-500", children: "Legend" }),
65
- /* @__PURE__ */ e("ul", { className: "mapui:m-0 mapui:list-none mapui:space-y-2 mapui:p-0", children: r.map(({ layer: a, entries: l }) => /* @__PURE__ */ e("li", { children: l.length === 1 ? /* @__PURE__ */ m("div", { className: "mapui:flex mapui:items-center mapui:gap-2", children: [
65
+ /* @__PURE__ */ e("ul", { className: "mapui:m-0 mapui:list-none mapui:space-y-2 mapui:p-0", children: r.map(({ layer: a, entries: l }) => /* @__PURE__ */ e("li", { children: l.length === 1 ? /* @__PURE__ */ m("div", { className: "mapui:flex mapui:items-center mapui:gap-2 mapui:min-w-0", children: [
66
66
  /* @__PURE__ */ e(
67
67
  s,
68
68
  {
@@ -70,16 +70,16 @@ function g({ layers: i, visibleLayerIds: p, className: n }) {
70
70
  shape: l[0].shape
71
71
  }
72
72
  ),
73
- /* @__PURE__ */ e("span", { className: "mapui:text-gray-700", children: l[0].label })
73
+ /* @__PURE__ */ e("span", { className: "mapui:text-gray-700 mapui:truncate", children: l[0].label })
74
74
  ] }) : /* @__PURE__ */ m("div", { children: [
75
75
  /* @__PURE__ */ e("div", { className: "mapui:mb-1 mapui:text-xs mapui:font-medium mapui:text-gray-600", children: a.label }),
76
76
  /* @__PURE__ */ e("ul", { className: "mapui:m-0 mapui:list-none mapui:space-y-1 mapui:p-0 mapui:pl-1", children: l.map((u, c) => /* @__PURE__ */ m(
77
77
  "li",
78
78
  {
79
- className: "mapui:flex mapui:items-center mapui:gap-2",
79
+ className: "mapui:flex mapui:items-center mapui:gap-2 mapui:min-w-0",
80
80
  children: [
81
81
  /* @__PURE__ */ e(s, { color: u.color, shape: u.shape }),
82
- /* @__PURE__ */ e("span", { className: "mapui:text-gray-700", children: u.label })
82
+ /* @__PURE__ */ e("span", { className: "mapui:text-gray-700 mapui:truncate", children: u.label })
83
83
  ]
84
84
  },
85
85
  `${u.label}-${c}`
@@ -0,0 +1,33 @@
1
+ import { jsx as t, jsxs as a } from "react/jsx-runtime";
2
+ function p(i) {
3
+ return i == null ? "--" : typeof i == "boolean" ? i ? "Yes" : "No" : Array.isArray(i) ? i.map(p).join(", ") : typeof i == "object" ? JSON.stringify(i) : String(i);
4
+ }
5
+ function f({
6
+ properties: i,
7
+ fields: s,
8
+ labels: r,
9
+ maxItems: n,
10
+ density: o = "default",
11
+ className: u = ""
12
+ }) {
13
+ const c = s ?? Object.keys(i), d = n != null ? c.slice(0, n) : c;
14
+ return o === "compact" ? /* @__PURE__ */ t("dl", { className: `mapui:m-0 mapui:text-xs ${u}`.trim(), children: d.map((m) => /* @__PURE__ */ a("div", { className: "mapui:flex mapui:gap-1 mapui:py-0.5", children: [
15
+ /* @__PURE__ */ a("dt", { className: "mapui:shrink-0 mapui:font-medium mapui:text-gray-500", children: [
16
+ (r == null ? void 0 : r[m]) ?? m,
17
+ ":"
18
+ ] }),
19
+ /* @__PURE__ */ t("dd", { className: "mapui:m-0 mapui:truncate mapui:text-gray-800", children: p(i[m]) })
20
+ ] }, m)) }) : /* @__PURE__ */ t(
21
+ "dl",
22
+ {
23
+ className: `mapui:m-0 mapui:grid mapui:grid-cols-2 mapui:gap-x-4 mapui:gap-y-2 mapui:text-sm ${u}`.trim(),
24
+ children: d.map((m) => /* @__PURE__ */ a("div", { className: "mapui:contents", children: [
25
+ /* @__PURE__ */ t("dt", { className: "mapui:break-words mapui:font-medium mapui:text-gray-500", children: (r == null ? void 0 : r[m]) ?? m }),
26
+ /* @__PURE__ */ t("dd", { className: "mapui:m-0 mapui:break-words mapui:text-gray-800", children: p(i[m]) })
27
+ ] }, m))
28
+ }
29
+ );
30
+ }
31
+ export {
32
+ f as P
33
+ };
@@ -0,0 +1,363 @@
1
+ import { jsxs as h, jsx as m } from "react/jsx-runtime";
2
+ import { useState as j, useRef as L, useId as D, useMemo as S, useCallback as A, useEffect as I } from "react";
3
+ function V({
4
+ value: e,
5
+ onChange: t,
6
+ suggestions: u,
7
+ onQueryChange: d,
8
+ placeholder: N = "",
9
+ className: l = "",
10
+ id: y
11
+ }) {
12
+ const [f, c] = j(!1), [p, o] = j(-1), g = L(null), i = D(), r = p >= 0 ? `${i}-option-${p}` : void 0, v = S(
13
+ () => u.filter((n) => n.toLowerCase().includes(e.toLowerCase())),
14
+ [u, e]
15
+ ), b = f && v.length > 0, a = A(
16
+ (n) => {
17
+ t(n), d == null || d(n), c(!1), o(-1);
18
+ },
19
+ [t, d]
20
+ ), x = (n) => {
21
+ const s = n.target.value;
22
+ t(s), d == null || d(s), c(!0), o(-1);
23
+ }, w = (n) => {
24
+ b && (n.key === "ArrowDown" ? (n.preventDefault(), o((s) => Math.min(s + 1, v.length - 1))) : n.key === "ArrowUp" ? (n.preventDefault(), o((s) => Math.max(s - 1, 0))) : n.key === "Enter" && p >= 0 ? (n.preventDefault(), a(v[p])) : n.key === "Escape" && (c(!1), o(-1)));
25
+ };
26
+ return I(() => {
27
+ const n = (s) => {
28
+ g.current && !g.current.contains(s.target) && (c(!1), o(-1));
29
+ };
30
+ return document.addEventListener("mousedown", n), () => document.removeEventListener("mousedown", n);
31
+ }, []), /* @__PURE__ */ h("div", { ref: g, className: `mapui:relative ${l}`.trim(), children: [
32
+ /* @__PURE__ */ m(
33
+ "input",
34
+ {
35
+ id: y,
36
+ type: "text",
37
+ value: e,
38
+ placeholder: N,
39
+ role: "combobox",
40
+ "aria-expanded": b,
41
+ "aria-autocomplete": "list",
42
+ "aria-controls": i,
43
+ "aria-activedescendant": r,
44
+ onChange: x,
45
+ onFocus: () => c(!0),
46
+ onKeyDown: w,
47
+ className: "mapui:w-full mapui:rounded mapui:border mapui:border-gray-300 mapui:px-2 mapui:py-1 mapui:text-sm mapui:outline-none focus:mapui:border-blue-500 focus:mapui:ring-1 focus:mapui:ring-blue-500"
48
+ }
49
+ ),
50
+ b && /* @__PURE__ */ m(
51
+ "ul",
52
+ {
53
+ id: i,
54
+ role: "listbox",
55
+ className: "mapui:absolute mapui:z-10 mapui:mt-1 mapui:w-full mapui:rounded mapui:border mapui:border-gray-200 mapui:bg-white mapui:shadow-lg mapui:max-h-48 mapui:overflow-y-auto mapui:p-0 mapui:m-0 mapui:list-none",
56
+ children: v.map((n, s) => /* @__PURE__ */ m(
57
+ "li",
58
+ {
59
+ id: `${i}-option-${s}`,
60
+ role: "option",
61
+ "aria-selected": s === p,
62
+ onMouseDown: (E) => {
63
+ E.preventDefault(), a(n);
64
+ },
65
+ className: `mapui:cursor-pointer mapui:px-2 mapui:py-1 mapui:text-sm ${s === p ? "mapui:bg-blue-100" : "hover:mapui:bg-gray-50"}`,
66
+ children: n
67
+ },
68
+ `${s}-${n}`
69
+ ))
70
+ }
71
+ )
72
+ ] });
73
+ }
74
+ function R({
75
+ startValue: e,
76
+ endValue: t,
77
+ onStartChange: u,
78
+ onEndChange: d,
79
+ className: N = "",
80
+ id: l
81
+ }) {
82
+ const y = D(), f = l ?? y, c = `${f}-start`, p = `${f}-end`, o = "mapui:flex-1 mapui:rounded mapui:border mapui:border-gray-300 mapui:px-2 mapui:py-1 mapui:text-sm mapui:outline-none focus:mapui:border-blue-500 focus:mapui:ring-1 focus:mapui:ring-blue-500";
83
+ return /* @__PURE__ */ h("div", { className: `mapui:flex mapui:flex-col mapui:gap-1 ${N}`.trim(), children: [
84
+ /* @__PURE__ */ h("div", { className: "mapui:flex mapui:items-center mapui:gap-2", children: [
85
+ /* @__PURE__ */ m("label", { htmlFor: c, className: "mapui:text-xs mapui:text-gray-400 mapui:w-8", children: "From" }),
86
+ /* @__PURE__ */ m(
87
+ "input",
88
+ {
89
+ id: c,
90
+ type: "datetime-local",
91
+ value: e,
92
+ onChange: (g) => u(g.target.value),
93
+ "aria-label": "Start date",
94
+ className: o
95
+ }
96
+ )
97
+ ] }),
98
+ /* @__PURE__ */ h("div", { className: "mapui:flex mapui:items-center mapui:gap-2", children: [
99
+ /* @__PURE__ */ m("label", { htmlFor: p, className: "mapui:text-xs mapui:text-gray-400 mapui:w-8", children: "To" }),
100
+ /* @__PURE__ */ m(
101
+ "input",
102
+ {
103
+ id: p,
104
+ type: "datetime-local",
105
+ value: t,
106
+ onChange: (g) => d(g.target.value),
107
+ "aria-label": "End date",
108
+ className: o
109
+ }
110
+ )
111
+ ] })
112
+ ] });
113
+ }
114
+ const k = {
115
+ eq: "=",
116
+ gt: ">",
117
+ lt: "<",
118
+ gte: ">=",
119
+ lte: "<=",
120
+ between: "between"
121
+ }, M = ["eq", "gt", "lt", "gte", "lte", "between"];
122
+ function O(e, t) {
123
+ if (e && typeof e == "object") {
124
+ if ("operator" in e) return e.operator;
125
+ if ("min" in e) return "between";
126
+ }
127
+ return t;
128
+ }
129
+ const $ = "mapui:rounded mapui:border mapui:border-gray-300 mapui:px-2 mapui:py-1 mapui:text-sm mapui:outline-none focus:mapui:border-blue-500 focus:mapui:ring-1 focus:mapui:ring-blue-500", K = "mapui:rounded mapui:border mapui:border-gray-300 mapui:px-2 mapui:py-1 mapui:text-sm mapui:outline-none focus:mapui:border-blue-500 focus:mapui:ring-1 focus:mapui:ring-blue-500 mapui:bg-white";
130
+ function P({ field: e, value: t, onChange: u, className: d = "", id: N }) {
131
+ const [l, y] = j(
132
+ () => O(t, e.operator)
133
+ );
134
+ I(() => {
135
+ y(O(t, e.operator));
136
+ }, [t, e.operator]);
137
+ const f = l === "between", c = e.inputMode === "slider" ? M.filter((a) => a !== "between") : M, p = (a) => {
138
+ if (y(a), a === "between")
139
+ u(void 0);
140
+ else if (f)
141
+ u(void 0);
142
+ else if (t && typeof t == "object" && "value" in t) {
143
+ const x = t.value;
144
+ u({ value: x, operator: a });
145
+ }
146
+ }, o = (a) => {
147
+ u(a === "" ? void 0 : { value: Number(a), operator: l });
148
+ }, g = (a) => {
149
+ const x = t && typeof t == "object" && "max" in t ? t.max : void 0;
150
+ u(a === "" ? x === void 0 ? void 0 : { min: e.min ?? 0, max: x } : { min: Number(a), max: x ?? e.max ?? 0 });
151
+ }, i = (a) => {
152
+ const x = t && typeof t == "object" && "min" in t ? t.min : void 0;
153
+ u(a === "" ? x === void 0 ? void 0 : { min: x, max: e.max ?? 0 } : { min: x ?? e.min ?? 0, max: Number(a) });
154
+ }, r = t && typeof t == "object" && "value" in t ? String(t.value) : "", v = t && typeof t == "object" && "min" in t ? String(t.min) : "", b = t && typeof t == "object" && "max" in t ? String(t.max) : "";
155
+ return /* @__PURE__ */ h("div", { className: `mapui:flex mapui:flex-col mapui:gap-1 ${d}`.trim(), children: [
156
+ /* @__PURE__ */ m(
157
+ "select",
158
+ {
159
+ value: l,
160
+ onChange: (a) => p(a.target.value),
161
+ "aria-label": `${e.label} operator`,
162
+ className: K,
163
+ children: c.map((a) => /* @__PURE__ */ m("option", { value: a, children: k[a] }, a))
164
+ }
165
+ ),
166
+ f ? (
167
+ /* Between: min + max inputs */
168
+ /* @__PURE__ */ h("div", { className: "mapui:flex mapui:gap-2", children: [
169
+ /* @__PURE__ */ m(
170
+ "input",
171
+ {
172
+ type: "number",
173
+ value: v,
174
+ placeholder: e.min !== void 0 ? String(e.min) : "Min",
175
+ min: e.min,
176
+ max: e.max,
177
+ step: e.step,
178
+ onChange: (a) => g(a.target.value),
179
+ "aria-label": `${e.label} minimum`,
180
+ className: `${$} mapui:w-1/2`
181
+ }
182
+ ),
183
+ /* @__PURE__ */ m(
184
+ "input",
185
+ {
186
+ type: "number",
187
+ value: b,
188
+ placeholder: e.max !== void 0 ? String(e.max) : "Max",
189
+ min: e.min,
190
+ max: e.max,
191
+ step: e.step,
192
+ onChange: (a) => i(a.target.value),
193
+ "aria-label": `${e.label} maximum`,
194
+ className: `${$} mapui:w-1/2`
195
+ }
196
+ )
197
+ ] })
198
+ ) : e.inputMode === "slider" ? (
199
+ /* Slider */
200
+ /* @__PURE__ */ h("div", { className: "mapui:flex mapui:items-center mapui:gap-2", children: [
201
+ /* @__PURE__ */ m(
202
+ "input",
203
+ {
204
+ type: "range",
205
+ value: r !== "" ? r : e.min ?? 0,
206
+ min: e.min ?? 0,
207
+ max: e.max ?? 100,
208
+ step: e.step ?? 1,
209
+ onChange: (a) => o(a.target.value),
210
+ "aria-label": e.label,
211
+ className: "mapui:flex-1"
212
+ }
213
+ ),
214
+ /* @__PURE__ */ m("span", { className: "mapui:text-xs mapui:text-gray-600 mapui:min-w-12 mapui:whitespace-nowrap mapui:text-right", children: r !== "" ? r : e.min ?? 0 })
215
+ ] })
216
+ ) : (
217
+ /* Number input */
218
+ /* @__PURE__ */ m(
219
+ "input",
220
+ {
221
+ id: N,
222
+ type: "number",
223
+ value: r,
224
+ placeholder: e.placeholder ?? "",
225
+ min: e.min,
226
+ max: e.max,
227
+ step: e.step,
228
+ onChange: (a) => o(a.target.value),
229
+ className: $
230
+ }
231
+ )
232
+ )
233
+ ] });
234
+ }
235
+ function q(e) {
236
+ return e === void 0 || e === "" || e === null ? !1 : typeof e == "object" && "start" in e && "end" in e ? e.start !== "" || e.end !== "" : !0;
237
+ }
238
+ function _({
239
+ layers: e,
240
+ activeFilters: t,
241
+ onFilterChange: u,
242
+ onClearFilters: d,
243
+ autocompleteSuggestions: N = {},
244
+ onFetchSuggestions: l,
245
+ className: y = "",
246
+ hideTitle: f
247
+ }) {
248
+ const c = S(
249
+ () => e.filter((p) => {
250
+ var o;
251
+ return (o = p.search) == null ? void 0 : o.fields.length;
252
+ }),
253
+ [e]
254
+ );
255
+ return I(() => {
256
+ if (l)
257
+ for (const p of c)
258
+ for (const o of p.search.fields)
259
+ o.type === "select" && o.prefetch && l(p.id, o.property, "", { prefetch: !0 });
260
+ }, [c, l]), c.length === 0 ? /* @__PURE__ */ h("div", { className: `mapui:flex mapui:flex-col mapui:gap-1 ${y}`.trim(), children: [
261
+ !f && /* @__PURE__ */ m("h3", { className: "mapui:m-0 mapui:mb-2 mapui:text-sm mapui:font-semibold mapui:text-gray-700", children: "Search & Filter" }),
262
+ /* @__PURE__ */ m("p", { className: "mapui:m-0 mapui:text-xs mapui:text-gray-500", children: "No searchable layers configured." })
263
+ ] }) : /* @__PURE__ */ h("div", { className: `mapui:flex mapui:flex-col mapui:gap-3 ${y}`.trim(), children: [
264
+ !f && /* @__PURE__ */ m("h3", { className: "mapui:m-0 mapui:mb-2 mapui:text-sm mapui:font-semibold mapui:text-gray-700", children: "Search & Filter" }),
265
+ c.map((p) => {
266
+ const o = t[p.id] ?? {}, g = Object.values(o).some(q);
267
+ return /* @__PURE__ */ h("div", { className: "mapui:flex mapui:flex-col mapui:gap-2 mapui:border-b mapui:border-gray-100 mapui:pb-2 last:mapui:border-0", children: [
268
+ /* @__PURE__ */ h("div", { className: "mapui:flex mapui:items-center mapui:justify-between", children: [
269
+ /* @__PURE__ */ m("span", { className: "mapui:text-xs mapui:font-medium mapui:text-gray-600", children: p.label }),
270
+ g && /* @__PURE__ */ m(
271
+ "button",
272
+ {
273
+ type: "button",
274
+ onClick: () => d(p.id),
275
+ className: "mapui:cursor-pointer mapui:border-none mapui:bg-transparent mapui:p-0 mapui:text-xs mapui:text-blue-600 hover:mapui:text-blue-800",
276
+ children: "Clear"
277
+ }
278
+ )
279
+ ] }),
280
+ p.search.fields.map((i) => {
281
+ const r = o[i.property], v = `${p.id}:${i.property}`, b = `search-${p.id}-${i.property}`;
282
+ return /* @__PURE__ */ h("div", { className: "mapui:flex mapui:flex-col mapui:gap-0.5", children: [
283
+ /* @__PURE__ */ m("label", { htmlFor: b, className: "mapui:text-xs mapui:text-gray-500", children: i.label }),
284
+ i.type === "text" && i.autocomplete ? /* @__PURE__ */ m(
285
+ V,
286
+ {
287
+ id: b,
288
+ value: r ?? "",
289
+ onChange: (a) => u(p.id, i.property, a || void 0),
290
+ suggestions: [.../* @__PURE__ */ new Set([
291
+ ...N[v] ?? [],
292
+ ...i.options ?? []
293
+ ])],
294
+ onQueryChange: (a) => l == null ? void 0 : l(p.id, i.property, a, { prefetch: i.prefetch }),
295
+ placeholder: i.placeholder ?? ""
296
+ }
297
+ ) : i.type === "text" ? /* @__PURE__ */ m(
298
+ "input",
299
+ {
300
+ id: b,
301
+ type: "text",
302
+ value: r ?? "",
303
+ placeholder: i.placeholder ?? "",
304
+ onChange: (a) => u(p.id, i.property, a.target.value || void 0),
305
+ className: "mapui:rounded mapui:border mapui:border-gray-300 mapui:px-2 mapui:py-1 mapui:text-sm mapui:outline-none focus:mapui:border-blue-500 focus:mapui:ring-1 focus:mapui:ring-blue-500"
306
+ }
307
+ ) : i.type === "datetime" && i.range ? /* @__PURE__ */ m(
308
+ R,
309
+ {
310
+ id: b,
311
+ startValue: r && typeof r == "object" && "start" in r ? r.start : "",
312
+ endValue: r && typeof r == "object" && "end" in r ? r.end : "",
313
+ onStartChange: (a) => u(p.id, i.property, {
314
+ start: a,
315
+ end: r && typeof r == "object" && "end" in r ? r.end : ""
316
+ }),
317
+ onEndChange: (a) => u(p.id, i.property, {
318
+ start: r && typeof r == "object" && "start" in r ? r.start : "",
319
+ end: a
320
+ })
321
+ }
322
+ ) : i.type === "datetime" ? /* @__PURE__ */ m(
323
+ "input",
324
+ {
325
+ id: b,
326
+ type: "datetime-local",
327
+ value: r ?? "",
328
+ onChange: (a) => u(p.id, i.property, a.target.value || void 0),
329
+ className: "mapui:rounded mapui:border mapui:border-gray-300 mapui:px-2 mapui:py-1 mapui:text-sm mapui:outline-none focus:mapui:border-blue-500 focus:mapui:ring-1 focus:mapui:ring-blue-500"
330
+ }
331
+ ) : i.type === "number" ? /* @__PURE__ */ m(
332
+ P,
333
+ {
334
+ id: b,
335
+ field: i,
336
+ value: r,
337
+ onChange: (a) => u(p.id, i.property, a)
338
+ }
339
+ ) : i.type === "select" ? (() => {
340
+ const a = i, x = N[v] ?? [], w = a.options ?? [], n = [.../* @__PURE__ */ new Set([...x, ...w])];
341
+ return /* @__PURE__ */ h(
342
+ "select",
343
+ {
344
+ id: b,
345
+ value: r ?? "",
346
+ onChange: (s) => u(p.id, i.property, s.target.value || void 0),
347
+ className: "mapui:rounded mapui:border mapui:border-gray-300 mapui:px-2 mapui:py-1 mapui:text-sm mapui:outline-none focus:mapui:border-blue-500 focus:mapui:ring-1 focus:mapui:ring-blue-500",
348
+ children: [
349
+ /* @__PURE__ */ m("option", { value: "", children: i.placeholder ?? "Select..." }),
350
+ n.map((s) => /* @__PURE__ */ m("option", { value: s, children: s }, s))
351
+ ]
352
+ }
353
+ );
354
+ })() : null
355
+ ] }, i.property);
356
+ })
357
+ ] }, p.id);
358
+ })
359
+ ] });
360
+ }
361
+ export {
362
+ _ as S
363
+ };
@@ -0,0 +1,7 @@
1
+ import { BasemapConfig } from '../../types';
2
+ export interface BasemapEditorProps {
3
+ value: BasemapConfig;
4
+ onChange: (basemap: BasemapConfig) => void;
5
+ }
6
+ export declare function BasemapEditor({ value, onChange }: BasemapEditorProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=BasemapEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasemapEditor.d.ts","sourceRoot":"","sources":["../../../src/components/BasemapEditor/BasemapEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;CAC5C;AAKD,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAqDpE"}
@@ -0,0 +1,7 @@
1
+ import { BasemapConfig } from '../../types';
2
+ export interface BasemapListProps {
3
+ basemaps: BasemapConfig[];
4
+ onChange: (basemaps: BasemapConfig[]) => void;
5
+ }
6
+ export declare function BasemapList({ basemaps, onChange }: BasemapListProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=BasemapList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BasemapList.d.ts","sourceRoot":"","sources":["../../../src/components/BasemapEditor/BasemapList.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;CAC/C;AAID,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CA4HnE"}
@@ -0,0 +1,5 @@
1
+ export { BasemapEditor } from './BasemapEditor';
2
+ export type { BasemapEditorProps } from './BasemapEditor';
3
+ export { BasemapList } from './BasemapList';
4
+ export type { BasemapListProps } from './BasemapList';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/BasemapEditor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface CollectionBrowserProps {
2
+ sourceUrl: string;
3
+ selectedCollectionIds: string[];
4
+ onSelect: (collectionId: string) => void;
5
+ onDeselect: (collectionId: string) => void;
6
+ }
7
+ export declare function CollectionBrowser({ sourceUrl, selectedCollectionIds, onSelect, onDeselect, }: CollectionBrowserProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=CollectionBrowser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollectionBrowser.d.ts","sourceRoot":"","sources":["../../../src/components/CollectionBrowser/CollectionBrowser.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C;AAED,wBAAgB,iBAAiB,CAAC,EAChC,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,UAAU,GACX,EAAE,sBAAsB,2CAiExB"}