@navigoo/map-components 1.0.2 → 1.0.4

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.
@@ -9,6 +9,7 @@ interface DashboardProps {
9
9
  setRoutes: (routes: Route[]) => void;
10
10
  setSelectedRouteIndex: (index: number) => void;
11
11
  isTracking: boolean;
12
+ className?: string;
12
13
  }
13
14
  declare const Dashboard: React.FC<DashboardProps>;
14
15
  export default Dashboard;
@@ -11,15 +11,9 @@ const RouteSearch_1 = __importDefault(require("./RouteSearch"));
11
11
  const DetourRouteSearch_1 = __importDefault(require("./DetourRouteSearch"));
12
12
  const TransportOptions_1 = __importDefault(require("./TransportOptions"));
13
13
  const TripType_1 = __importDefault(require("./TripType"));
14
- const styles_module_css_1 = __importDefault(require("./styles.module.css"));
15
- const lucide_react_1 = require("lucide-react");
16
- const Dashboard = ({ apiClient, setUserLocation, setSearchedPlace, setIsTracking, setRoutes, setSelectedRouteIndex, isTracking, }) => {
17
- const [activeSection, setActiveSection] = (0, react_1.useState)(null);
14
+ const Dashboard = ({ apiClient, setUserLocation, setSearchedPlace, setIsTracking, setRoutes, setSelectedRouteIndex, isTracking, className, }) => {
18
15
  const [geoLoading, setGeoLoading] = (0, react_1.useState)(false);
19
16
  const [geoError, setGeoError] = (0, react_1.useState)(null);
20
- const toggleSection = (section) => {
21
- setActiveSection(activeSection === section ? null : section);
22
- };
23
17
  const handleToggleTracking = () => {
24
18
  setIsTracking(!isTracking);
25
19
  if (isTracking) {
@@ -47,6 +41,6 @@ const Dashboard = ({ apiClient, setUserLocation, setSearchedPlace, setIsTracking
47
41
  setGeoLoading(false);
48
42
  }
49
43
  }, [geoLoading, isTracking, setUserLocation, setRoutes, setSelectedRouteIndex]);
50
- return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { className: styles_module_css_1.default.header, children: (0, jsx_runtime_1.jsxs)("h1", { className: styles_module_css_1.default.headerTitle, children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.titleAccent, children: "Navi" }), "goo"] }) }), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.mainContainer, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.sidebar, children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => toggleSection('geolocation'), className: `${styles_module_css_1.default.sidebarButton} ${activeSection === 'geolocation' ? styles_module_css_1.default.active : ''}`, title: "G\u00E9olocalisation et suivi", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Footprints, { size: 24, color: "#000" }) }), (0, jsx_runtime_1.jsx)("button", { onClick: () => toggleSection('search'), className: `${styles_module_css_1.default.sidebarButton} ${activeSection === 'search' ? styles_module_css_1.default.active : ''}`, title: "Recherche de lieu", children: (0, jsx_runtime_1.jsx)(lucide_react_1.Search, { size: 24, color: "#000" }) }), (0, jsx_runtime_1.jsx)("button", { onClick: () => toggleSection('route'), className: `${styles_module_css_1.default.sidebarButton} ${activeSection === 'route' ? styles_module_css_1.default.active : ''}`, title: "Trac\u00E9 d'itin\u00E9raire", children: (0, jsx_runtime_1.jsx)(lucide_react_1.ArrowRight, { size: 24, color: "#000" }) }), (0, jsx_runtime_1.jsx)("button", { onClick: () => toggleSection('routeWithDetour'), className: `${styles_module_css_1.default.sidebarButton} ${activeSection === 'routeWithDetour' ? styles_module_css_1.default.active : ''}`, title: "Trac\u00E9 d'itin\u00E9raire avec d\u00E9tour", children: (0, jsx_runtime_1.jsx)(lucide_react_1.RefreshCcw, { size: 24, color: "#000" }) })] }), (0, jsx_runtime_1.jsxs)("div", { className: `${styles_module_css_1.default.contentPanel} ${activeSection ? styles_module_css_1.default.open : ''}`, children: [activeSection === 'geolocation' && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.sectionContainer, children: [(0, jsx_runtime_1.jsxs)("h2", { className: styles_module_css_1.default.sectionTitle, children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.titleAccent, children: "G\u00E9o" }), "localisation"] }), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.toggleContainer, children: [(0, jsx_runtime_1.jsxs)("label", { className: styles_module_css_1.default.switch, children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: isTracking, onChange: handleToggleTracking }), (0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.slider })] }), (0, jsx_runtime_1.jsxs)("span", { className: styles_module_css_1.default.toggleLabel, children: ["Suivi: ", isTracking ? 'Activé' : 'Désactivé'] })] }), (0, jsx_runtime_1.jsx)("button", { onClick: handleGeolocation, className: styles_module_css_1.default.locationButton, disabled: geoLoading || isTracking, children: geoLoading ? ('Chargement...') : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(lucide_react_1.MapPin, { size: 18, color: "#000", style: { marginRight: '8px' } }), "Ma position"] })) }), geoError && (0, jsx_runtime_1.jsx)("div", { className: styles_module_css_1.default.error, children: geoError })] })), activeSection === 'search' && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.sectionContainer, children: [(0, jsx_runtime_1.jsxs)("h2", { className: styles_module_css_1.default.sectionTitle, children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.titleAccent, children: "Re" }), "cherche"] }), (0, jsx_runtime_1.jsx)(SearchBar_1.default, { apiClient: apiClient, setUserLocation: setUserLocation, setSearchedPlace: setSearchedPlace })] })), activeSection === 'route' && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.sectionContainer, children: [(0, jsx_runtime_1.jsxs)("h2", { className: styles_module_css_1.default.sectionTitle, children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.titleAccent, children: "Itin\u00E9" }), "raire"] }), (0, jsx_runtime_1.jsx)(RouteSearch_1.default, { apiClient: apiClient, setRoutes: setRoutes, setSelectedRouteIndex: setSelectedRouteIndex }), (0, jsx_runtime_1.jsx)(TransportOptions_1.default, {}), (0, jsx_runtime_1.jsx)(TripType_1.default, {})] })), activeSection === 'routeWithDetour' && ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.sectionContainer, children: [(0, jsx_runtime_1.jsxs)("h2", { className: styles_module_css_1.default.sectionTitle, children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.titleAccent, children: "Itin\u00E9" }), "raire avec d\u00E9tour"] }), (0, jsx_runtime_1.jsx)(DetourRouteSearch_1.default, { apiClient: apiClient, setRoutes: setRoutes, setSelectedRouteIndex: setSelectedRouteIndex }), (0, jsx_runtime_1.jsx)(TransportOptions_1.default, {}), (0, jsx_runtime_1.jsx)(TripType_1.default, {})] }))] })] })] }));
44
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsxs)("label", { children: [(0, jsx_runtime_1.jsx)("input", { type: "checkbox", checked: isTracking, onChange: handleToggleTracking }), "Suivi: ", isTracking ? 'Activé' : 'Désactivé'] }) }), (0, jsx_runtime_1.jsx)("button", { onClick: handleGeolocation, disabled: geoLoading || isTracking, children: geoLoading ? 'Chargement...' : 'Ma position' }), geoError && (0, jsx_runtime_1.jsx)("div", { children: geoError })] }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SearchBar_1.default, { apiClient: apiClient, setUserLocation: setUserLocation, setSearchedPlace: setSearchedPlace }) }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(RouteSearch_1.default, { apiClient: apiClient, setRoutes: setRoutes, setSelectedRouteIndex: setSelectedRouteIndex }), (0, jsx_runtime_1.jsx)(TransportOptions_1.default, {}), (0, jsx_runtime_1.jsx)(TripType_1.default, {})] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)(DetourRouteSearch_1.default, { apiClient: apiClient, setRoutes: setRoutes, setSelectedRouteIndex: setSelectedRouteIndex }), (0, jsx_runtime_1.jsx)(TransportOptions_1.default, {}), (0, jsx_runtime_1.jsx)(TripType_1.default, {})] })] }));
51
45
  };
