@rosettadash/react 0.1.1 → 0.1.3

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 (177) hide show
  1. package/package.json +87 -2
  2. package/src/domain/i18n/app-language-select/AppLanguageSelect.d.ts +17 -0
  3. package/src/domain/i18n/app-language-select/AppLanguageSelect.js +24 -0
  4. package/src/domain/i18n/app-language-select/AppLanguageSelect.js.map +1 -0
  5. package/src/domain/i18n/app-language-select/index.d.ts +2 -0
  6. package/src/domain/i18n/app-language-select/index.js +2 -0
  7. package/src/domain/i18n/app-language-select/index.js.map +1 -0
  8. package/src/domain/role-gate/RoleGate.d.ts +3 -0
  9. package/src/domain/role-gate/RoleGate.js +22 -4
  10. package/src/domain/role-gate/RoleGate.js.map +1 -1
  11. package/src/index.d.ts +15 -0
  12. package/src/index.js +15 -0
  13. package/src/index.js.map +1 -1
  14. package/src/infra/env/EnvConfig.d.ts +5 -0
  15. package/src/infra/env/EnvConfig.js +17 -2
  16. package/src/infra/env/EnvConfig.js.map +1 -1
  17. package/src/infra/env/index.d.ts +1 -1
  18. package/src/layout/collapsible/Collapsible.d.ts +1 -0
  19. package/src/layout/collapsible/Collapsible.js +16 -5
  20. package/src/layout/collapsible/Collapsible.js.map +1 -1
  21. package/src/layout/filter-grid/FilterGrid.d.ts +26 -0
  22. package/src/layout/filter-grid/FilterGrid.js +21 -0
  23. package/src/layout/filter-grid/FilterGrid.js.map +1 -0
  24. package/src/layout/filter-grid/index.d.ts +2 -0
  25. package/src/layout/filter-grid/index.js +2 -0
  26. package/src/layout/filter-grid/index.js.map +1 -0
  27. package/src/layout/flex/FlexLayout.d.ts +3 -0
  28. package/src/layout/flex/FlexLayout.js +24 -4
  29. package/src/layout/flex/FlexLayout.js.map +1 -1
  30. package/src/layout/form-section/FormSectionGrid.d.ts +21 -0
  31. package/src/layout/form-section/FormSectionGrid.js +16 -0
  32. package/src/layout/form-section/FormSectionGrid.js.map +1 -0
  33. package/src/layout/form-section/index.d.ts +2 -0
  34. package/src/layout/form-section/index.js +2 -0
  35. package/src/layout/form-section/index.js.map +1 -0
  36. package/src/layout/geo-explorer/GeoExplorerLayout.d.ts +18 -0
  37. package/src/layout/geo-explorer/GeoExplorerLayout.js +14 -0
  38. package/src/layout/geo-explorer/GeoExplorerLayout.js.map +1 -0
  39. package/src/layout/geo-explorer/index.d.ts +2 -0
  40. package/src/layout/geo-explorer/index.js +2 -0
  41. package/src/layout/geo-explorer/index.js.map +1 -0
  42. package/src/layout/scroll-region/ScrollRegion.d.ts +13 -0
  43. package/src/layout/scroll-region/ScrollRegion.js +15 -0
  44. package/src/layout/scroll-region/ScrollRegion.js.map +1 -0
  45. package/src/layout/scroll-region/index.d.ts +2 -0
  46. package/src/layout/scroll-region/index.js +2 -0
  47. package/src/layout/scroll-region/index.js.map +1 -0
  48. package/src/layout/tabs/TabsLayout.d.ts +1 -0
  49. package/src/layout/tabs/TabsLayout.js +7 -2
  50. package/src/layout/tabs/TabsLayout.js.map +1 -1
  51. package/src/lib/custom-element-host.js +2 -2
  52. package/src/lib/custom-element-host.js.map +1 -1
  53. package/src/visual/chart/bar/BarChart.d.ts +7 -0
  54. package/src/visual/chart/bar/BarChart.js +32 -2
  55. package/src/visual/chart/bar/BarChart.js.map +1 -1
  56. package/src/visual/chart/bar/index.d.ts +1 -1
  57. package/src/visual/chart/line/LineChart.d.ts +8 -0
  58. package/src/visual/chart/line/LineChart.js +58 -2
  59. package/src/visual/chart/line/LineChart.js.map +1 -1
  60. package/src/visual/chart/line/index.d.ts +1 -1
  61. package/src/visual/chart/sankey/JourneySankeyChart.d.ts +20 -0
  62. package/src/visual/chart/sankey/JourneySankeyChart.js +105 -0
  63. package/src/visual/chart/sankey/JourneySankeyChart.js.map +1 -0
  64. package/src/visual/chart/sankey/index.d.ts +2 -0
  65. package/src/visual/chart/sankey/index.js +2 -0
  66. package/src/visual/chart/sankey/index.js.map +1 -0
  67. package/src/visual/chart/venn/VennOverlapChart.d.ts +22 -0
  68. package/src/visual/chart/venn/VennOverlapChart.js +24 -0
  69. package/src/visual/chart/venn/VennOverlapChart.js.map +1 -0
  70. package/src/visual/chart/venn/index.d.ts +2 -0
  71. package/src/visual/chart/venn/index.js +2 -0
  72. package/src/visual/chart/venn/index.js.map +1 -0
  73. package/src/visual/destination/destination-select-list/DestinationSelectList.d.ts +16 -0
  74. package/src/visual/destination/destination-select-list/DestinationSelectList.js +39 -0
  75. package/src/visual/destination/destination-select-list/DestinationSelectList.js.map +1 -0
  76. package/src/visual/destination/destination-select-list/index.d.ts +2 -0
  77. package/src/visual/destination/destination-select-list/index.js +2 -0
  78. package/src/visual/destination/destination-select-list/index.js.map +1 -0
  79. package/src/visual/detail/DetailHistoricList.d.ts +14 -0
  80. package/src/visual/detail/DetailHistoricList.js +10 -0
  81. package/src/visual/detail/DetailHistoricList.js.map +1 -0
  82. package/src/visual/detail/DetailPanel.js +1 -1
  83. package/src/visual/detail/DetailPanel.js.map +1 -1
  84. package/src/visual/detail/DetailStats.d.ts +13 -0
  85. package/src/visual/detail/DetailStats.js +10 -0
  86. package/src/visual/detail/DetailStats.js.map +1 -0
  87. package/src/visual/detail/index.d.ts +4 -0
  88. package/src/visual/detail/index.js +2 -0
  89. package/src/visual/detail/index.js.map +1 -1
  90. package/src/visual/display/3d-geo-globe/ThreeGeoGlobe.d.ts +12 -2
  91. package/src/visual/display/3d-geo-globe/ThreeGeoGlobe.js +241 -7
  92. package/src/visual/display/3d-geo-globe/ThreeGeoGlobe.js.map +1 -1
  93. package/src/visual/display/3d-scatter/ThreeScatterPlot.d.ts +15 -2
  94. package/src/visual/display/3d-scatter/ThreeScatterPlot.js +152 -7
  95. package/src/visual/display/3d-scatter/ThreeScatterPlot.js.map +1 -1
  96. package/src/visual/display/3d-scatter/index.d.ts +1 -1
  97. package/src/visual/display/equirect-globe/EquirectGlobe.d.ts +21 -0
  98. package/src/visual/display/equirect-globe/EquirectGlobe.js +28 -0
  99. package/src/visual/display/equirect-globe/EquirectGlobe.js.map +1 -0
  100. package/src/visual/display/equirect-globe/index.d.ts +2 -0
  101. package/src/visual/display/equirect-globe/index.js +2 -0
  102. package/src/visual/display/equirect-globe/index.js.map +1 -0
  103. package/src/visual/display/geo-map/GeoMap.d.ts +22 -0
  104. package/src/visual/display/geo-map/GeoMap.js +29 -0
  105. package/src/visual/display/geo-map/GeoMap.js.map +1 -0
  106. package/src/visual/display/geo-map/index.d.ts +2 -0
  107. package/src/visual/display/geo-map/index.js +2 -0
  108. package/src/visual/display/geo-map/index.js.map +1 -0
  109. package/src/visual/filter/filter-summary/FilterSummary.d.ts +16 -0
  110. package/src/visual/filter/filter-summary/FilterSummary.js +9 -0
  111. package/src/visual/filter/filter-summary/FilterSummary.js.map +1 -0
  112. package/src/visual/filter/filter-summary/index.d.ts +2 -0
  113. package/src/visual/filter/filter-summary/index.js +2 -0
  114. package/src/visual/filter/filter-summary/index.js.map +1 -0
  115. package/src/visual/input/date-range/DateRangeFilter.d.ts +4 -0
  116. package/src/visual/input/date-range/DateRangeFilter.js +3 -1
  117. package/src/visual/input/date-range/DateRangeFilter.js.map +1 -1
  118. package/src/visual/input/number/NumberInput.d.ts +1 -0
  119. package/src/visual/input/number/NumberInput.js +1 -1
  120. package/src/visual/input/number/NumberInput.js.map +1 -1
  121. package/src/visual/input/text/TextInput.d.ts +1 -0
  122. package/src/visual/input/text/TextInput.js +2 -1
  123. package/src/visual/input/text/TextInput.js.map +1 -1
  124. package/src/visual/link-list/LinkList.d.ts +3 -0
  125. package/src/visual/link-list/LinkList.js +3 -2
  126. package/src/visual/link-list/LinkList.js.map +1 -1
  127. package/src/visual/media/carousel/SlideCarousel.d.ts +19 -0
  128. package/src/visual/media/carousel/SlideCarousel.js +39 -0
  129. package/src/visual/media/carousel/SlideCarousel.js.map +1 -0
  130. package/src/visual/media/carousel/index.d.ts +2 -0
  131. package/src/visual/media/carousel/index.js +2 -0
  132. package/src/visual/media/carousel/index.js.map +1 -0
  133. package/src/visual/media/equirect-sphere-viewport/EquirectSphereViewport.d.ts +45 -0
  134. package/src/visual/media/equirect-sphere-viewport/EquirectSphereViewport.js +527 -0
  135. package/src/visual/media/equirect-sphere-viewport/EquirectSphereViewport.js.map +1 -0
  136. package/src/visual/media/equirect-sphere-viewport/index.d.ts +2 -0
  137. package/src/visual/media/equirect-sphere-viewport/index.js +2 -0
  138. package/src/visual/media/equirect-sphere-viewport/index.js.map +1 -0
  139. package/src/visual/media/equirect-sphere-viewport/planet-shader.d.ts +6 -0
  140. package/src/visual/media/equirect-sphere-viewport/planet-shader.js +69 -0
  141. package/src/visual/media/equirect-sphere-viewport/planet-shader.js.map +1 -0
  142. package/src/visual/media/flat-video-viewport/FlatVideoViewport.d.ts +32 -0
  143. package/src/visual/media/flat-video-viewport/FlatVideoViewport.js +317 -0
  144. package/src/visual/media/flat-video-viewport/FlatVideoViewport.js.map +1 -0
  145. package/src/visual/media/flat-video-viewport/index.d.ts +2 -0
  146. package/src/visual/media/flat-video-viewport/index.js +2 -0
  147. package/src/visual/media/flat-video-viewport/index.js.map +1 -0
  148. package/src/visual/media/video-metadata/VideoMetadataPanel.d.ts +13 -0
  149. package/src/visual/media/video-metadata/VideoMetadataPanel.js +8 -0
  150. package/src/visual/media/video-metadata/VideoMetadataPanel.js.map +1 -0
  151. package/src/visual/media/video-metadata/index.d.ts +2 -0
  152. package/src/visual/media/video-metadata/index.js +2 -0
  153. package/src/visual/media/video-metadata/index.js.map +1 -0
  154. package/src/visual/media/video-source/VideoSource.d.ts +2 -0
  155. package/src/visual/media/video-source/VideoSource.js +6 -2
  156. package/src/visual/media/video-source/VideoSource.js.map +1 -1
  157. package/src/visual/media/youtube-embed/YoutubeEmbed.d.ts +14 -0
  158. package/src/visual/media/youtube-embed/YoutubeEmbed.js +21 -0
  159. package/src/visual/media/youtube-embed/YoutubeEmbed.js.map +1 -0
  160. package/src/visual/media/youtube-embed/index.d.ts +2 -0
  161. package/src/visual/media/youtube-embed/index.js +2 -0
  162. package/src/visual/media/youtube-embed/index.js.map +1 -0
  163. package/src/visual/news/article-detail/NewsArticleDetail.js +2 -2
  164. package/src/visual/news/article-detail/NewsArticleDetail.js.map +1 -1
  165. package/src/visual/news/results-table/NewsResultsTable.d.ts +14 -0
  166. package/src/visual/news/results-table/NewsResultsTable.js +30 -3
  167. package/src/visual/news/results-table/NewsResultsTable.js.map +1 -1
  168. package/src/visual/news/results-table/index.d.ts +1 -1
  169. package/src/visual/plugin/metric-chip/MetricChip.js +1 -1
  170. package/src/visual/plugin/metric-chip/MetricChip.js.map +1 -1
  171. package/src/visual/table/DataTable.d.ts +11 -1
  172. package/src/visual/table/DataTable.js +31 -2
  173. package/src/visual/table/DataTable.js.map +1 -1
  174. package/src/visual/table/index.d.ts +1 -1
  175. package/src/visual/wasm/media/WasmMedia.d.ts +6 -0
  176. package/src/visual/wasm/media/WasmMedia.js +9 -3
  177. package/src/visual/wasm/media/WasmMedia.js.map +1 -1
