@smartnet360/svelte-components 0.0.13 → 0.0.15
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.
- package/dist/apps/antenna-pattern/components/AntennaControls.svelte +209 -57
- package/dist/apps/antenna-pattern/components/AntennaDiagrams.svelte +173 -96
- package/dist/apps/antenna-pattern/components/chart-engines/PolarAreaChart.svelte +125 -0
- package/dist/apps/antenna-pattern/components/chart-engines/PolarAreaChart.svelte.d.ts +16 -0
- package/dist/apps/antenna-pattern/components/chart-engines/PolarBarChart.svelte +121 -0
- package/dist/apps/antenna-pattern/components/chart-engines/PolarBarChart.svelte.d.ts +15 -0
- package/dist/apps/antenna-pattern/components/chart-engines/PolarLineChart.svelte +125 -0
- package/dist/apps/antenna-pattern/components/chart-engines/PolarLineChart.svelte.d.ts +16 -0
- package/dist/apps/antenna-pattern/components/chart-engines/index.d.ts +9 -0
- package/dist/apps/antenna-pattern/components/chart-engines/index.js +8 -0
- package/dist/apps/antenna-pattern/index.d.ts +1 -0
- package/dist/apps/antenna-pattern/index.js +2 -0
- package/dist/apps/antenna-pattern/utils/chart-engines/polar-area-utils.d.ts +89 -0
- package/dist/apps/antenna-pattern/utils/chart-engines/polar-area-utils.js +146 -0
- package/dist/apps/antenna-pattern/utils/chart-engines/polar-bar-utils.d.ts +88 -0
- package/dist/apps/antenna-pattern/utils/chart-engines/polar-bar-utils.js +131 -0
- package/dist/apps/antenna-pattern/utils/chart-engines/polar-line-utils.d.ts +88 -0
- package/dist/apps/antenna-pattern/utils/chart-engines/polar-line-utils.js +134 -0
- package/dist/apps/antenna-pattern/utils/recent-antennas.d.ts +20 -0
- package/dist/apps/antenna-pattern/utils/recent-antennas.js +60 -0
- package/package.json +4 -4
@@ -0,0 +1,88 @@
|
|
1
|
+
import type { Antenna } from '../../db';
|
2
|
+
export interface PolarLineTraceData {
|
3
|
+
r: number[];
|
4
|
+
theta: number[];
|
5
|
+
type: 'scatterpolar';
|
6
|
+
mode: 'lines';
|
7
|
+
name: string;
|
8
|
+
line: {
|
9
|
+
color: string;
|
10
|
+
width: number;
|
11
|
+
dash: string;
|
12
|
+
};
|
13
|
+
}
|
14
|
+
/**
|
15
|
+
* Convert antenna pattern to Plotly polar line trace data
|
16
|
+
*/
|
17
|
+
export declare function convertAntennaPatternToLine(pattern: number[], name: string, color: string, width?: number, mechanicalTilt?: number, gainOffset?: number): PolarLineTraceData;
|
18
|
+
/**
|
19
|
+
* Get fixed line color (no dynamic changes)
|
20
|
+
*/
|
21
|
+
export declare function getLineColor(electricalTilt: number, mechanicalTilt: number, baseColor: string): string;
|
22
|
+
/**
|
23
|
+
* Get fixed line width (no dynamic changes)
|
24
|
+
*/
|
25
|
+
export declare function getLineWidth(electricalTilt: number, mechanicalTilt: number): number;
|
26
|
+
/**
|
27
|
+
* Create polar line chart data for antenna patterns
|
28
|
+
*/
|
29
|
+
export declare function createPolarLineChartData(selectedAntenna: Antenna | null, selectedAntenna2: Antenna | null, viewMode: 'single' | 'compare', showHorizontalPatterns: boolean, showVerticalPatterns: boolean, ant1ElectricalTilt: number, ant1MechanicalTilt: number, ant2ElectricalTilt: number, ant2MechanicalTilt: number, patternDisplayMode?: 'normalized' | 'gain-adjusted'): PolarLineTraceData[];
|
30
|
+
/**
|
31
|
+
* Create Plotly layout for polar line charts
|
32
|
+
*/
|
33
|
+
export declare function createPolarLineLayout(title: string): {
|
34
|
+
title: {
|
35
|
+
text: string;
|
36
|
+
font: {
|
37
|
+
size: number;
|
38
|
+
color: string;
|
39
|
+
};
|
40
|
+
x: number;
|
41
|
+
xanchor: string;
|
42
|
+
};
|
43
|
+
polar: {
|
44
|
+
radialaxis: {
|
45
|
+
visible: boolean;
|
46
|
+
range: number[];
|
47
|
+
tickfont: {
|
48
|
+
size: number;
|
49
|
+
color: string;
|
50
|
+
};
|
51
|
+
gridcolor: string;
|
52
|
+
linecolor: string;
|
53
|
+
tickmode: string;
|
54
|
+
tick0: number;
|
55
|
+
dtick: number;
|
56
|
+
ticksuffix: string;
|
57
|
+
};
|
58
|
+
angularaxis: {
|
59
|
+
visible: boolean;
|
60
|
+
tickfont: {
|
61
|
+
size: number;
|
62
|
+
color: string;
|
63
|
+
};
|
64
|
+
gridcolor: string;
|
65
|
+
linecolor: string;
|
66
|
+
direction: string;
|
67
|
+
period: number;
|
68
|
+
rotation: number;
|
69
|
+
ticksuffix: string;
|
70
|
+
};
|
71
|
+
bgcolor: string;
|
72
|
+
};
|
73
|
+
margin: {
|
74
|
+
t: number;
|
75
|
+
r: number;
|
76
|
+
b: number;
|
77
|
+
l: number;
|
78
|
+
};
|
79
|
+
height: number;
|
80
|
+
paper_bgcolor: string;
|
81
|
+
plot_bgcolor: string;
|
82
|
+
legend: {
|
83
|
+
orientation: string;
|
84
|
+
x: number;
|
85
|
+
y: number;
|
86
|
+
xanchor: string;
|
87
|
+
};
|
88
|
+
};
|
@@ -0,0 +1,134 @@
|
|
1
|
+
/**
|
2
|
+
* Convert antenna pattern to Plotly polar line trace data
|
3
|
+
*/
|
4
|
+
export function convertAntennaPatternToLine(pattern, name, color, width = 2, mechanicalTilt = 0, gainOffset = 0) {
|
5
|
+
// Convert attenuation to dB (negate values) and apply gain offset
|
6
|
+
let processedPattern = pattern.map(value => -value + gainOffset);
|
7
|
+
// Apply mechanical tilt by shifting the pattern
|
8
|
+
if (mechanicalTilt !== 0) {
|
9
|
+
const shiftedPattern = new Array(360).fill(0);
|
10
|
+
for (let i = 0; i < 360; i++) {
|
11
|
+
const sourceIndex = (i - mechanicalTilt + 360) % 360;
|
12
|
+
shiftedPattern[i] = processedPattern[sourceIndex] || 0;
|
13
|
+
}
|
14
|
+
processedPattern = shiftedPattern;
|
15
|
+
}
|
16
|
+
// Generate theta values (0-359 degrees) with proper rotation to point to 0 degrees
|
17
|
+
const theta = Array.from({ length: pattern.length }, (_, i) => {
|
18
|
+
if (name.includes('Vertical')) {
|
19
|
+
return (i + 0) % 360; // Vertical patterns point to 0° (North/up)
|
20
|
+
}
|
21
|
+
return (i + 270) % 360; // Rotate horizontal patterns 270° (or -90°) to point North
|
22
|
+
});
|
23
|
+
return {
|
24
|
+
r: processedPattern,
|
25
|
+
theta,
|
26
|
+
type: 'scatterpolar',
|
27
|
+
mode: 'lines',
|
28
|
+
name,
|
29
|
+
line: {
|
30
|
+
color,
|
31
|
+
width,
|
32
|
+
dash: 'solid' // Always solid lines
|
33
|
+
}
|
34
|
+
};
|
35
|
+
}
|
36
|
+
/**
|
37
|
+
* Get fixed line color (no dynamic changes)
|
38
|
+
*/
|
39
|
+
export function getLineColor(electricalTilt, mechanicalTilt, baseColor) {
|
40
|
+
return baseColor; // Always return base color
|
41
|
+
}
|
42
|
+
/**
|
43
|
+
* Get fixed line width (no dynamic changes)
|
44
|
+
*/
|
45
|
+
export function getLineWidth(electricalTilt, mechanicalTilt) {
|
46
|
+
return 2; // Always return fixed width
|
47
|
+
}
|
48
|
+
/**
|
49
|
+
* Create polar line chart data for antenna patterns
|
50
|
+
*/
|
51
|
+
export function createPolarLineChartData(selectedAntenna, selectedAntenna2, viewMode, showHorizontalPatterns, showVerticalPatterns, ant1ElectricalTilt, ant1MechanicalTilt, ant2ElectricalTilt, ant2MechanicalTilt, patternDisplayMode = 'normalized') {
|
52
|
+
const data = [];
|
53
|
+
// Calculate gain offsets for gain-adjusted display mode
|
54
|
+
let ant1GainOffset = 0;
|
55
|
+
let ant2GainOffset = 0;
|
56
|
+
if (patternDisplayMode === 'gain-adjusted' && viewMode === 'compare') {
|
57
|
+
const ant1Gain = selectedAntenna?.gain_dBd || 0;
|
58
|
+
const ant2Gain = selectedAntenna2?.gain_dBd || 0;
|
59
|
+
const maxGain = Math.max(ant1Gain, ant2Gain);
|
60
|
+
// Offset both antennas relative to the highest gain antenna
|
61
|
+
ant1GainOffset = ant1Gain - maxGain;
|
62
|
+
ant2GainOffset = ant2Gain - maxGain;
|
63
|
+
}
|
64
|
+
// Create antenna 1 pattern data based on visibility settings
|
65
|
+
if (selectedAntenna) {
|
66
|
+
if (showHorizontalPatterns) {
|
67
|
+
const horizontalData1 = convertAntennaPatternToLine(selectedAntenna.pattern || [], 'Antenna 1 - Horizontal', getLineColor(ant1ElectricalTilt, ant1MechanicalTilt, '#0066cc'), getLineWidth(ant1ElectricalTilt, ant1MechanicalTilt), ant1MechanicalTilt, ant1GainOffset);
|
68
|
+
data.push(horizontalData1);
|
69
|
+
}
|
70
|
+
if (showVerticalPatterns) {
|
71
|
+
const verticalData1 = convertAntennaPatternToLine(selectedAntenna.vertical_pattern || [], 'Antenna 1 - Vertical', getLineColor(ant1ElectricalTilt, ant1MechanicalTilt, '#003d7a'), getLineWidth(ant1ElectricalTilt, ant1MechanicalTilt), ant1MechanicalTilt, ant1GainOffset);
|
72
|
+
data.push(verticalData1);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
// Add second antenna if in compare mode and antenna 2 is selected
|
76
|
+
if (viewMode === 'compare' && selectedAntenna2) {
|
77
|
+
if (showHorizontalPatterns) {
|
78
|
+
const horizontalData2 = convertAntennaPatternToLine(selectedAntenna2.pattern || [], 'Antenna 2 - Horizontal', getLineColor(ant2ElectricalTilt, ant2MechanicalTilt, '#ffd700'), getLineWidth(ant2ElectricalTilt, ant2MechanicalTilt), ant2MechanicalTilt, ant2GainOffset);
|
79
|
+
data.push(horizontalData2);
|
80
|
+
}
|
81
|
+
if (showVerticalPatterns) {
|
82
|
+
const verticalData2 = convertAntennaPatternToLine(selectedAntenna2.vertical_pattern || [], 'Antenna 2 - Vertical', getLineColor(ant2ElectricalTilt, ant2MechanicalTilt, '#e6c200'), getLineWidth(ant2ElectricalTilt, ant2MechanicalTilt), ant2MechanicalTilt, ant2GainOffset);
|
83
|
+
data.push(verticalData2);
|
84
|
+
}
|
85
|
+
}
|
86
|
+
return data;
|
87
|
+
}
|
88
|
+
/**
|
89
|
+
* Create Plotly layout for polar line charts
|
90
|
+
*/
|
91
|
+
export function createPolarLineLayout(title) {
|
92
|
+
return {
|
93
|
+
title: {
|
94
|
+
text: title,
|
95
|
+
font: { size: 16, color: '#212529' },
|
96
|
+
x: 0.5,
|
97
|
+
xanchor: 'center'
|
98
|
+
},
|
99
|
+
polar: {
|
100
|
+
radialaxis: {
|
101
|
+
visible: true,
|
102
|
+
range: [-70, 0],
|
103
|
+
tickfont: { size: 10, color: '#6c757d' },
|
104
|
+
gridcolor: 'rgba(108, 117, 125, 0.3)',
|
105
|
+
linecolor: 'rgba(108, 117, 125, 0.5)',
|
106
|
+
tickmode: 'linear',
|
107
|
+
tick0: -70,
|
108
|
+
dtick: 10,
|
109
|
+
ticksuffix: ' dB'
|
110
|
+
},
|
111
|
+
angularaxis: {
|
112
|
+
visible: true,
|
113
|
+
tickfont: { size: 11, color: '#495057' },
|
114
|
+
gridcolor: 'rgba(108, 117, 125, 0.2)',
|
115
|
+
linecolor: 'rgba(108, 117, 125, 0.4)',
|
116
|
+
direction: 'clockwise',
|
117
|
+
period: 360,
|
118
|
+
rotation: 0,
|
119
|
+
ticksuffix: '°'
|
120
|
+
},
|
121
|
+
bgcolor: 'rgba(248, 249, 250, 0.5)'
|
122
|
+
},
|
123
|
+
margin: { t: 60, r: 40, b: 60, l: 40 },
|
124
|
+
height: 600,
|
125
|
+
paper_bgcolor: 'rgba(255, 255, 255, 0.95)',
|
126
|
+
plot_bgcolor: 'rgba(248, 249, 250, 0.3)',
|
127
|
+
legend: {
|
128
|
+
orientation: 'h',
|
129
|
+
x: 0.5,
|
130
|
+
y: -0.1,
|
131
|
+
xanchor: 'center'
|
132
|
+
}
|
133
|
+
};
|
134
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import type { Antenna } from '../db';
|
2
|
+
/**
|
3
|
+
* Get recently selected antennas from localStorage
|
4
|
+
*/
|
5
|
+
export declare function getRecentAntennas(): Antenna[];
|
6
|
+
/**
|
7
|
+
* Add an antenna to the recent list
|
8
|
+
*/
|
9
|
+
export declare function addToRecentAntennas(antenna: Antenna): void;
|
10
|
+
/**
|
11
|
+
* Clear recent antennas list
|
12
|
+
*/
|
13
|
+
export declare function clearRecentAntennas(): void;
|
14
|
+
/**
|
15
|
+
* Sort antennas to show recent ones first, then alphabetical
|
16
|
+
*/
|
17
|
+
export declare function sortAntennasWithRecent(antennas: Antenna[]): {
|
18
|
+
recent: Antenna[];
|
19
|
+
others: Antenna[];
|
20
|
+
};
|
@@ -0,0 +1,60 @@
|
|
1
|
+
const RECENT_ANTENNAS_KEY = 'recentAntennas';
|
2
|
+
const MAX_RECENT_ANTENNAS = 10;
|
3
|
+
/**
|
4
|
+
* Get recently selected antennas from localStorage
|
5
|
+
*/
|
6
|
+
export function getRecentAntennas() {
|
7
|
+
try {
|
8
|
+
const stored = localStorage.getItem(RECENT_ANTENNAS_KEY);
|
9
|
+
if (!stored)
|
10
|
+
return [];
|
11
|
+
const recent = JSON.parse(stored);
|
12
|
+
return Array.isArray(recent) ? recent : [];
|
13
|
+
}
|
14
|
+
catch (error) {
|
15
|
+
console.warn('Failed to load recent antennas:', error);
|
16
|
+
return [];
|
17
|
+
}
|
18
|
+
}
|
19
|
+
/**
|
20
|
+
* Add an antenna to the recent list
|
21
|
+
*/
|
22
|
+
export function addToRecentAntennas(antenna) {
|
23
|
+
try {
|
24
|
+
let recent = getRecentAntennas();
|
25
|
+
// Remove if already exists (to move to top)
|
26
|
+
recent = recent.filter(a => a.id !== antenna.id);
|
27
|
+
// Add to beginning
|
28
|
+
recent.unshift(antenna);
|
29
|
+
// Keep only the max number
|
30
|
+
recent = recent.slice(0, MAX_RECENT_ANTENNAS);
|
31
|
+
// Save to localStorage
|
32
|
+
localStorage.setItem(RECENT_ANTENNAS_KEY, JSON.stringify(recent));
|
33
|
+
}
|
34
|
+
catch (error) {
|
35
|
+
console.warn('Failed to save recent antenna:', error);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
/**
|
39
|
+
* Clear recent antennas list
|
40
|
+
*/
|
41
|
+
export function clearRecentAntennas() {
|
42
|
+
try {
|
43
|
+
localStorage.removeItem(RECENT_ANTENNAS_KEY);
|
44
|
+
}
|
45
|
+
catch (error) {
|
46
|
+
console.warn('Failed to clear recent antennas:', error);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* Sort antennas to show recent ones first, then alphabetical
|
51
|
+
*/
|
52
|
+
export function sortAntennasWithRecent(antennas) {
|
53
|
+
const recentAntennas = getRecentAntennas();
|
54
|
+
const recentIds = new Set(recentAntennas.map(a => a.id));
|
55
|
+
// Filter antennas that exist in current list and are recent
|
56
|
+
const recent = recentAntennas.filter(recentAntenna => antennas.some(antenna => antenna.id === recentAntenna.id));
|
57
|
+
// Get other antennas (not in recent list)
|
58
|
+
const others = antennas.filter(antenna => !recentIds.has(antenna.id));
|
59
|
+
return { recent, others };
|
60
|
+
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@smartnet360/svelte-components",
|
3
|
-
"version": "0.0.
|
3
|
+
"version": "0.0.15",
|
4
4
|
"scripts": {
|
5
5
|
"dev": "vite dev",
|
6
6
|
"build": "vite build && npm run prepack",
|
@@ -60,11 +60,11 @@
|
|
60
60
|
"svelte"
|
61
61
|
],
|
62
62
|
"dependencies": {
|
63
|
-
"bootstrap": "^5.2.3",
|
64
|
-
"plotly.js-dist-min": "^3.1.0",
|
65
63
|
"@sveltejs/adapter-static": "^3.0.9",
|
64
|
+
"bootstrap": "^5.2.3",
|
66
65
|
"bootstrap-icons": "^1.13.1",
|
67
66
|
"chart.js": "^4.4.9",
|
68
|
-
"dexie": "^4.0.11"
|
67
|
+
"dexie": "^4.0.11",
|
68
|
+
"plotly.js-dist-min": "^3.1.0"
|
69
69
|
}
|
70
70
|
}
|