52
46
  exports.default = Dashboard;
@@ -5,6 +5,15 @@ interface DetourRouteSearchProps {
5
5
  apiClient: ApiClient;
6
6
  setRoutes: (routes: Route[]) => void;
7
7
  setSelectedRouteIndex: (index: number) => void;
8
+ className?: string;
9
+ searchGroupClassName?: string;
10
+ labelClassName?: string;
11
+ inputClassName?: string;
12
+ resultsClassName?: string;
13
+ resultItemClassName?: string;
14
+ errorClassName?: string;
15
+ buttonClassName?: string;
16
+ disabledButtonClassName?: string;
8
17
  }
9
18
  declare const DetourRouteSearch: React.FC<DetourRouteSearchProps>;
10
19
  export default DetourRouteSearch;
@@ -1,12 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  const jsx_runtime_1 = require("react/jsx-runtime");
7
4
  const react_1 = require("react");
8
- const styles_module_css_1 = __importDefault(require("./styles.module.css"));
9
- const DetourRouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex }) => {
5
+ const DetourRouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex, className, searchGroupClassName, labelClassName, inputClassName, resultsClassName, resultItemClassName, errorClassName, buttonClassName, disabledButtonClassName, }) => {
10
6
  const [startQuery, setStartQuery] = (0, react_1.useState)('');
11
7
  const [detourQuery, setDetourQuery] = (0, react_1.useState)('');
12
8
  const [endQuery, setEndQuery] = (0, react_1.useState)('');
@@ -105,15 +101,15 @@ const DetourRouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex }) => {
105
101
  setLoading(false);
106
102
  }