@@ -1,10 +1,155 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { forwardRef } from 'react';
3
- /** @rosettadash/react/visual/display/3d-scatter visual.display.3d-scatter */
4
- export const ThreeScatterPlot = forwardRef(function ThreeScatterPlot(props, ref) {
5
- var _a;
6
- const { className, style, children } = props;
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef, useEffect, useRef } from 'react';
3
+ import * as THREE from 'three';
4
+ import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
5
+ const FALLBACK_POINTS = [
6
+ { id: 'a', label: 'A', x: 1, y: 2, z: 3 },
7
+ { id: 'b', label: 'B', x: 3, y: 1, z: 2 },
8
+ { id: 'c', label: 'C', x: 2, y: 3, z: 1 },
9
+ ];
10
+ function normalizePoints(points) {
11
+ if (!points.length) {
12
+ return [];
13
+ }
14
+ const xs = points.map((point) => point.x);
15
+ const ys = points.map((point) => point.y);
16
+ const zs = points.map((point) => point.z);
17
+ const minX = Math.min(...xs);
18
+ const maxX = Math.max(...xs);
19
+ const minY = Math.min(...ys);
20
+ const maxY = Math.max(...ys);
21
+ const minZ = Math.min(...zs);
22
+ const maxZ = Math.max(...zs);
23
+ const spanX = maxX - minX || 1;
24
+ const spanY = maxY - minY || 1;
25
+ const spanZ = maxZ - minZ || 1;
26
+ return points.map((point) => (Object.assign(Object.assign({}, point), { nx: ((point.x - minX) / spanX - 0.5) * 4, ny: ((point.y - minY) / spanY - 0.5) * 4, nz: ((point.z - minZ) / spanZ - 0.5) * 4 })));
27
+ }
28
+ /** @rosettadash/react/visual/display/3d-scatter — Three.js scatter plot (price / distance / rating) */
29
+ export const ThreeScatterPlot = forwardRef(function ThreeScatterPlot({ title, points = [], xAxisLabel, yAxisLabel, zAxisLabel, selectedId, onPointSelect, minHeight = '20rem', className, style, children, }, ref) {
30
+ const hostRef = useRef(null);
31
+ const pointMeshesRef = useRef(new Map());
32
+ const syncPointsRef = useRef(null);
33
+ const propsRef = useRef({ points, selectedId, onPointSelect });
34
+ propsRef.current = { points, selectedId, onPointSelect };
7
35
  const rootClass = ['rd-display-3d-scatter', className].filter(Boolean).join(' ');
8
- return (_jsx("section", { ref: ref, className: rootClass, style: style, "data-testid": "rd-display-3d-scatter", "data-three-mode": props.mode, "data-three-title": props.title, "aria-label": (_a = props.title) !== null && _a !== void 0 ? _a : '3D host', children: children }));
36
+ const hostStyle = Object.assign(Object.assign({}, style), { minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight });
37
+ useEffect(() => {
38
+ const host = hostRef.current;
39
+ if (!host) {
40
+ return;
41
+ }
42
+ const scene = new THREE.Scene();
43
+ scene.background = new THREE.Color('#0f172a');
44
+ const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 100);
45
+ camera.position.set(5, 4, 6);
46
+ const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
47
+ renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
48
+ renderer.domElement.style.display = 'block';
49
+ renderer.domElement.style.width = '100%';
50
+ renderer.domElement.style.height = '100%';
51
+ host.appendChild(renderer.domElement);
52
+ scene.add(new THREE.AmbientLight(0xffffff, 0.75));
53
+ const keyLight = new THREE.DirectionalLight(0xffffff, 1);
54
+ keyLight.position.set(4, 6, 5);
55
+ scene.add(keyLight);
56
+ const grid = new THREE.GridHelper(5, 10, '#334155', '#1e293b');
57
+ grid.position.y = -2.2;
58
+ scene.add(grid);
59
+ const axes = new THREE.AxesHelper(2.5);
60
+ scene.add(axes);
61
+ const pointGeometry = new THREE.SphereGeometry(0.12, 12, 12);
62
+ const raycaster = new THREE.Raycaster();
63
+ const pointer = new THREE.Vector2();
64
+ const syncPoints = () => {
65
+ const { points: nextPoints, selectedId: nextSelected } = propsRef.current;
66
+ const meshes = pointMeshesRef.current;
67
+ const normalized = normalizePoints(nextPoints.length ? nextPoints : FALLBACK_POINTS);
68
+ for (const id of [...meshes.keys()]) {
69
+ if (!normalized.some((point) => point.id === id)) {
70
+ const mesh = meshes.get(id);
71
+ if (mesh) {
72
+ mesh.material.dispose();
73
+ mesh.removeFromParent();
74
+ }
75
+ meshes.delete(id);
76
+ }
77
+ }
78
+ for (const point of normalized) {
79
+ let mesh = meshes.get(point.id);
80
+ if (!mesh) {
81
+ mesh = new THREE.Mesh(pointGeometry, new THREE.MeshStandardMaterial({ color: '#38bdf8' }));
82
+ mesh.userData['id'] = point.id;
83
+ scene.add(mesh);
84
+ meshes.set(point.id, mesh);
85
+ }
86
+ mesh.position.set(point.nx, point.ny, point.nz);
87
+ const material = mesh.material;
88
+ const selected = point.id === nextSelected;
89
+ material.color.set(selected ? '#fbbf24' : '#38bdf8');
90
+ material.emissive.set(selected ? '#92400e' : '#000000');
91
+ material.emissiveIntensity = selected ? 0.35 : 0;
92
+ }
93
+ };
94
+ syncPoints();
95
+ syncPointsRef.current = syncPoints;
96
+ const controls = new OrbitControls(camera, renderer.domElement);
97
+ controls.enableDamping = true;
98
+ controls.dampingFactor = 0.08;
99
+ controls.minDistance = 3;
100
+ controls.maxDistance = 14;
101
+ const resize = () => {
102
+ const width = host.clientWidth || 1;
103
+ const height = host.clientHeight || 1;
104
+ camera.aspect = width / height;
105
+ camera.updateProjectionMatrix();
106
+ renderer.setSize(width, height, false);
107
+ };
108
+ const resizeObserver = new ResizeObserver(resize);
109
+ resizeObserver.observe(host);
110
+ resize();
111
+ let animationId = 0;
112
+ const tick = () => {
113
+ controls.update();
114
+ renderer.render(scene, camera);
115
+ animationId = requestAnimationFrame(tick);
116
+ };
117
+ tick();
118
+ const onPointerDown = (event) => {
119
+ var _a, _b, _c, _d;
120
+ const rect = renderer.domElement.getBoundingClientRect();
121
+ pointer.x = ((event.clientX - rect.left) / rect.width) * 2 - 1;
122
+ pointer.y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
123
+ raycaster.setFromCamera(pointer, camera);
124
+ const hits = raycaster.intersectObjects([...pointMeshesRef.current.values()]);
125
+ const hit = (_a = hits[0]) === null || _a === void 0 ? void 0 : _a.object;
126
+ const id = (_b = hit === null || hit === void 0 ? void 0 : hit.userData) === null || _b === void 0 ? void 0 : _b['id'];
127
+ if (id) {
128
+ (_d = (_c = propsRef.current).onPointSelect) === null || _d === void 0 ? void 0 : _d.call(_c, id);
129
+ }
130
+ };
131
+ renderer.domElement.addEventListener('pointerdown', onPointerDown);
132
+ return () => {
133
+ syncPointsRef.current = null;
134
+ renderer.domElement.removeEventListener('pointerdown', onPointerDown);
135
+ cancelAnimationFrame(animationId);
136
+ resizeObserver.disconnect();
137
+ controls.dispose();
138
+ pointMeshesRef.current.forEach((mesh) => {
139
+ mesh.material.dispose();
140
+ mesh.removeFromParent();
141
+ });
142
+ pointMeshesRef.current.clear();
143
+ pointGeometry.dispose();
144
+ renderer.dispose();
145
+ renderer.domElement.remove();
146
+ };
147
+ }, []);
148
+ useEffect(() => {
149
+ var _a;
150
+ (_a = syncPointsRef.current) === null || _a === void 0 ? void 0 : _a.call(syncPointsRef);
151
+ }, [points, selectedId]);
152
+ const axisHint = [xAxisLabel, yAxisLabel, zAxisLabel].filter(Boolean).join(' · ');
153
+ return (_jsxs("section", { ref: ref, className: rootClass, style: hostStyle, "data-testid": "rd-display-3d-scatter", "aria-label": title !== null && title !== void 0 ? title : '3D scatter plot', children: [title ? _jsx("header", { className: "rd-display-3d-scatter__header", children: title }) : null, axisHint ? _jsx("p", { className: "rd-display-3d-scatter__axes", children: axisHint }) : null, _jsx("div", { ref: hostRef, className: "rd-display-3d-scatter__canvas-host" }), children] }));
9
154
  });
