@smartnet360/svelte-components 0.0.84 → 0.0.86

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 (122) hide show
  1. package/dist/apps/antenna-pattern/components/AntennaControls.svelte +1 -106
  2. package/dist/apps/antenna-pattern/components/AntennaDiagrams.svelte +0 -36
  3. package/dist/apps/antenna-pattern/components/AntennaSettingsModal.svelte +0 -2
  4. package/dist/apps/antenna-pattern/components/PlotlyRadarChart.svelte +0 -22
  5. package/dist/apps/antenna-pattern/components/chart-engines/PolarAreaChart.svelte +0 -2
  6. package/dist/apps/antenna-pattern/components/chart-engines/PolarBarChart.svelte +0 -2
  7. package/dist/apps/antenna-pattern/components/chart-engines/PolarLineChart.svelte +0 -2
  8. package/dist/apps/site-check/SiteCheck.svelte +60 -80
  9. package/dist/apps/site-check/data-loader.d.ts +9 -6
  10. package/dist/apps/site-check/data-loader.js +2 -11
  11. package/dist/apps/site-check/helper.d.ts +3 -2
  12. package/dist/apps/site-check/helper.js +7 -5
  13. package/dist/apps/site-check/index.d.ts +1 -1
  14. package/dist/apps/site-check/transforms.d.ts +4 -2
  15. package/dist/apps/site-check/transforms.js +49 -10
  16. package/dist/core/Charts/GlobalControls.svelte +0 -4
  17. package/dist/core/Desktop/Grid/ResizeHandle.svelte +0 -7
  18. package/dist/core/Desktop/Grid/resizeStore.js +0 -1
  19. package/dist/index.d.ts +1 -0
  20. package/dist/index.js +2 -0
  21. package/dist/map-v2/demo/DemoMap.svelte +0 -2
  22. package/dist/map-v2/demo/demo-cells.js +0 -1
  23. package/dist/map-v2/features/cells/layers/CellsLayer.svelte +7 -26
  24. package/dist/map-v2/features/cells/utils/cellTree.js +0 -29
  25. package/dist/map-v2/features/repeaters/layers/RepeaterLabelsLayer.svelte +3 -27
  26. package/dist/map-v2/features/repeaters/layers/RepeatersLayer.svelte +8 -25
  27. package/dist/map-v2/features/repeaters/utils/repeaterTree.js +0 -6
  28. package/dist/map-v2/features/sites/controls/SiteFilterControl.svelte +0 -8
  29. package/dist/map-v2/features/sites/utils/siteTreeUtils.js +0 -6
  30. package/dist/map-v3/core/components/Map.svelte +89 -0
  31. package/dist/map-v3/core/components/Map.svelte.d.ts +13 -0
  32. package/dist/map-v3/core/controls/FeatureSettingsControl.svelte +103 -0
  33. package/dist/map-v3/core/controls/FeatureSettingsControl.svelte.d.ts +15 -0
  34. package/dist/map-v3/core/controls/MapStyleControl.svelte +271 -0
  35. package/dist/map-v3/core/controls/MapStyleControl.svelte.d.ts +28 -0
  36. package/dist/map-v3/core/index.d.ts +3 -0
  37. package/dist/map-v3/core/index.js +3 -0
  38. package/dist/map-v3/core/stores/map.store.svelte.d.ts +8 -0
  39. package/dist/map-v3/core/stores/map.store.svelte.js +29 -0
  40. package/dist/map-v3/core/stores/viewport.store.svelte.d.ts +38 -0
  41. package/dist/map-v3/core/stores/viewport.store.svelte.js +107 -0
  42. package/dist/map-v3/demo/DemoMap.svelte +104 -0
  43. package/dist/map-v3/demo/DemoMap.svelte.d.ts +6 -0
  44. package/dist/map-v3/demo/demo-cells.d.ts +13 -0
  45. package/dist/map-v3/demo/demo-cells.js +130 -0
  46. package/dist/map-v3/demo/demo-data.d.ts +8 -0
  47. package/dist/map-v3/demo/demo-data.js +104 -0
  48. package/dist/map-v3/demo/demo-repeaters.d.ts +13 -0
  49. package/dist/map-v3/demo/demo-repeaters.js +73 -0
  50. package/dist/map-v3/features/cells/components/CellFilterControl.svelte +208 -0
  51. package/dist/map-v3/features/cells/components/CellFilterControl.svelte.d.ts +12 -0
  52. package/dist/map-v3/features/cells/components/CellSettingsPanel.svelte +229 -0
  53. package/dist/map-v3/features/cells/components/CellSettingsPanel.svelte.d.ts +7 -0
  54. package/dist/map-v3/features/cells/constants.d.ts +18 -0
  55. package/dist/map-v3/features/cells/constants.js +37 -0
  56. package/dist/map-v3/features/cells/layers/CellLabelsLayer.svelte +230 -0
  57. package/dist/map-v3/features/cells/layers/CellLabelsLayer.svelte.d.ts +11 -0
  58. package/dist/map-v3/features/cells/layers/CellsLayer.svelte +194 -0
  59. package/dist/map-v3/features/cells/layers/CellsLayer.svelte.d.ts +11 -0
  60. package/dist/map-v3/features/cells/layers/index.d.ts +2 -0
  61. package/dist/map-v3/features/cells/layers/index.js +2 -0
  62. package/dist/map-v3/features/cells/logic/geometry.d.ts +12 -0
  63. package/dist/map-v3/features/cells/logic/geometry.js +35 -0
  64. package/dist/map-v3/features/cells/logic/grouping.d.ts +18 -0
  65. package/dist/map-v3/features/cells/logic/grouping.js +30 -0
  66. package/dist/map-v3/features/cells/logic/tree-adapter.d.ts +11 -0
  67. package/dist/map-v3/features/cells/logic/tree-adapter.js +53 -0
  68. package/dist/map-v3/features/cells/stores/cell.data.svelte.d.ts +9 -0
  69. package/dist/map-v3/features/cells/stores/cell.data.svelte.js +16 -0
  70. package/dist/map-v3/features/cells/stores/cell.display.svelte.d.ts +25 -0
  71. package/dist/map-v3/features/cells/stores/cell.display.svelte.js +67 -0
  72. package/dist/map-v3/features/cells/stores/cell.registry.svelte.d.ts +23 -0
  73. package/dist/map-v3/features/cells/stores/cell.registry.svelte.js +68 -0
  74. package/dist/map-v3/features/cells/types.d.ts +62 -0
  75. package/dist/map-v3/features/cells/types.js +6 -0
  76. package/dist/map-v3/features/repeaters/components/RepeaterFilterControl.svelte +148 -0
  77. package/dist/map-v3/features/repeaters/components/RepeaterFilterControl.svelte.d.ts +12 -0
  78. package/dist/map-v3/features/repeaters/components/RepeaterSettingsPanel.svelte +209 -0
  79. package/dist/map-v3/features/repeaters/components/RepeaterSettingsPanel.svelte.d.ts +7 -0
  80. package/dist/map-v3/features/repeaters/layers/RepeaterLabelsLayer.svelte +177 -0
  81. package/dist/map-v3/features/repeaters/layers/RepeaterLabelsLayer.svelte.d.ts +11 -0
  82. package/dist/map-v3/features/repeaters/layers/RepeatersLayer.svelte +163 -0
  83. package/dist/map-v3/features/repeaters/layers/RepeatersLayer.svelte.d.ts +11 -0
  84. package/dist/map-v3/features/repeaters/logic/geometry.d.ts +3 -0
  85. package/dist/map-v3/features/repeaters/logic/geometry.js +23 -0
  86. package/dist/map-v3/features/repeaters/logic/grouping.d.ts +8 -0
  87. package/dist/map-v3/features/repeaters/logic/grouping.js +20 -0
  88. package/dist/map-v3/features/repeaters/logic/tree-adapter.d.ts +8 -0
  89. package/dist/map-v3/features/repeaters/logic/tree-adapter.js +43 -0
  90. package/dist/map-v3/features/repeaters/stores/repeater.data.svelte.d.ts +8 -0
  91. package/dist/map-v3/features/repeaters/stores/repeater.data.svelte.js +13 -0
  92. package/dist/map-v3/features/repeaters/stores/repeater.display.svelte.d.ts +21 -0
  93. package/dist/map-v3/features/repeaters/stores/repeater.display.svelte.js +64 -0
  94. package/dist/map-v3/features/repeaters/stores/repeater.registry.svelte.d.ts +23 -0
  95. package/dist/map-v3/features/repeaters/stores/repeater.registry.svelte.js +68 -0
  96. package/dist/map-v3/features/repeaters/types.d.ts +18 -0
  97. package/dist/map-v3/features/repeaters/types.js +1 -0
  98. package/dist/map-v3/features/sites/components/SiteFilterControl.svelte +119 -0
  99. package/dist/map-v3/features/sites/components/SiteFilterControl.svelte.d.ts +12 -0
  100. package/dist/map-v3/features/sites/components/SiteSettingsPanel.svelte +241 -0
  101. package/dist/map-v3/features/sites/components/SiteSettingsPanel.svelte.d.ts +7 -0
  102. package/dist/map-v3/features/sites/layers/SiteLabelsLayer.svelte +152 -0
  103. package/dist/map-v3/features/sites/layers/SiteLabelsLayer.svelte.d.ts +11 -0
  104. package/dist/map-v3/features/sites/layers/SitesLayer.svelte +132 -0
  105. package/dist/map-v3/features/sites/layers/SitesLayer.svelte.d.ts +11 -0
  106. package/dist/map-v3/features/sites/logic/tree-adapter.d.ts +9 -0
  107. package/dist/map-v3/features/sites/logic/tree-adapter.js +75 -0
  108. package/dist/map-v3/features/sites/stores/site.data.svelte.d.ts +8 -0
  109. package/dist/map-v3/features/sites/stores/site.data.svelte.js +40 -0
  110. package/dist/map-v3/features/sites/stores/site.display.svelte.d.ts +20 -0
  111. package/dist/map-v3/features/sites/stores/site.display.svelte.js +63 -0
  112. package/dist/map-v3/features/sites/stores/site.registry.svelte.d.ts +13 -0
  113. package/dist/map-v3/features/sites/stores/site.registry.svelte.js +83 -0
  114. package/dist/map-v3/features/sites/types.d.ts +12 -0
  115. package/dist/map-v3/features/sites/types.js +1 -0
  116. package/dist/map-v3/index.d.ts +26 -0
  117. package/dist/map-v3/index.js +31 -0
  118. package/dist/map-v3/shared/controls/MapControl.svelte +242 -0
  119. package/dist/map-v3/shared/controls/MapControl.svelte.d.ts +27 -0
  120. package/dist/map-v3/shared/index.d.ts +1 -0
  121. package/dist/map-v3/shared/index.js +1 -0
  122. package/package.json +1 -1
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Viewport Store - Manages and persists map viewport state (center, zoom, pitch, bearing)
3
+ *
4
+ * Features:
5
+ * - Reactive state using Svelte 5 runes
6
+ * - Auto-persists to localStorage via $effect
7
+ * - Namespace isolation for multiple map instances
8
+ */
9
+ const DEFAULT_STATE = {
10
+ center: [0, 0],
11
+ zoom: 2,
12
+ bearing: 0,
13
+ pitch: 0
14
+ };
15
+ /**
16
+ * Load viewport state from localStorage
17
+ */
18
+ function loadViewportState(namespace, defaults) {
19
+ if (typeof window === 'undefined') {
20
+ return { ...DEFAULT_STATE, ...defaults };
21
+ }
22
+ try {
23
+ const key = `${namespace}:viewport`;
24
+ const stored = localStorage.getItem(key);
25
+ if (stored) {
26
+ const parsed = JSON.parse(stored);
27
+ return {
28
+ center: parsed.center || defaults.center || DEFAULT_STATE.center,
29
+ zoom: parsed.zoom ?? defaults.zoom ?? DEFAULT_STATE.zoom,
30
+ bearing: parsed.bearing ?? defaults.bearing ?? DEFAULT_STATE.bearing,
31
+ pitch: parsed.pitch ?? defaults.pitch ?? DEFAULT_STATE.pitch
32
+ };
33
+ }
34
+ }
35
+ catch (error) {
36
+ console.warn('Failed to load viewport state:', error);
37
+ }
38
+ return { ...DEFAULT_STATE, ...defaults };
39
+ }
40
+ /**
41
+ * Save viewport state to localStorage
42
+ */
43
+ function saveViewportState(namespace, state) {
44
+ if (typeof window === 'undefined')
45
+ return;
46
+ try {
47
+ const key = `${namespace}:viewport`;
48
+ localStorage.setItem(key, JSON.stringify(state));
49
+ }
50
+ catch (error) {
51
+ console.warn('Failed to save viewport state:', error);
52
+ }
53
+ }
54
+ /**
55
+ * Create a viewport store with persistence
56
+ *
57
+ * @param namespace - Unique identifier for localStorage key
58
+ * @param defaults - Default viewport values (used if no saved state exists)
59
+ * @returns ViewportStore instance
60
+ */
61
+ export function createViewportStore(namespace, defaults = {}) {
62
+ // Load initial state
63
+ let state = $state(loadViewportState(namespace, defaults));
64
+ // Auto-save to localStorage on any change
65
+ $effect(() => {
66
+ saveViewportState(namespace, state);
67
+ });
68
+ return {
69
+ // Getters
70
+ get center() { return state.center; },
71
+ get zoom() { return state.zoom; },
72
+ get bearing() { return state.bearing; },
73
+ get pitch() { return state.pitch; },
74
+ // Setters
75
+ setCenter(center) {
76
+ state.center = center;
77
+ },
78
+ setZoom(zoom) {
79
+ state.zoom = zoom;
80
+ },
81
+ setBearing(bearing) {
82
+ state.bearing = bearing;
83
+ },
84
+ setPitch(pitch) {
85
+ state.pitch = pitch;
86
+ },
87
+ // Bulk update (more efficient than individual setters)
88
+ updateViewport(updates) {
89
+ if (updates.center !== undefined)
90
+ state.center = updates.center;
91
+ if (updates.zoom !== undefined)
92
+ state.zoom = updates.zoom;
93
+ if (updates.bearing !== undefined)
94
+ state.bearing = updates.bearing;
95
+ if (updates.pitch !== undefined)
96
+ state.pitch = updates.pitch;
97
+ },
98
+ // Reset to defaults
99
+ reset() {
100
+ const resetState = { ...DEFAULT_STATE, ...defaults };
101
+ state.center = resetState.center;
102
+ state.zoom = resetState.zoom;
103
+ state.bearing = resetState.bearing;
104
+ state.pitch = resetState.pitch;
105
+ }
106
+ };
107
+ }
@@ -0,0 +1,104 @@
1
+ <script lang="ts">
2
+ import { onMount } from 'svelte';
3
+ import { Map, MapStyleControl } from '../core';
4
+ import { CellsLayer, CellLabelsLayer } from '../features/cells/layers';
5
+ import { createCellDataStore } from '../features/cells/stores/cell.data.svelte';
6
+ import { createCellRegistry } from '../features/cells/stores/cell.registry.svelte';
7
+ import { CellDisplayStore } from '../features/cells/stores/cell.display.svelte';
8
+ import FeatureSettingsControl from '../core/controls/FeatureSettingsControl.svelte';
9
+ import CellFilterControl from '../features/cells/components/CellFilterControl.svelte';
10
+ import { createRepeaterDataStore } from '../features/repeaters/stores/repeater.data.svelte';
11
+ import { createRepeaterRegistry } from '../features/repeaters/stores/repeater.registry.svelte';
12
+ import { RepeaterDisplayStore } from '../features/repeaters/stores/repeater.display.svelte';
13
+ import RepeaterFilterControl from '../features/repeaters/components/RepeaterFilterControl.svelte';
14
+ import RepeatersLayer from '../features/repeaters/layers/RepeatersLayer.svelte';
15
+ import RepeaterLabelsLayer from '../features/repeaters/layers/RepeaterLabelsLayer.svelte';
16
+ import { createSiteDataStore } from '../features/sites/stores/site.data.svelte';
17
+ import { createSiteDisplayStore } from '../features/sites/stores/site.display.svelte';
18
+ import SitesLayer from '../features/sites/layers/SitesLayer.svelte';
19
+ import SiteLabelsLayer from '../features/sites/layers/SiteLabelsLayer.svelte';
20
+ import SiteFilterControl from '../features/sites/components/SiteFilterControl.svelte';
21
+ import { createSiteRegistry } from '../features/sites/stores/site.registry.svelte';
22
+ import { demoCells } from './demo-cells';
23
+ import { demoRepeaters } from './demo-repeaters';
24
+
25
+ interface Props {
26
+ accessToken: string;
27
+ }
28
+
29
+ let { accessToken }: Props = $props();
30
+
31
+ // Initialize stores
32
+ const cellData = createCellDataStore();
33
+ const cellRegistry = createCellRegistry('demo-map');
34
+ const cellDisplay = new CellDisplayStore();
35
+
36
+ const siteData = createSiteDataStore(cellData);
37
+ const siteRegistry = createSiteRegistry('demo-map');
38
+ const siteDisplay = createSiteDisplayStore();
39
+
40
+ const repeaterData = createRepeaterDataStore();
41
+ const repeaterRegistry = createRepeaterRegistry('demo-map');
42
+ const repeaterDisplay = new RepeaterDisplayStore();
43
+
44
+ onMount(() => {
45
+ // Load dummy data
46
+ // Need to cast or map if types slightly differ, but they should match
47
+ cellData.setCells(demoCells as any);
48
+ repeaterData.setRepeaters(demoRepeaters);
49
+ });
50
+ </script>
51
+
52
+ <div class="map-wrapper">
53
+ <Map
54
+
55
+ {accessToken}
56
+ center={[19.0402, 47.4979]}
57
+ zoom={13}
58
+ namespace="demo-map"
59
+ >
60
+ <MapStyleControl position="top-right" namespace="demo-map" />
61
+
62
+ <CellFilterControl
63
+ position="top-left"
64
+ dataStore={cellData}
65
+ registry={cellRegistry}
66
+ displayStore={cellDisplay}
67
+ />
68
+
69
+ <SiteFilterControl
70
+ position="top-left"
71
+ dataStore={siteData}
72
+ registry={siteRegistry}
73
+ displayStore={siteDisplay}
74
+ />
75
+
76
+ <RepeaterFilterControl
77
+ position="top-left"
78
+ dataStore={repeaterData}
79
+ registry={repeaterRegistry}
80
+ displayStore={repeaterDisplay}
81
+ />
82
+
83
+ <FeatureSettingsControl
84
+ position="top-right"
85
+ cellDisplayStore={cellDisplay}
86
+ repeaterDisplayStore={repeaterDisplay}
87
+ siteDisplayStore={siteDisplay}
88
+ />
89
+
90
+ <SitesLayer dataStore={siteData} displayStore={siteDisplay} registry={siteRegistry} />
91
+ <SiteLabelsLayer dataStore={siteData} displayStore={siteDisplay} registry={siteRegistry} />
92
+ <CellsLayer dataStore={cellData} registry={cellRegistry} displayStore={cellDisplay} />
93
+ <CellLabelsLayer dataStore={cellData} registry={cellRegistry} displayStore={cellDisplay} />
94
+ <RepeatersLayer dataStore={repeaterData} registry={repeaterRegistry} displayStore={repeaterDisplay} />
95
+ <RepeaterLabelsLayer dataStore={repeaterData} registry={repeaterRegistry} displayStore={repeaterDisplay} />
96
+ </Map>
97
+ </div>
98
+
99
+ <style>
100
+ .map-wrapper {
101
+ width: 100%;
102
+ height: 100%;
103
+ }
104
+ </style>
@@ -0,0 +1,6 @@
1
+ interface Props {
2
+ accessToken: string;
3
+ }
4
+ declare const DemoMap: import("svelte").Component<Props, {}, "">;
5
+ type DemoMap = ReturnType<typeof DemoMap>;
6
+ export default DemoMap;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Demo Cell Data
3
+ *
4
+ * 100 sites across San Francisco Bay Area
5
+ * Each site has 3 sectors (azimuths: 0°, 120°, 240°)
6
+ * Each sector has 12 cells (all tech-band combinations)
7
+ * Total: 100 sites × 3 sectors × 12 tech-bands = 3,600 cells
8
+ */
9
+ import type { Cell } from '../features/cells/types';
10
+ /**
11
+ * Generate demo cells: 100 sites × 3 sectors × 12 tech-bands = 3,600 cells
12
+ */
13
+ export declare const demoCells: Cell[];
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Demo Cell Data
3
+ *
4
+ * 100 sites across San Francisco Bay Area
5
+ * Each site has 3 sectors (azimuths: 0°, 120°, 240°)
6
+ * Each sector has 12 cells (all tech-band combinations)
7
+ * Total: 100 sites × 3 sectors × 12 tech-bands = 3,600 cells
8
+ */
9
+ const BASE_LAT = 47.4979;
10
+ const BASE_LNG = 19.0402;
11
+ // Grid parameters for distributing sites
12
+ const NUM_SITES = 1700;
13
+ const GRID_SIZE = 10; // 10×10 grid
14
+ const LAT_SPACING = 0.01; // ~1.1 km spacing
15
+ const LNG_SPACING = 0.015; // ~1.1 km spacing (adjusted for longitude)
16
+ // Standard beamwidth for sectors
17
+ const BEAMWIDTH = 65;
18
+ // Cell tech-band definitions with proper fband format
19
+ const TECH_BANDS = [
20
+ // 2G bands
21
+ { tech: '2G', band: '900', fband: 'GSM900' },
22
+ { tech: '2G', band: '1800', fband: 'GSM1800' },
23
+ // 4G bands
24
+ { tech: '4G', band: '700', fband: 'LTE700' },
25
+ { tech: '4G', band: '800', fband: 'LTE800' },
26
+ { tech: '4G', band: '900', fband: 'LTE900' },
27
+ { tech: '4G', band: '1800', fband: 'LTE1800' },
28
+ { tech: '4G', band: '2100', fband: 'LTE2100' },
29
+ { tech: '4G', band: '2600', fband: 'LTE2600' },
30
+ // 5G bands
31
+ { tech: '5G', band: '700', fband: '5G-700' },
32
+ { tech: '5G', band: '2100', fband: '5G-2100' },
33
+ { tech: '5G', band: '3500', fband: '5G-3500' }
34
+ ];
35
+ // Three sector azimuths
36
+ const AZIMUTHS = [0, 120, 240];
37
+ // Status rotation for variety
38
+ const STATUSES = [
39
+ 'On_Air',
40
+ 'On_Air',
41
+ 'On_Air',
42
+ 'On_Air',
43
+ 'On_Air_UNDER_CONSTRUCTION',
44
+ 'On_Air_Locked',
45
+ 'RF_Plan_Ready',
46
+ 'RF_Plan_Ready',
47
+ 'Re-Planned_RF_Plan_Ready',
48
+ 'Tavlati_RF_Plan_Ready',
49
+ 'On_Air',
50
+ 'On_Air'
51
+ ];
52
+ /**
53
+ * Generate demo cells: 100 sites × 3 sectors × 12 tech-bands = 3,600 cells
54
+ */
55
+ export const demoCells = [];
56
+ let cellCounter = 1;
57
+ // Generate sites in a grid pattern
58
+ for (let siteIndex = 0; siteIndex < NUM_SITES; siteIndex++) {
59
+ const row = Math.floor(siteIndex / GRID_SIZE);
60
+ const col = siteIndex % GRID_SIZE;
61
+ // Calculate site position (centered grid around base location)
62
+ const siteLat = BASE_LAT + (row - GRID_SIZE / 2) * LAT_SPACING;
63
+ const siteLng = BASE_LNG + (col - GRID_SIZE / 2) * LNG_SPACING;
64
+ const siteId = `DEMO-SITE-${String(siteIndex + 1).padStart(3, '0')}`;
65
+ // Generate 3 sectors per site
66
+ AZIMUTHS.forEach((azimuth, sectorIndex) => {
67
+ // Generate 12 tech-bands per sector
68
+ TECH_BANDS.forEach((techBand, techIndex) => {
69
+ const cellId = `CELL-${String(cellCounter).padStart(4, '0')}`;
70
+ const status = STATUSES[techIndex];
71
+ demoCells.push({
72
+ // Core properties
73
+ id: cellId,
74
+ txId: `TX-${String(cellCounter).padStart(4, '0')}`,
75
+ cellID: cellId,
76
+ cellID2G: techBand.tech === '2G' ? cellId : '',
77
+ cellName: `${siteId} ${techBand.tech}${techBand.band} S${sectorIndex + 1}`,
78
+ siteId: siteId,
79
+ tech: techBand.tech,
80
+ fband: techBand.fband,
81
+ frq: techBand.band,
82
+ type: 'MACRO',
83
+ status: status,
84
+ onAirDate: '2024-01-15',
85
+ // 2G specific
86
+ bcch: techBand.tech === '2G' ? 100 + techIndex : 0,
87
+ ctrlid: techBand.tech === '2G' ? `CTRL-${cellId}` : '',
88
+ // 4G specific
89
+ dlEarfn: techBand.tech === '4G' ? 6200 + techIndex * 100 : 0,
90
+ // Physical properties
91
+ antenna: 'DEMO-ANTENNA-MODEL',
92
+ azimuth: azimuth,
93
+ height: 30, // 30 meters antenna height
94
+ electricalTilt: '3',
95
+ beamwidth: BEAMWIDTH,
96
+ latitude: siteLat,
97
+ longitude: siteLng,
98
+ dx: 0,
99
+ dy: 0,
100
+ siteLatitude: siteLat,
101
+ siteLongitude: siteLng,
102
+ // Planning
103
+ comment: `Demo ${techBand.tech} ${techBand.band} cell at azimuth ${azimuth}°`,
104
+ planner: 'Demo User',
105
+ // Atoll properties
106
+ atollETP: 43.0,
107
+ atollPW: 20.0,
108
+ atollRS: 500.0 + (techBand.band === '700' ? 200 : 0), // Lower freq = longer range
109
+ atollBW: parseFloat(techBand.band) / 100, // Simplified bandwidth
110
+ // Network properties
111
+ cellId3: `${cellId}-3G`,
112
+ nwtP1: 20,
113
+ nwtP2: 40,
114
+ pci1: (cellCounter % 504), // Physical Cell ID for LTE
115
+ nwtRS: 450.0,
116
+ nwtBW: 10.0,
117
+ // Other
118
+ other: {
119
+ demoCell: true,
120
+ siteNumber: siteIndex + 1,
121
+ sector: sectorIndex + 1,
122
+ techBandKey: `${techBand.tech}_${techBand.band}`,
123
+ gridPosition: { row, col }
124
+ },
125
+ customSubgroup: `Sector-${sectorIndex + 1}`
126
+ });
127
+ cellCounter++;
128
+ });
129
+ });
130
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Demo cellular data for testing map-v2 site feature
3
+ */
4
+ import type { Site } from '../features/sites/types';
5
+ /**
6
+ * Sample cellular sites (San Francisco area)
7
+ */
8
+ export declare const demoSites: Site[];
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Demo cellular data for testing map-v2 site feature
3
+ */
4
+ /**
5
+ * Sample cellular sites (San Francisco area)
6
+ */
7
+ export const demoSites = [
8
+ {
9
+ siteId: 'site-001',
10
+ siteName: 'Downtown Tower',
11
+ longitude: -122.4194,
12
+ latitude: 37.7749,
13
+ fbands: ['2100', '1800'],
14
+ techs: ['5G'],
15
+ provider: 'Verizon',
16
+ level1: 'Urban Macro',
17
+ level2: 'San Francisco',
18
+ cellCount: 3
19
+ },
20
+ {
21
+ siteId: 'site-002',
22
+ siteName: 'Financial District',
23
+ longitude: -122.4008,
24
+ latitude: 37.7946,
25
+ fbands: ['1800', '850'],
26
+ techs: ['LTE'],
27
+ provider: 'AT&T',
28
+ level1: 'Urban Macro',
29
+ level2: 'San Francisco',
30
+ cellCount: 3
31
+ },
32
+ {
33
+ siteId: 'site-003',
34
+ siteName: 'Mission Bay',
35
+ longitude: -122.3912,
36
+ latitude: 37.7699,
37
+ fbands: ['2600'],
38
+ techs: ['5G'],
39
+ provider: 'T-Mobile',
40
+ level1: 'Small Cell',
41
+ level2: 'San Francisco',
42
+ cellCount: 2
43
+ },
44
+ {
45
+ siteId: 'site-004',
46
+ siteName: 'Golden Gate Park',
47
+ longitude: -122.4862,
48
+ latitude: 37.7694,
49
+ fbands: ['850', '700'],
50
+ techs: ['LTE'],
51
+ provider: 'Verizon',
52
+ level1: 'Rural Macro',
53
+ level2: 'San Francisco',
54
+ cellCount: 3
55
+ },
56
+ {
57
+ siteId: 'site-005',
58
+ siteName: 'Presidio Heights',
59
+ longitude: -122.4545,
60
+ latitude: 37.7881,
61
+ fbands: ['2100', '850'],
62
+ techs: ['5G'],
63
+ provider: 'AT&T',
64
+ level1: 'Suburban Macro',
65
+ level2: 'San Francisco',
66
+ cellCount: 3
67
+ },
68
+ {
69
+ siteId: 'site-006',
70
+ siteName: 'Castro District',
71
+ longitude: -122.4352,
72
+ latitude: 37.7609,
73
+ fbands: ['1800'],
74
+ techs: ['LTE'],
75
+ provider: 'T-Mobile',
76
+ level1: 'Small Cell',
77
+ level2: 'San Francisco',
78
+ cellCount: 2
79
+ },
80
+ {
81
+ siteId: 'site-007',
82
+ siteName: 'Embarcadero',
83
+ longitude: -122.3959,
84
+ latitude: 37.7956,
85
+ fbands: ['2600', '2100'],
86
+ techs: ['5G'],
87
+ provider: 'Verizon',
88
+ level1: 'Urban Macro',
89
+ level2: 'San Francisco',
90
+ cellCount: 3
91
+ },
92
+ {
93
+ siteId: 'site-008',
94
+ siteName: 'Sunset District',
95
+ longitude: -122.4944,
96
+ latitude: 37.7599,
97
+ fbands: ['850', '700'],
98
+ techs: ['LTE'],
99
+ provider: 'AT&T',
100
+ level1: 'Suburban Macro',
101
+ level2: 'San Francisco',
102
+ cellCount: 3
103
+ }
104
+ ];
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Demo Repeater Data
3
+ *
4
+ * 15 repeaters strategically placed near demo sites
5
+ * Mix of 2G, 4G, and 5G technologies across various frequency bands
6
+ * Fixed 30° beamwidth
7
+ */
8
+ import type { Repeater } from '../features/repeaters/types';
9
+ /**
10
+ * Generate demo repeater data
11
+ * Creates 15 repeaters with various tech:fband combinations
12
+ */
13
+ export declare const demoRepeaters: Repeater[];
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Demo Repeater Data
3
+ *
4
+ * 15 repeaters strategically placed near demo sites
5
+ * Mix of 2G, 4G, and 5G technologies across various frequency bands
6
+ * Fixed 30° beamwidth
7
+ */
8
+ const BASE_LAT = 47.4979;
9
+ const BASE_LNG = 19.0402;
10
+ // Repeater positions (distributed across demo area)
11
+ const REPEATER_POSITIONS = [
12
+ { lat: BASE_LAT + 0.015, lng: BASE_LNG - 0.020 },
13
+ { lat: BASE_LAT + 0.025, lng: BASE_LNG + 0.010 },
14
+ { lat: BASE_LAT - 0.010, lng: BASE_LNG + 0.025 },
15
+ { lat: BASE_LAT - 0.020, lng: BASE_LNG - 0.015 },
16
+ { lat: BASE_LAT + 0.005, lng: BASE_LNG + 0.030 },
17
+ { lat: BASE_LAT + 0.030, lng: BASE_LNG - 0.005 },
18
+ { lat: BASE_LAT - 0.025, lng: BASE_LNG + 0.015 },
19
+ { lat: BASE_LAT + 0.010, lng: BASE_LNG - 0.030 },
20
+ { lat: BASE_LAT - 0.015, lng: BASE_LNG - 0.025 },
21
+ { lat: BASE_LAT + 0.020, lng: BASE_LNG + 0.020 },
22
+ { lat: BASE_LAT - 0.005, lng: BASE_LNG - 0.010 },
23
+ { lat: BASE_LAT + 0.035, lng: BASE_LNG + 0.005 },
24
+ { lat: BASE_LAT - 0.030, lng: BASE_LNG + 0.020 },
25
+ { lat: BASE_LAT + 0.012, lng: BASE_LNG - 0.018 },
26
+ { lat: BASE_LAT - 0.018, lng: BASE_LNG + 0.012 }
27
+ ];
28
+ // Repeater tech-band combinations
29
+ const REPEATER_CONFIGS = [
30
+ // 2G repeaters
31
+ { tech: '2G', fband: 'GSM900', azimuth: 45 },
32
+ { tech: '2G', fband: 'GSM1800', azimuth: 180 },
33
+ { tech: '2G', fband: 'GSM900', azimuth: 270 },
34
+ // 4G repeaters
35
+ { tech: '4G', fband: 'LTE700', azimuth: 90 },
36
+ { tech: '4G', fband: 'LTE800', azimuth: 225 },
37
+ { tech: '4G', fband: 'LTE1800', azimuth: 135 },
38
+ { tech: '4G', fband: 'LTE2100', azimuth: 315 },
39
+ { tech: '4G', fband: 'LTE2600', azimuth: 60 },
40
+ // 5G repeaters
41
+ { tech: '5G', fband: '5G-700', azimuth: 150 },
42
+ { tech: '5G', fband: '5G-2100', azimuth: 210 },
43
+ { tech: '5G', fband: '5G-3500', azimuth: 330 },
44
+ { tech: '5G', fband: '5G-3500', azimuth: 0 },
45
+ { tech: '5G', fband: '5G-2100', azimuth: 120 },
46
+ { tech: '5G', fband: '5G-700', azimuth: 240 },
47
+ { tech: '5G', fband: '5G-3500', azimuth: 180 }
48
+ ];
49
+ /**
50
+ * Generate demo repeater data
51
+ * Creates 15 repeaters with various tech:fband combinations
52
+ */
53
+ export const demoRepeaters = REPEATER_POSITIONS.map((pos, idx) => {
54
+ const config = REPEATER_CONFIGS[idx];
55
+ const repeaterId = `REP-${String(idx + 1).padStart(3, '0')}`;
56
+ const donorCellId = `CELL-${String((idx * 7) % 100).padStart(3, '0')}`;
57
+ return {
58
+ repeaterId,
59
+ donorCellId,
60
+ donorCellName: `Cell-${config.tech}-${config.fband}-${idx + 1}`,
61
+ latitude: pos.lat,
62
+ longitude: pos.lng,
63
+ azimuth: config.azimuth,
64
+ beamwidth: 30, // Fixed 30° beamwidth
65
+ tech: config.tech,
66
+ fband: config.fband,
67
+ type: 'REPEATER',
68
+ height: 15 + (idx % 5) * 5, // Heights between 15-35m
69
+ factory_nbr: `FN-${String(1000 + idx).padStart(6, '0')}`,
70
+ provider: idx % 2 === 0 ? 'Operator-A' : 'Operator-B',
71
+ featureGroup: config.tech === '5G' ? 'High-Priority' : config.tech === '4G' ? 'Standard' : 'Legacy'
72
+ };
73
+ });