107
103
  };
108
- return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.routeSearchSection, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.searchGroup, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "start", className: styles_module_css_1.default.label, children: "D\u00E9part" }), (0, jsx_runtime_1.jsx)("input", { id: "start", type: "text", value: startQuery, onChange: (e) => {
104
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "start", className: labelClassName, children: "D\u00E9part" }), (0, jsx_runtime_1.jsx)("input", { id: "start", type: "text", value: startQuery, onChange: (e) => {
109
105
  setStartQuery(e.target.value);
110
106
  handleSearch(e.target.value, setStartResults);
111
- }, placeholder: "Point de d\u00E9part", className: styles_module_css_1.default.searchInput }), startResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: styles_module_css_1.default.searchResults, children: startResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectStart(place), className: styles_module_css_1.default.searchResultItem, children: place.name }, place.id))) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.searchGroup, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "detour", className: styles_module_css_1.default.label, children: "D\u00E9tour" }), (0, jsx_runtime_1.jsx)("input", { id: "detour", type: "text", value: detourQuery, onChange: (e) => {
107
+ }, placeholder: "Point de d\u00E9part", className: inputClassName }), startResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: startResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectStart(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "detour", className: labelClassName, children: "D\u00E9tour" }), (0, jsx_runtime_1.jsx)("input", { id: "detour", type: "text", value: detourQuery, onChange: (e) => {
112
108
  setDetourQuery(e.target.value);
113
109
  handleSearch(e.target.value, setDetourResults);
114
- }, placeholder: "Point de d\u00E9tour", className: styles_module_css_1.default.searchInput }), detourResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: styles_module_css_1.default.searchResults, children: detourResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectDetour(place), className: styles_module_css_1.default.searchResultItem, children: place.name }, place.id))) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.searchGroup, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "end", className: styles_module_css_1.default.label, children: "Destination" }), (0, jsx_runtime_1.jsx)("input", { id: "end", type: "text", value: endQuery, onChange: (e) => {
110
+ }, placeholder: "Point de d\u00E9tour", className: inputClassName }), detourResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: detourResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectDetour(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "end", className: labelClassName, children: "Destination" }), (0, jsx_runtime_1.jsx)("input", { id: "end", type: "text", value: endQuery, onChange: (e) => {
115
111
  setEndQuery(e.target.value);
116
112
  handleSearch(e.target.value, setEndResults);
117
- }, placeholder: "Point d'arriv\u00E9e", className: styles_module_css_1.default.searchInput }), endResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: styles_module_css_1.default.searchResults, children: endResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectEnd(place), className: styles_module_css_1.default.searchResultItem, children: place.name }, place.id))) }))] }), error && (0, jsx_runtime_1.jsx)("div", { className: styles_module_css_1.default.error, children: error }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCalculateRoute, disabled: loading || !selectedStart || !selectedDetour || !selectedEnd, className: `${styles_module_css_1.default.searchButton} ${loading || !selectedStart || !selectedDetour || !selectedEnd ? styles_module_css_1.default.disabled : ''}`, children: loading ? 'Calcul...' : 'Calculer l\'itinéraire' })] }));
113
+ }, placeholder: "Point d'arriv\u00E9e", className: inputClassName }), endResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: endResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectEnd(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), error && (0, jsx_runtime_1.jsx)("div", { className: errorClassName, children: error }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCalculateRoute, disabled: loading || !selectedStart || !selectedDetour || !selectedEnd, className: loading || !selectedStart || !selectedDetour || !selectedEnd ? disabledButtonClassName : buttonClassName, children: loading ? 'Calcul...' : 'Calculer l\'itinéraire' })] }));
118
114
  };
119
115
  exports.default = DetourRouteSearch;