10
155
  //# sourceMappingURL=ThreeScatterPlot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ThreeScatterPlot.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/display/3d-scatter/ThreeScatterPlot.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsC,MAAM,OAAO,CAAC;AAUvE,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAqC,SAAS,gBAAgB,CACtG,KAAK,EACL,GAAG;;IAEH,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,uBAAuB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEjF,OAAO,CACL,kBAAS,GAAG,EAAE,GAAmC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,iBAAc,uBAAuB,qBAAkB,KAAK,CAAC,IAAI,sBAAoB,KAAK,CAAC,KAAK,gBAAc,MAAA,KAAK,CAAC,KAAK,mCAAI,SAAS,YAAG,QAAQ,GAAW,CAClP,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"ThreeScatterPlot.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/display/3d-scatter/ThreeScatterPlot.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export type { ThreeScatterPlotProps } from './ThreeScatterPlot.js';
1
+ export type { ScatterPlotPoint, ThreeScatterPlotProps } from './ThreeScatterPlot.js';
2
2
  export { ThreeScatterPlot } from './ThreeScatterPlot.js';
@@ -0,0 +1,21 @@
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
+ export interface EquirectGlobeMarker {
3
+ id: string;
4
+ lat: number;
5
+ lng: number;
6
+ label?: string;
7
+ }
8
+ export interface EquirectGlobeProps {
9
+ title?: string;
10
+ /** Equirectangular 2:1 world texture (lat/lng mapped to image x/y). */
11
+ imageUrl: string;
12
+ imageAttribution?: string;
13
+ markers?: EquirectGlobeMarker[];
14
+ selectedId?: string;
15
+ onMarkerSelect?: (id: string) => void;
16
+ className?: string;
17
+ style?: CSSProperties;
18
+ children?: ReactNode;
19
+ }
20
+ /** @rosettadash/react/visual/display/equirect-globe — equirectangular globe with marker overlay */
21
+ export declare const EquirectGlobe: import("react").ForwardRefExoticComponent<EquirectGlobeProps & import("react").RefAttributes<HTMLElement>>;
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ function project(lat, lng, width, height) {
4
+ return {
5
+ x: ((lng + 180) / 360) * width,
6
+ y: ((90 - lat) / 180) * height,
7
+ };
8
+ }
9
+ /** @rosettadash/react/visual/display/equirect-globe — equirectangular globe with marker overlay */
10
+ export const EquirectGlobe = forwardRef(function EquirectGlobe({ title = 'Equirectangular globe', imageUrl, imageAttribution, markers = [], selectedId, onMarkerSelect, className, style, children, }, ref) {
11
+ const rootClass = ['rd-equirect-globe', className].filter(Boolean).join(' ');
12
+ const width = 720;
13
+ const height = 360;
14
+ return (_jsxs("section", { ref: ref, className: rootClass, style: style, "data-testid": "rd-equirect-globe", "aria-label": title, children: [_jsxs("div", { className: "rd-equirect-globe__viewport", children: [_jsx("img", { className: "rd-equirect-globe__image", src: imageUrl, alt: title, width: width, height: height, loading: "lazy", decoding: "async" }), _jsx("svg", { className: "rd-equirect-globe__markers", viewBox: `0 0 ${width} ${height}`, role: "img", "aria-hidden": markers.length === 0, children: markers.map((marker) => {
15
+ var _a;
16
+ const { x, y } = project(marker.lat, marker.lng, width, height);
17
+ const selected = marker.id === selectedId;
18
+ return (_jsxs("g", { className: "rd-equirect-globe__marker", style: { cursor: onMarkerSelect ? 'pointer' : undefined }, onClick: onMarkerSelect ? () => onMarkerSelect(marker.id) : undefined, onKeyDown: onMarkerSelect
19
+ ? (event) => {
20
+ if (event.key === 'Enter' || event.key === ' ') {
21
+ event.preventDefault();
22
+ onMarkerSelect(marker.id);
23
+ }
24
+ }
25
+ : undefined, role: onMarkerSelect ? 'button' : undefined, tabIndex: onMarkerSelect ? 0 : undefined, children: [_jsx("circle", { cx: x, cy: y, r: selected ? 7 : 5, fill: selected ? '#fbbf24' : '#ef4444', stroke: "#0f172a", strokeWidth: "2" }), _jsx("title", { children: (_a = marker.label) !== null && _a !== void 0 ? _a : marker.id })] }, marker.id));
26
+ }) })] }), imageAttribution ? (_jsx("p", { className: "rd-equirect-globe__attribution", children: imageAttribution })) : null, children] }));
27
+ });
28
+ //# sourceMappingURL=EquirectGlobe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EquirectGlobe.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/display/equirect-globe/EquirectGlobe.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type { EquirectGlobeMarker, EquirectGlobeProps } from './EquirectGlobe.js';
2
+ export { EquirectGlobe } from './EquirectGlobe.js';
@@ -0,0 +1,2 @@
1
+ export { EquirectGlobe } from './EquirectGlobe.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/display/equirect-globe/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type CSSProperties } from 'react';
2
+ import { type GeoMapMarker, type GeoMapProvider } from '@rosettadash/web-components/visual/display/geo-map';
3
+ export type { GeoMapMarker, GeoMapProvider };
4
+ export interface GeoMapProps {
5
+ provider?: GeoMapProvider;
6
+ tileUrl?: string;
7
+ apiKey?: string;
8
+ center?: string;
9
+ zoom?: number;
10
+ markers?: GeoMapMarker[];
11
+ selectedId?: string;
12
+ minHeight?: string | number;
13
+ className?: string;
14
+ style?: CSSProperties;
15
+ onMarkerSelect?: (detail: {
16
+ id: string;
17
+ lat: number;
18
+ lng: number;
19
+ }) => void;
20
+ }
21
+ /** React wrapper around `<rd-geo-map>`. */
22
+ export declare const GeoMap: import("react").ForwardRefExoticComponent<GeoMapProps & import("react").RefAttributes<HTMLElement>>;
@@ -0,0 +1,29 @@
1
+ import { createElement, forwardRef } from 'react';
2
+ import { DB_GEO_MAP_TAG, registerRdGeoMap, } from '@rosettadash/web-components/visual/display/geo-map';
3
+ import { useCustomElementHost } from '../../../lib/custom-element-host.js';
4
+ /** React wrapper around `<rd-geo-map>`. */
5
+ export const GeoMap = forwardRef(function GeoMap({ provider, tileUrl, apiKey, center, zoom, markers, selectedId, className, style, minHeight, onMarkerSelect, }, ref) {
6
+ const hostStyle = Object.assign(Object.assign({}, style), (minHeight !== undefined
7
+ ? { minHeight: typeof minHeight === 'number' ? `${minHeight}px` : minHeight }
8
+ : {}));
9
+ const hostRef = useCustomElementHost({
10
+ register: registerRdGeoMap,
11
+ attrs: {
12
+ tileUrl: 'tile-url',
13
+ apiKey: 'api-key',
14
+ selectedId: 'selected-id',
15
+ },
16
+ properties: ['markers'],
17
+ events: {
18
+ 'marker-select': 'onMarkerSelect',
19
+ },
20
+ }, { provider, tileUrl, apiKey, center, zoom, selectedId }, {
21
+ onMarkerSelect: onMarkerSelect,
22
+ }, ref, { markers });
23
+ return createElement(DB_GEO_MAP_TAG, {
24
+ ref: hostRef,
25
+ className,
26
+ style: hostStyle,
27
+ });
28
+ });
29
+ //# sourceMappingURL=GeoMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeoMap.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/display/geo-map/GeoMap.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAsB,MAAM,OAAO,CAAC;AACtE,OAAO,EACL,cAAc,EACd,gBAAgB,GAGjB,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAkB3E,2CAA2C;AAC3C,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAA2B,SAAS,MAAM,CACxE,EACE,QAAQ,EACR,OAAO,EACP,MAAM,EACN,MAAM,EACN,IAAI,EACJ,OAAO,EACP,UAAU,EACV,SAAS,EACT,KAAK,EACL,SAAS,EACT,cAAc,GACf,EACD,GAAG;IAEH,MAAM,SAAS,mCACV,KAAK,GACL,CAAC,SAAS,KAAK,SAAS;QACzB,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE;QAC7E,CAAC,CAAC,EAAE,CAAC,CACR,CAAC;IAEF,MAAM,OAAO,GAAG,oBAAoB,CAClC;QACE,QAAQ,EAAE,gBAAgB;QAC1B,KAAK,EAAE;YACL,OAAO,EAAE,UAAU;YACnB,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,aAAa;SAC1B;QACD,UAAU,EAAE,CAAC,SAAS,CAAC;QACvB,MAAM,EAAE;YACN,eAAe,EAAE,gBAAgB;SAClC;KACF,EACD,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EACvD;QACE,cAAc,EAAE,cAAyD;KAC1E,EACD,GAAG,EACH,EAAE,OAAO,EAAE,CACZ,CAAC;IAEF,OAAO,aAAa,CAAC,cAAc,EAAE;QACnC,GAAG,EAAE,OAAO;QACZ,SAAS;QACT,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type { GeoMapProps, GeoMapMarker, GeoMapProvider } from './GeoMap';
2
+ export { GeoMap } from './GeoMap';
@@ -0,0 +1,2 @@
1
+ export { GeoMap } from './GeoMap';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/display/geo-map/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type CSSProperties } from 'react';
2
+ export interface FilterSummaryChip {
3
+ label: string;
4
+ value: string;
5
+ }
6
+ export interface FilterSummaryProps {
7
+ title?: string;
8
+ count: number;
9
+ countNoun?: string;
10
+ chips: FilterSummaryChip[];
11
+ hint?: string;
12
+ className?: string;
13
+ style?: CSSProperties;
14
+ }
15
+ /** @rosettadash/react/visual/filter/filter-summary — visual.filter.filter-summary */
16
+ export declare const FilterSummary: import("react").ForwardRefExoticComponent<FilterSummaryProps & import("react").RefAttributes<HTMLElement>>;
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ /** @rosettadash/react/visual/filter/filter-summary — visual.filter.filter-summary */
4
+ export const FilterSummary = forwardRef(function FilterSummary({ title = 'Filter results', count, countNoun = 'result', chips, hint, className, style }, ref) {
5
+ const rootClass = ['rd-filter-summary', className].filter(Boolean).join(' ');
6
+ const plural = count === 1 ? countNoun : `${countNoun}s`;
7
+ return (_jsxs("section", { ref: ref, className: rootClass, style: style, "data-testid": "rd-filter-summary", "aria-live": "polite", children: [_jsxs("div", { className: "rd-filter-summary__header", children: [_jsx("strong", { children: title }), _jsxs("span", { className: "rd-filter-summary__count", children: [count, " ", plural] })] }), _jsx("dl", { className: "rd-filter-summary__chips", children: chips.map((chip) => (_jsxs("div", { children: [_jsx("dt", { children: chip.label }), _jsx("dd", { children: chip.value })] }, chip.label))) }), hint ? _jsx("p", { className: "rd-filter-summary__hint", children: hint }) : null] }));
8
+ });
9
+ //# sourceMappingURL=FilterSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterSummary.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/filter/filter-summary/FilterSummary.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,OAAO,CAAC;AAiBvD,qFAAqF;AACrF,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAkC,SAAS,aAAa,CAC7F,EAAE,KAAK,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,GAAG,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EACxF,GAAG;IAEH,MAAM,SAAS,GAAG,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC;IAEzD,OAAO,CACL,mBACE,GAAG,EAAE,GAAmC,EACxC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,iBACA,mBAAmB,eACrB,QAAQ,aAElB,eAAK,SAAS,EAAC,2BAA2B,aACxC,2BAAS,KAAK,GAAU,EACxB,gBAAM,SAAS,EAAC,0BAA0B,aACvC,KAAK,OAAG,MAAM,IACV,IACH,EACN,aAAI,SAAS,EAAC,0BAA0B,YACrC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,0BACE,uBAAK,IAAI,CAAC,KAAK,GAAM,EACrB,uBAAK,IAAI,CAAC,KAAK,GAAM,KAFb,IAAI,CAAC,KAAK,CAGd,CACP,CAAC,GACC,EACJ,IAAI,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,yBAAyB,YAAE,IAAI,GAAK,CAAC,CAAC,CAAC,IAAI,IACxD,CACX,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type { FilterSummaryChip, FilterSummaryProps } from './FilterSummary.js';
2
+ export { FilterSummary } from './FilterSummary.js';
@@ -0,0 +1,2 @@
1
+ export { FilterSummary } from './FilterSummary.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/filter/filter-summary/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,8 +1,12 @@
1
1
  import { type CSSProperties, type ReactNode } from 'react';