@@ -5,6 +5,15 @@ interface RouteSearchProps {
5
5
  apiClient: ApiClient;
6
6
  setRoutes: (routes: Route[]) => void;
7
7
  setSelectedRouteIndex: (index: number) => void;
8
+ className?: string;
9
+ searchGroupClassName?: string;
10
+ labelClassName?: string;
11
+ inputClassName?: string;
12
+ resultsClassName?: string;
13
+ resultItemClassName?: string;
14
+ errorClassName?: string;
15
+ buttonClassName?: string;
16
+ disabledButtonClassName?: string;
8
17
  }
9
18
  declare const RouteSearch: React.FC<RouteSearchProps>;
10
19
  export default RouteSearch;
@@ -1,12 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  const jsx_runtime_1 = require("react/jsx-runtime");
7
4
  const react_1 = require("react");
8
- const styles_module_css_1 = __importDefault(require("./styles.module.css"));
9
- const RouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex }) => {
5
+ const RouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex, className, searchGroupClassName, labelClassName, inputClassName, resultsClassName, resultItemClassName, errorClassName, buttonClassName, disabledButtonClassName, }) => {
10
6
  const [startQuery, setStartQuery] = (0, react_1.useState)('');
11
7
  const [endQuery, setEndQuery] = (0, react_1.useState)('');
12
8
  const [startResults, setStartResults] = (0, react_1.useState)([]);
@@ -84,12 +80,12 @@ const RouteSearch = ({ apiClient, setRoutes, setSelectedRouteIndex }) => {
84
80
  setLoading(false);
85
81
  }
86
82
  };
87
- return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.routeSearchSection, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.searchGroup, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "start", className: styles_module_css_1.default.label, children: "D\u00E9part" }), (0, jsx_runtime_1.jsx)("input", { id: "start", type: "text", value: startQuery, onChange: (e) => {
83
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "start", className: labelClassName, children: "D\u00E9part" }), (0, jsx_runtime_1.jsx)("input", { id: "start", type: "text", value: startQuery, onChange: (e) => {
88
84
  setStartQuery(e.target.value);
89
85
  handleSearch(e.target.value, setStartResults);
90
- }, placeholder: "Point de d\u00E9part", className: styles_module_css_1.default.searchInput }), startResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: styles_module_css_1.default.searchResults, children: startResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectStart(place), className: styles_module_css_1.default.searchResultItem, children: place.name }, place.id))) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.searchGroup, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "end", className: styles_module_css_1.default.label, children: "Destination" }), (0, jsx_runtime_1.jsx)("input", { id: "end", type: "text", value: endQuery, onChange: (e) => {
86
+ }, placeholder: "Point de d\u00E9part", className: inputClassName }), startResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: startResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectStart(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: searchGroupClassName, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "end", className: labelClassName, children: "Destination" }), (0, jsx_runtime_1.jsx)("input", { id: "end", type: "text", value: endQuery, onChange: (e) => {
91
87
  setEndQuery(e.target.value);
92
88
  handleSearch(e.target.value, setEndResults);
93
- }, placeholder: "Point d'arriv\u00E9e", className: styles_module_css_1.default.searchInput }), endResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: styles_module_css_1.default.searchResults, children: endResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectEnd(place), className: styles_module_css_1.default.searchResultItem, children: place.name }, place.id))) }))] }), error && (0, jsx_runtime_1.jsx)("div", { className: styles_module_css_1.default.error, children: error }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCalculateRoute, disabled: loading || !selectedStart || !selectedEnd, className: `${styles_module_css_1.default.searchButton} ${loading || !selectedStart || !selectedEnd ? styles_module_css_1.default.disabled : ''}`, children: loading ? 'Calcul...' : 'Calculer l\'itinéraire' })] }));
89
+ }, placeholder: "Point d'arriv\u00E9e", className: inputClassName }), endResults.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: endResults.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelectEnd(place), className: resultItemClassName, children: place.name }, place.id))) }))] }), error && (0, jsx_runtime_1.jsx)("div", { className: errorClassName, children: error }), (0, jsx_runtime_1.jsx)("button", { onClick: handleCalculateRoute, disabled: loading || !selectedStart || !selectedEnd, className: loading || !selectedStart || !selectedEnd ? disabledButtonClassName : buttonClassName, children: loading ? 'Calcul...' : 'Calculer l\'itinéraire' })] }));
94
90
  };
95
91
  exports.default = RouteSearch;