2
2
  export interface DateRangeFilterProps {
3
3
  label?: string;
4
+ startLabel?: string;
5
+ endLabel?: string;
4
6
  startDate?: string;
5
7
  endDate?: string;
8
+ /** Use month pickers (YYYY-MM) instead of full date inputs — cleaner calendar UX. */
9
+ granularity?: 'date' | 'month';
6
10
  presetLabel?: string;
7
11
  onChange?: (range: {
8
12
  startDate: string;
@@ -2,8 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { forwardRef } from 'react';
3
3
  /** @rosettadash/react/visual/input/date-range — visual.input.date-range */
4
4
  export const DateRangeFilter = forwardRef(function DateRangeFilter(props, ref) {
5
+ var _a, _b, _c, _d;
5
6
  const { className, style, children } = props;
6
7
  const rootClass = ['rd-input-date-range', className].filter(Boolean).join(' ');
7
- return (_jsxs("section", { ref: ref, className: rootClass, style: style, "data-testid": "rd-input-date-range", children: [props.label ? _jsx("span", { className: "rd-field__label", children: props.label }) : null, _jsxs("div", { className: "rd-date-range__controls", children: [_jsx("input", { type: "date", className: "rd-input", value: props.startDate, onChange: (e) => { var _a, _b; return (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, { startDate: e.target.value, endDate: (_b = props.endDate) !== null && _b !== void 0 ? _b : '' }); } }), _jsx("span", { className: "rd-date-range__sep", children: "to" }), _jsx("input", { type: "date", className: "rd-input", value: props.endDate, onChange: (e) => { var _a, _b; return (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, { startDate: (_b = props.startDate) !== null && _b !== void 0 ? _b : '', endDate: e.target.value }); } })] }), props.presetLabel ? _jsx("span", { className: "rd-date-range__preset", children: props.presetLabel }) : null, children] }));
8
+ const inputType = props.granularity === 'month' ? 'month' : 'date';
9
+ return (_jsxs("section", { ref: ref, className: rootClass, style: style, "data-testid": "rd-input-date-range", children: [props.label ? _jsx("span", { className: "rd-field__label", children: props.label }) : null, _jsxs("div", { className: "rd-date-range__controls", children: [_jsxs("label", { className: "rd-date-range__field", children: [props.startLabel ? _jsx("span", { className: "rd-date-range__field-label", children: props.startLabel }) : null, _jsx("input", { type: inputType, className: "rd-input rd-date-range__input", "aria-label": (_a = props.startLabel) !== null && _a !== void 0 ? _a : `${(_b = props.label) !== null && _b !== void 0 ? _b : 'Date range'} start`, value: props.startDate, onChange: (e) => { var _a, _b; return (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, { startDate: e.target.value, endDate: (_b = props.endDate) !== null && _b !== void 0 ? _b : '' }); } })] }), _jsx("span", { className: "rd-date-range__sep", children: "to" }), _jsxs("label", { className: "rd-date-range__field", children: [props.endLabel ? _jsx("span", { className: "rd-date-range__field-label", children: props.endLabel }) : null, _jsx("input", { type: inputType, className: "rd-input rd-date-range__input", "aria-label": (_c = props.endLabel) !== null && _c !== void 0 ? _c : `${(_d = props.label) !== null && _d !== void 0 ? _d : 'Date range'} end`, value: props.endDate, onChange: (e) => { var _a, _b; return (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, { startDate: (_b = props.startDate) !== null && _b !== void 0 ? _b : '', endDate: e.target.value }); } })] })] }), props.presetLabel ? _jsx("span", { className: "rd-date-range__preset", children: props.presetLabel }) : null, children] }));
8
10
  });
9
11
  //# sourceMappingURL=DateRangeFilter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DateRangeFilter.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/input/date-range/DateRangeFilter.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsC,MAAM,OAAO,CAAC;AAavE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAoC,SAAS,eAAe,CACnG,KAAK,EACL,GAAG;IAEH,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/E,OAAO,CACL,mBAAS,GAAG,EAAE,GAAmC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,iBAAc,qBAAqB,aACrH,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,iBAAiB,YAAE,KAAK,CAAC,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC5E,eAAK,SAAS,EAAC,yBAAyB,aACtC,gBAAO,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,UAAU,EAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,eAAC,OAAA,MAAA,KAAK,CAAC,QAAQ,sDAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAA,KAAK,CAAC,OAAO,mCAAI,EAAE,EAAE,CAAC,CAAA,EAAA,GAAI,EAClK,eAAM,SAAS,EAAC,oBAAoB,mBAAU,EAC9C,gBAAO,IAAI,EAAC,MAAM,EAAC,SAAS,EAAC,UAAU,EAAC,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,eAAC,OAAA,MAAA,KAAK,CAAC,QAAQ,sDAAG,EAAE,SAAS,EAAE,MAAA,KAAK,CAAC,SAAS,mCAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA,EAAA,GAAI,IAC9J,EACL,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,uBAAuB,YAAE,KAAK,CAAC,WAAW,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC7F,QAAQ,IACD,CACX,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"DateRangeFilter.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/input/date-range/DateRangeFilter.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsC,MAAM,OAAO,CAAC;AAiBvE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAoC,SAAS,eAAe,CACnG,KAAK,EACL,GAAG;;IAEH,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAEnE,OAAO,CACL,mBAAS,GAAG,EAAE,GAAmC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,iBAAc,qBAAqB,aACrH,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,iBAAiB,YAAE,KAAK,CAAC,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC5E,eAAK,SAAS,EAAC,yBAAyB,aACtC,iBAAO,SAAS,EAAC,sBAAsB,aACpC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,4BAA4B,YAAE,KAAK,CAAC,UAAU,GAAQ,CAAC,CAAC,CAAC,IAAI,EACjG,gBACE,IAAI,EAAE,SAAS,EACf,SAAS,EAAC,+BAA+B,gBAC7B,MAAA,KAAK,CAAC,UAAU,mCAAI,GAAG,MAAA,KAAK,CAAC,KAAK,mCAAI,YAAY,QAAQ,EACtE,KAAK,EAAE,KAAK,CAAC,SAAS,EACtB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,eACd,OAAA,MAAA,KAAK,CAAC,QAAQ,sDAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAA,KAAK,CAAC,OAAO,mCAAI,EAAE,EAAE,CAAC,CAAA,EAAA,GAE/E,IACI,EACR,eAAM,SAAS,EAAC,oBAAoB,mBAAU,EAC9C,iBAAO,SAAS,EAAC,sBAAsB,aACpC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,4BAA4B,YAAE,KAAK,CAAC,QAAQ,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC7F,gBACE,IAAI,EAAE,SAAS,EACf,SAAS,EAAC,+BAA+B,gBAC7B,MAAA,KAAK,CAAC,QAAQ,mCAAI,GAAG,MAAA,KAAK,CAAC,KAAK,mCAAI,YAAY,MAAM,EAClE,KAAK,EAAE,KAAK,CAAC,OAAO,EACpB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,eACd,OAAA,MAAA,KAAK,CAAC,QAAQ,sDAAG,EAAE,SAAS,EAAE,MAAA,KAAK,CAAC,SAAS,mCAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA,EAAA,GAEjF,IACI,IACJ,EACL,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,uBAAuB,YAAE,KAAK,CAAC,WAAW,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC7F,QAAQ,IACD,CACX,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -6,6 +6,7 @@ export interface NumberInputProps {
6
6
  max?: number;
7
7
  step?: number;
8
8
  value?: number;
9
+ disabled?: boolean;
9
10
  onChange?: (value: number) => void;
10
11
  className?: string;
11
12
  style?: CSSProperties;
@@ -4,6 +4,6 @@ import { forwardRef } from 'react';
4
4
  export const NumberInput = forwardRef(function NumberInput(props, ref) {
5
5
  const { className, style, children } = props;
6
6
  const rootClass = ['rd-input-number', className].filter(Boolean).join(' ');
7
- return (_jsxs("section", { ref: ref, className: rootClass, style: style, "data-testid": "rd-input-number", children: [props.label ? _jsx("span", { className: "rd-field__label", children: props.label }) : null, _jsx("input", { type: "number", className: "rd-input", placeholder: props.placeholder, min: props.min, max: props.max, step: props.step, value: props.value, onChange: (e) => { var _a; return (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, Number(e.target.value)); } }), children] }));
7
+ return (_jsxs("section", { ref: ref, className: rootClass, style: style, "data-testid": "rd-input-number", children: [props.label ? _jsx("span", { className: "rd-field__label", children: props.label }) : null, _jsx("input", { type: "number", className: "rd-input", placeholder: props.placeholder, min: props.min, max: props.max, step: props.step, value: props.value, disabled: props.disabled, onChange: (e) => { var _a; return (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, Number(e.target.value)); } }), children] }));
8
8
  });
9
9
  //# sourceMappingURL=NumberInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/input/number/NumberInput.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsC,MAAM,OAAO,CAAC;AAevE,mEAAmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAgC,SAAS,WAAW,CACvF,KAAK,EACL,GAAG;IAEH,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE3E,OAAO,CACL,mBAAS,GAAG,EAAE,GAAmC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,iBAAc,iBAAiB,aACjH,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,iBAAiB,YAAE,KAAK,CAAC,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC5E,gBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,UAAU,EACpB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,KAAK,CAAC,QAAQ,sDAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA,EAAA,GACzD,EACD,QAAQ,IACD,CACX,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"NumberInput.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/input/number/NumberInput.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsC,MAAM,OAAO,CAAC;AAgBvE,mEAAmE;AACnE,MAAM,CAAC,MAAM,WAAW,GAAG,UAAU,CAAgC,SAAS,WAAW,CACvF,KAAK,EACL,GAAG;IAEH,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE3E,OAAO,CACL,mBAAS,GAAG,EAAE,GAAmC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,iBAAc,iBAAiB,aACjH,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,iBAAiB,YAAE,KAAK,CAAC,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC5E,gBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,UAAU,EACpB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,GAAG,EAAE,KAAK,CAAC,GAAG,EACd,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,KAAK,CAAC,QAAQ,sDAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA,EAAA,GACzD,EACD,QAAQ,IACD,CACX,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -5,6 +5,7 @@ export interface TextInputProps {
5
5
  required?: boolean;
6
6
  value?: string;
7
7
  defaultValue?: string;
8
+ inputType?: 'text' | 'password';
8
9
  onChange?: (value: string) => void;
9
10
  className?: string;
10
11
  style?: CSSProperties;
@@ -2,8 +2,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { forwardRef } from 'react';
3
3
  /** @rosettadash/react/visual/input/text — visual.input.text */
4
4
  export const TextInput = forwardRef(function TextInput(props, ref) {
5
+ var _a;
5
6
  const { className, style, children } = props;
6
7
  const rootClass = ['rd-input-text', className].filter(Boolean).join(' ');
7
- return (_jsxs("section", { ref: ref, className: rootClass, style: style, "data-testid": "rd-input-text", children: [props.label ? _jsx("span", { className: "rd-field__label", children: props.label }) : null, _jsx("input", { type: "text", className: "rd-input", placeholder: props.placeholder, required: props.required, value: props.value, defaultValue: props.defaultValue, onChange: (e) => { var _a; return (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, e.target.value); } }), children] }));
8
+ return (_jsxs("section", { ref: ref, className: rootClass, style: style, "data-testid": "rd-input-text", children: [props.label ? _jsx("span", { className: "rd-field__label", children: props.label }) : null, _jsx("input", { type: (_a = props.inputType) !== null && _a !== void 0 ? _a : 'text', className: "rd-input", placeholder: props.placeholder, required: props.required, value: props.value, defaultValue: props.defaultValue, onChange: (e) => { var _a; return (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, e.target.value); } }), children] }));
8
9
  });
9
10
  //# sourceMappingURL=TextInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextInput.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/input/text/TextInput.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsC,MAAM,OAAO,CAAC;AAcvE,+DAA+D;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAA8B,SAAS,SAAS,CACjF,KAAK,EACL,GAAG;IAEH,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzE,OAAO,CACL,mBAAS,GAAG,EAAE,GAAmC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,iBAAc,eAAe,aAC/G,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,iBAAiB,YAAE,KAAK,CAAC,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC5E,gBACE,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,UAAU,EACpB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,KAAK,CAAC,QAAQ,sDAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAA,GACjD,EACD,QAAQ,IACD,CACX,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"TextInput.js","sourceRoot":"","sources":["../../../../../../../packages/react/src/visual/input/text/TextInput.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsC,MAAM,OAAO,CAAC;AAevE,+DAA+D;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAA8B,SAAS,SAAS,CACjF,KAAK,EACL,GAAG;;IAEH,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEzE,OAAO,CACL,mBAAS,GAAG,EAAE,GAAmC,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,iBAAc,eAAe,aAC/G,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,iBAAiB,YAAE,KAAK,CAAC,KAAK,GAAQ,CAAC,CAAC,CAAC,IAAI,EAC5E,gBACE,IAAI,EAAE,MAAA,KAAK,CAAC,SAAS,mCAAI,MAAM,EAC/B,SAAS,EAAC,UAAU,EACpB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,YAAY,EAAE,KAAK,CAAC,YAAY,EAChC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,KAAK,CAAC,QAAQ,sDAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,EAAA,GACjD,EACD,QAAQ,IACD,CACX,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -3,12 +3,15 @@ import { type CSSProperties } from 'react';
3
3
  export interface LinkListItem {
4
4
  label: string;
5
5
  href: string;
6
+ id?: string;
6
7
  }
7
8
  /** Public props contract for visual/link-list (parity with web-components). */
8
9
  export interface LinkListProps {
9
10
  items?: LinkListItem[];
10
11
  className?: string;
11
12
  dense?: boolean;
13
+ /** When set, renders buttons instead of anchors and invokes on selection. */
14
+ onItemSelect?: (item: LinkListItem) => void;
12
15
  style?: CSSProperties;
13
16
  }
14
17
  export declare const LinkList: import("react").ForwardRefExoticComponent<LinkListProps & import("react").RefAttributes<HTMLUListElement>>;
@@ -1,13 +1,14 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { forwardRef } from 'react';
3
- export const LinkList = forwardRef(function LinkList({ items = [], className, dense = false, style }, ref) {
3
+ export const LinkList = forwardRef(function LinkList({ items = [], className, dense = false, onItemSelect, style }, ref) {
4
4
  const rootClass = [
5
5
  'rd-link-list',
6
6
  dense ? 'rd-link-list--dense' : '',
7
+ onItemSelect ? 'rd-link-list--selectable' : '',
7
8
  className,
8
9
  ]
9
10
  .filter(Boolean)
10
11
  .join(' ');
11
- return (_jsx("ul", { ref: ref, className: rootClass, style: style, "data-testid": "rd-link-list", children: items.map((item) => (_jsx("li", { className: "rd-link-list__item", children: _jsx("a", { className: "rd-link-list__link", href: item.href, children: item.label }) }, `${item.href}:${item.label}`))) }));
12
+ return (_jsx("ul", { ref: ref, className: rootClass, style: style, "data-testid": "rd-link-list", children: items.map((item) => (_jsx("li", { className: "rd-link-list__item", children: onItemSelect ? (_jsx("button", { type: "button", className: "rd-link-list__button", onClick: () => onItemSelect(item), children: item.label })) : (_jsx("a", { className: "rd-link-list__link", href: item.href, children: item.label })) }, `${item.href}:${item.label}`))) }));
12
13
  });
13
14
  //# sourceMappingURL=LinkList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LinkList.js","sourceRoot":"","sources":["../../../../../../packages/react/src/visual/link-list/LinkList.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,OAAO,CAAC;AAgBvD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAkC,SAAS,QAAQ,CACnF,EAAE,KAAK,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAC/C,GAAG;IAEH,MAAM,SAAS,GAAG;QAChB,cAAc;QACd,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE;QAClC,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,CACL,aAAI,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,iBAAc,cAAc,YACzE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,aAAI,SAAS,EAAC,oBAAoB,YAChC,YAAG,SAAS,EAAC,oBAAoB,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,YAC9C,IAAI,CAAC,KAAK,GACT,IAHkC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAI/D,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"LinkList.js","sourceRoot":"","sources":["../../../../../../packages/react/src/visual/link-list/LinkList.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,OAAO,CAAC;AAmBvD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAkC,SAAS,QAAQ,CACnF,EAAE,KAAK,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,EAC7D,GAAG;IAEH,MAAM,SAAS,GAAG;QAChB,cAAc;QACd,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE;QAClC,YAAY,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,EAAE;QAC9C,SAAS;KACV;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,CACL,aAAI,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,iBAAc,cAAc,YACzE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,aAAI,SAAS,EAAC,oBAAoB,YAC/B,YAAY,CAAC,CAAC,CAAC,CACd,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YACrF,IAAI,CAAC,KAAK,GACJ,CACV,CAAC,CAAC,CAAC,CACF,YAAG,SAAS,EAAC,oBAAoB,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,YAC9C,IAAI,CAAC,KAAK,GACT,CACL,IATqC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAU/D,CACN,CAAC,GACC,CACN,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type CSSProperties, type ReactNode } from 'react';
2
+ export interface CarouselSlide {
3
+ id: string;
4
+ title: string;
5
+ subtitle?: string;
6
+ imageUrl: string;
7
+ }
8
+ export interface SlideCarouselProps {
9
+ title?: string;
10
+ slides?: CarouselSlide[];
11
+ selectedId?: string;
12
+ onSelect?: (id: string) => void;
13
+ autoplayMs?: number;
14
+ className?: string;
15
+ style?: CSSProperties;
16
+ children?: ReactNode;
17
+ }
18
+ /** @rosettadash/react/visual/media/carousel — thumbnail carousel with prev/next navigation */
19
+ export declare const SlideCarousel: import("react").ForwardRefExoticComponent<SlideCarouselProps & import("react").RefAttributes<HTMLElement>>;
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef, useCallback, useEffect, useState } from 'react';
3
+ const FALLBACK_SLIDES = [
4
+ { id: '1', title: 'Slide A', imageUrl: 'data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22400%22 height=%22240%22%3E%3Crect fill=%22%23334155%22 width=%22100%25%22 height=%22100%25%22/%3E%3C/svg%3E' },
5
+ { id: '2', title: 'Slide B', imageUrl: 'data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22400%22 height=%22240%22%3E%3Crect fill=%22%231d4ed8%22 width=%22100%25%22 height=%22100%25%22/%3E%3C/svg%3E' },
6
+ ];
7
+ /** @rosettadash/react/visual/media/carousel — thumbnail carousel with prev/next navigation */
8
+ export const SlideCarousel = forwardRef(function SlideCarousel({ title, slides, selectedId, onSelect, autoplayMs = 0, className, style, children }, ref) {
9
+ var _a, _b;
10
+ const items = (slides === null || slides === void 0 ? void 0 : slides.length) ? slides : FALLBACK_SLIDES;
11
+ const selectedIndex = Math.max(0, selectedId ? items.findIndex((slide) => slide.id === selectedId) : 0);
12
+ const [activeIndex, setActiveIndex] = useState(selectedIndex >= 0 ? selectedIndex : 0);
13
+ useEffect(() => {
14
+ if (selectedId) {
15
+ const index = items.findIndex((slide) => slide.id === selectedId);
16
+ if (index >= 0) {
17
+ setActiveIndex(index);
18
+ }
19
+ }
20
+ }, [items, selectedId]);
21
+ const goTo = useCallback((index) => {
22
+ var _a, _b;
23
+ const wrapped = (index + items.length) % items.length;
24
+ setActiveIndex(wrapped);
25
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect((_b = (_a = items[wrapped]) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '');
26
+ }, [items, onSelect]);
27
+ useEffect(() => {
28
+ if (!autoplayMs || items.length < 2) {
29
+ return;
30
+ }
31
+ const timer = window.setInterval(() => goTo(activeIndex + 1), autoplayMs);
32
+ return () => window.clearInterval(timer);
33
+ }, [activeIndex, autoplayMs, goTo, items.length]);
34
+ const active = (_a = items[activeIndex]) !== null && _a !== void 0 ? _a : items[0];
35
+ return (_jsxs("section", { ref: ref, className: ['rd-media-carousel', className].filter(Boolean).join(' '), style: style, "data-testid": "rd-media-carousel", "aria-roledescription": "carousel", "aria-label": title !== null && title !== void 0 ? title : 'Media carousel', children: [title ? _jsx("header", { className: "rd-media-carousel__header", children: title }) : null, _jsxs("div", { className: "rd-media-carousel__viewport", children: [_jsx("button", { type: "button", className: "rd-media-carousel__nav", "aria-label": "Previous slide", onClick: () => goTo(activeIndex - 1), children: "\u2039" }), _jsxs("figure", { className: "rd-media-carousel__slide", children: [_jsx("img", { src: active === null || active === void 0 ? void 0 : active.imageUrl, alt: (_b = active === null || active === void 0 ? void 0 : active.title) !== null && _b !== void 0 ? _b : 'Carousel slide', className: "rd-media-carousel__image" }), _jsxs("figcaption", { className: "rd-media-carousel__caption", children: [_jsx("strong", { children: active === null || active === void 0 ? void 0 : active.title }), (active === null || active === void 0 ? void 0 : active.subtitle) ? _jsx("span", { children: active.subtitle }) : null] })] }), _jsx("button", { type: "button", className: "rd-media-carousel__nav", "aria-label": "Next slide", onClick: () => goTo(activeIndex + 1), children: "\u203A" })] }), _jsx("div", { className: "rd-media-carousel__dots", role: "tablist", "aria-label": "Carousel slides", children: items.map((slide, index) => (_jsx("button", { type: "button", role: "tab", "aria-selected": index === activeIndex, "aria-label": slide.title, className: ['rd-media-carousel__dot', index === activeIndex ? 'rd-media-carousel__dot--active' : '']
36
+ .filter(Boolean)
37
+ .join(' '), onClick: () => goTo(index) }, slide.id))) }), children] }));
38
+ });
39
+ //# sourceMappingURL=SlideCarousel.js.map