@@ -5,6 +5,12 @@ interface SearchBarProps {
5
5
  apiClient: ApiClient;
6
6
  setUserLocation: (location: GeolocationResult | null) => void;
7
7
  setSearchedPlace: (place: Place | null) => void;
8
+ className?: string;
9
+ inputClassName?: string;
10
+ buttonClassName?: string;
11
+ errorClassName?: string;
12
+ resultsClassName?: string;
13
+ resultItemClassName?: string;
8
14
  }
9
15
  declare const SearchBar: React.FC<SearchBarProps>;
10
16
  export default SearchBar;
@@ -1,12 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  const jsx_runtime_1 = require("react/jsx-runtime");
7
4
  const react_1 = require("react");
8
- const styles_module_css_1 = __importDefault(require("./styles.module.css"));
9
- const SearchBar = ({ apiClient, setUserLocation, setSearchedPlace }) => {
5
+ const SearchBar = ({ apiClient, setUserLocation, setSearchedPlace, className, inputClassName, buttonClassName, errorClassName, resultsClassName, resultItemClassName, }) => {
10
6
  const [query, setQuery] = (0, react_1.useState)('');
11
7
  const [loading, setLoading] = (0, react_1.useState)(false);
12
8
  const [results, setResults] = (0, react_1.useState)([]);
@@ -43,6 +39,6 @@ const SearchBar = ({ apiClient, setUserLocation, setSearchedPlace }) => {
43
39
  }
44
40
  setResults([]);
45
41
  };
46
- return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.searchSection, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.searchGroup, children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "search", className: styles_module_css_1.default.label, children: "Nom du lieu" }), (0, jsx_runtime_1.jsx)("input", { id: "search", type: "text", value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Rechercher un lieu", className: styles_module_css_1.default.searchInput })] }), error && (0, jsx_runtime_1.jsx)("div", { className: styles_module_css_1.default.error, children: error }), results.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: styles_module_css_1.default.searchResults, children: results.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelect(place), className: styles_module_css_1.default.searchResultItem, children: place.name }, place.id))) })), (0, jsx_runtime_1.jsx)("button", { onClick: handleSearch, disabled: loading || !query, className: `${styles_module_css_1.default.searchButton} ${loading || !query ? styles_module_css_1.default.disabled : ''}`, children: loading ? 'Recherche...' : 'Rechercher' })] }));
42
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "search", children: "Nom du lieu" }), (0, jsx_runtime_1.jsx)("input", { id: "search", type: "text", value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Rechercher un lieu", className: inputClassName })] }), error && (0, jsx_runtime_1.jsx)("div", { className: errorClassName, children: error }), results.length > 0 && ((0, jsx_runtime_1.jsx)("ul", { className: resultsClassName, children: results.map((place) => ((0, jsx_runtime_1.jsx)("li", { onClick: () => handleSelect(place), className: resultItemClassName, children: place.name }, place.id))) })), (0, jsx_runtime_1.jsx)("button", { onClick: handleSearch, disabled: loading || !query, className: buttonClassName, children: loading ? 'Recherche...' : 'Rechercher' })] }));
47
43
  };
48
44
  exports.default = SearchBar;
@@ -1,3 +1,14 @@
1
1
  import React from 'react';
2
- declare const TransportOptions: React.FC;
2
+ interface TransportOptionsProps {
3
+ className?: string;
4
+ headerClassName?: string;
5
+ titleClassName?: string;
6
+ toggleButtonClassName?: string;
7
+ optionsClassName?: string;
8
+ optionClassName?: string;
9
+ selectedOptionClassName?: string;
10
+ iconClassName?: string;
11
+ nameClassName?: string;
12
+ }
13
+ declare const TransportOptions: React.FC<TransportOptionsProps>;
3
14
  export default TransportOptions;
@@ -1,12 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  const jsx_runtime_1 = require("react/jsx-runtime");
7
4
  const react_1 = require("react");
8
- const styles_module_css_1 = __importDefault(require("./styles.module.css"));
9
- const TransportOptions = () => {
5
+ const TransportOptions = ({ className, headerClassName, titleClassName, toggleButtonClassName, optionsClassName, optionClassName, selectedOptionClassName, iconClassName, nameClassName, }) => {
10
6
  const [showOptions, setShowOptions] = (0, react_1.useState)(false);
11
7
  const [selectedTransport, setSelectedTransport] = (0, react_1.useState)('taxi');
12
8
  const transportOptions = [
@@ -17,8 +13,8 @@ const TransportOptions = () => {
17
13
  (0, react_1.useEffect)(() => {
18
14
  window.dispatchEvent(new CustomEvent('transportChange', { detail: selectedTransport }));
19
15
  }, [selectedTransport]);
20
- return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.optionsSection, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.optionsHeader, children: [(0, jsx_runtime_1.jsx)("h3", { className: styles_module_css_1.default.optionsTitle, children: "Moyen de transport" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setShowOptions(!showOptions), className: styles_module_css_1.default.toggleButton, children: showOptions ? 'Réduire' : 'Options' })] }), showOptions && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_css_1.default.transportOptions, children: transportOptions.map((option) => ((0, jsx_runtime_1.jsxs)("button", { onClick: () => setSelectedTransport(option.id), className: `${styles_module_css_1.default.transportOption} ${selectedTransport === option.id ? styles_module_css_1.default.selected : ''}`, style: {
16
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { className: headerClassName, children: [(0, jsx_runtime_1.jsx)("h3", { className: titleClassName, children: "Moyen de transport" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setShowOptions(!showOptions), className: toggleButtonClassName, children: showOptions ? 'Réduire' : 'Options' })] }), showOptions && ((0, jsx_runtime_1.jsx)("div", { className: optionsClassName, children: transportOptions.map((option) => ((0, jsx_runtime_1.jsxs)("button", { onClick: () => setSelectedTransport(option.id), className: `${optionClassName} ${selectedTransport === option.id ? selectedOptionClassName : ''}`, style: {
21
17
  backgroundColor: selectedTransport === option.id ? option.color : undefined,
22
- }, children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.transportIcon, children: option.icon }), (0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.transportName, children: option.name })] }, option.id))) }))] }));
18
+ }, children: [(0, jsx_runtime_1.jsx)("span", { className: iconClassName, children: option.icon }), (0, jsx_runtime_1.jsx)("span", { className: nameClassName, children: option.name })] }, option.id))) }))] }));
23
19
  };
24
20
  exports.default = TransportOptions;
@@ -1,3 +1,14 @@
1
1
  import React from 'react';
2
- declare const TripType: React.FC;
2
+ interface TripTypeProps {
3
+ className?: string;
4
+ headerClassName?: string;
5
+ titleClassName?: string;
6
+ toggleButtonClassName?: string;
7
+ optionsClassName?: string;
8
+ optionClassName?: string;
9
+ selectedOptionClassName?: string;
10
+ iconClassName?: string;
11
+ nameClassName?: string;
12
+ }
13
+ declare const TripType: React.FC<TripTypeProps>;
3
14
  export default TripType;
@@ -1,20 +1,16 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  const jsx_runtime_1 = require("react/jsx-runtime");
7
4
  const react_1 = require("react");
8
- const styles_module_css_1 = __importDefault(require("./styles.module.css"));
9
- const TripType = () => {
5
+ const TripType = ({ className, headerClassName, titleClassName, toggleButtonClassName, optionsClassName, optionClassName, selectedOptionClassName, iconClassName, nameClassName, }) => {
10
6
  const [showOptions, setShowOptions] = (0, react_1.useState)(false);
11
7
  const [selectedTripType, setSelectedTripType] = (0, react_1.useState)('individuel');
12
8
  const tripTypeOptions = [
13
9
  { id: 'individuel', name: 'Individuel', icon: '👤', color: '#3498db' },
14
10
  { id: 'ramassage', name: 'Ramassage', icon: '👥', color: '#9b59b6' },
15
11
  ];
16
- return ((0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.optionsSection, children: [(0, jsx_runtime_1.jsxs)("div", { className: styles_module_css_1.default.optionsHeader, children: [(0, jsx_runtime_1.jsx)("h3", { className: styles_module_css_1.default.optionsTitle, children: "Type de trajet" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setShowOptions(!showOptions), className: styles_module_css_1.default.toggleButton, children: showOptions ? 'Réduire' : 'Options' })] }), showOptions && ((0, jsx_runtime_1.jsx)("div", { className: styles_module_css_1.default.transportOptions, children: tripTypeOptions.map((option) => ((0, jsx_runtime_1.jsxs)("button", { onClick: () => setSelectedTripType(option.id), className: `${styles_module_css_1.default.transportOption} ${selectedTripType === option.id ? styles_module_css_1.default.selected : ''}`, style: {
12
+ return ((0, jsx_runtime_1.jsxs)("div", { className: className, children: [(0, jsx_runtime_1.jsxs)("div", { className: headerClassName, children: [(0, jsx_runtime_1.jsx)("h3", { className: titleClassName, children: "Type de trajet" }), (0, jsx_runtime_1.jsx)("button", { onClick: () => setShowOptions(!showOptions), className: toggleButtonClassName, children: showOptions ? 'Réduire' : 'Options' })] }), showOptions && ((0, jsx_runtime_1.jsx)("div", { className: optionsClassName, children: tripTypeOptions.map((option) => ((0, jsx_runtime_1.jsxs)("button", { onClick: () => setSelectedTripType(option.id), className: `${optionClassName} ${selectedTripType === option.id ? selectedOptionClassName : ''}`, style: {
17
13
  backgroundColor: selectedTripType === option.id ? option.color : undefined,
18
- }, children: [(0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.transportIcon, children: option.icon }), (0, jsx_runtime_1.jsx)("span", { className: styles_module_css_1.default.transportName, children: option.name })] }, option.id))) }))] }));
14
+ }, children: [(0, jsx_runtime_1.jsx)("span", { className: iconClassName, children: option.icon }), (0, jsx_runtime_1.jsx)("span", { className: nameClassName, children: option.name })] }, option.id))) }))] }));
19
15
  };
20
16
  exports.default = TripType;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@navigoo/map-components",
3
- "version": "1.0.2",
3
+ "version": "1.0.4",
4
4
  "description": "Reusable React components for mapping and routing in Yaoundé",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -6,8 +6,6 @@ import RouteSearch from './RouteSearch';
6
6
  import DetourRouteSearch from './DetourRouteSearch';
7
7
  import TransportOptions from './TransportOptions';
8
8
  import TripType from './TripType';
9
- import styles from './styles.module.css';
10
- import { Footprints, Search, ArrowRight, RefreshCcw, MapPin } from 'lucide-react';
11
9
  import { ApiClient } from '../lib/api';
12
10
 
13
11
  interface DashboardProps {
@@ -18,6 +16,7 @@ interface DashboardProps {
18
16
  setRoutes: (routes: Route[]) => void;
19
17
  setSelectedRouteIndex: (index: number) => void;
20
18
  isTracking: boolean;
19
+ className?: string; // Allow custom styling
21
20
  }
22
21
 
23
22
  const Dashboard: React.FC<DashboardProps> = ({
@@ -28,15 +27,11 @@ const Dashboard: React.FC<DashboardProps> = ({
28
27
  setRoutes,
29
28
  setSelectedRouteIndex,
30
29
  isTracking,
30
+ className,
31
31
  }) => {
32
- const [activeSection, setActiveSection] = useState<string | null>(null);
33
32
  const [geoLoading, setGeoLoading] = useState(false);
34
33
  const [geoError, setGeoError] = useState<string | null>(null);
35
34
 
36
- const toggleSection = (section: string) => {
37
- setActiveSection(activeSection === section ? null : section);
38
- };
39
-
40
35
  const handleToggleTracking = () => {
41
36
  setIsTracking(!isTracking);
42
37
  if (isTracking) {
@@ -65,116 +60,57 @@ const Dashboard: React.FC<DashboardProps> = ({
65
60
  }, [geoLoading, isTracking, setUserLocation, setRoutes, setSelectedRouteIndex]);
66
61
 
67
62
  return (
68
- <div>
69
- <div className={styles.header}>
70
- <h1 className={styles.headerTitle}>
71
- <span className={styles.titleAccent}>Navi</span>goo
72
- </h1>
73
- </div>
74
- <div className={styles.mainContainer}>
75
- <div className={styles.sidebar}>
76
- <button
77
- onClick={() => toggleSection('geolocation')}
78
- className={`${styles.sidebarButton} ${activeSection === 'geolocation' ? styles.active : ''}`}
79
- title="Géolocalisation et suivi"
80
- >
81
- <Footprints size={24} color="#000" />
82
- </button>
83
- <button
84
- onClick={() => toggleSection('search')}
85
- className={`${styles.sidebarButton} ${activeSection === 'search' ? styles.active : ''}`}
86
- title="Recherche de lieu"
87
- >
88
- <Search size={24} color="#000" />
89
- </button>
90
- <button
91
- onClick={() => toggleSection('route')}
92
- className={`${styles.sidebarButton} ${activeSection === 'route' ? styles.active : ''}`}
93
- title="Tracé d'itinéraire"
94
- >
95
- <ArrowRight size={24} color="#000" />
96
- </button>
97
- <button
98
- onClick={() => toggleSection('routeWithDetour')}
99
- className={`${styles.sidebarButton} ${activeSection === 'routeWithDetour' ? styles.active : ''}`}
100
- title="Tracé d'itinéraire avec détour"
101
- >
102
- <RefreshCcw size={24} color="#000" />
103
- </button>
104
- </div>
105
- <div className={`${styles.contentPanel} ${activeSection ? styles.open : ''}`}>
106
- {activeSection === 'geolocation' && (
107
- <div className={styles.sectionContainer}>
108
- <h2 className={styles.sectionTitle}>
109
- <span className={styles.titleAccent}>Géo</span>localisation
110
- </h2>
111
- <div className={styles.toggleContainer}>
112
- <label className={styles.switch}>
113
- <input type="checkbox" checked={isTracking} onChange={handleToggleTracking} />
114
- <span className={styles.slider}></span>
115
- </label>
116
- <span className={styles.toggleLabel}>
117
- Suivi: {isTracking ? 'Activé' : 'Désactivé'}
118
- </span>
119
- </div>
120
- <button
121
- onClick={handleGeolocation}
122
- className={styles.locationButton}
123
- disabled={geoLoading || isTracking}
124
- >
125
- {geoLoading ? (
126
- 'Chargement...'
127
- ) : (
128
- <>
129
- <MapPin size={18} color="#000" style={{ marginRight: '8px' }} />
130
- Ma position
131
- </>
132
- )}
133
- </button>
134
- {geoError && <div className={styles.error}>{geoError}</div>}
135
- </div>
136
- )}
137
- {activeSection === 'search' && (
138
- <div className={styles.sectionContainer}>
139
- <h2 className={styles.sectionTitle}>
140
- <span className={styles.titleAccent}>Re</span>cherche
141
- </h2>
142
- <SearchBar
143
- apiClient={apiClient}
144
- setUserLocation={setUserLocation}
145
- setSearchedPlace={setSearchedPlace}
146
- />
147
- </div>
148
- )}
149
- {activeSection === 'route' && (
150
- <div className={styles.sectionContainer}>
151
- <h2 className={styles.sectionTitle}>
152
- <span className={styles.titleAccent}>Itiné</span>raire
153
- </h2>
154
- <RouteSearch
155
- apiClient={apiClient}
156
- setRoutes={setRoutes}
157
- setSelectedRouteIndex={setSelectedRouteIndex}
158
- />
159
- <TransportOptions />
160
- <TripType />
161
- </div>
162
- )}
163
- {activeSection === 'routeWithDetour' && (
164
- <div className={styles.sectionContainer}>
165
- <h2 className={styles.sectionTitle}>
166
- <span className={styles.titleAccent}>Itiné</span>raire avec détour
167
- </h2>
168
- <DetourRouteSearch
169
- apiClient={apiClient}
170
- setRoutes={setRoutes}
171
- setSelectedRouteIndex={setSelectedRouteIndex}
172
- />
173
- <TransportOptions />
174
- <TripType />
175
- </div>
176
- )}
63
+ <div className={className}>
64
+ {/* Geolocation Section */}
65
+ <div>
66
+ <div>
67
+ <label>
68
+ <input
69
+ type="checkbox"
70
+ checked={isTracking}
71
+ onChange={handleToggleTracking}
72
+ />
73
+ Suivi: {isTracking ? 'Activé' : 'Désactivé'}
74
+ </label>
177
75
  </div>
76
+ <button
77
+ onClick={handleGeolocation}
78
+ disabled={geoLoading || isTracking}
79
+ >
80
+ {geoLoading ? 'Chargement...' : 'Ma position'}
81
+ </button>
82
+ {geoError && <div>{geoError}</div>}
83
+ </div>
84
+
85
+ {/* Search Section */}
86
+ <div>
87
+ <SearchBar
88
+ apiClient={apiClient}
89
+ setUserLocation={setUserLocation}
90
+ setSearchedPlace={setSearchedPlace}
91
+ />
92
+ </div>
93
+
94
+ {/* Route Search Section */}
95
+ <div>
96
+ <RouteSearch
97
+ apiClient={apiClient}
98
+ setRoutes={setRoutes}
99
+ setSelectedRouteIndex={setSelectedRouteIndex}
100
+ />
101
+ <TransportOptions />
102
+ <TripType />
103
+ </div>
104
+
105
+ {/* Detour Route Search Section */}
106
+ <div>
107
+ <DetourRouteSearch
108
+ apiClient={apiClient}
109
+ setRoutes={setRoutes}
110
+ setSelectedRouteIndex={setSelectedRouteIndex}
111
+ />
112
+ <TransportOptions />
113
+ <TripType />
178
114
  </div>
179
115
  </div>
180
116
  );