Posodobitev komponent in dodajanje novih strani
Build and Deploy / build-and-deploy (push) Failing after 22s Details

This commit is contained in:
Mark Poljanšek 2025-04-23 21:48:46 +02:00
parent b3548287b4
commit 9b3a5e0895
101 changed files with 3097 additions and 22587 deletions

View File

@ -236,63 +236,63 @@ Ta dokument vsebuje kratek pregled vseh komponent v aplikaciji za rezervacije re
### 50. SearchNavBar ### 50. SearchNavBar
**Lokacija:** `/src/components/SearchNavBar.tsx` **Lokacija:** `/src/components/SearchNavBar.tsx`
**Namen:** Navigacijska vrstica za stran z iskanjem, z naslovom in gumbi za ponastavitev filtrov in pomoč. **Namen:** Navigacijska vrstica za stran z iskanjem, ki vsebuje naslov strani in gumbe za hitro ponastavitev filtrov in dostop do pomoči.
**Uporaba:** Uporabite na vrhu strani za iskanje in filtriranje restavracij. **Uporaba:** Uporabite kot glavno navigacijo na vrhu strani za iskanje in filtriranje.
### 51. AdvancedSearchBar ### 51. AdvancedSearchBar
**Lokacija:** `/src/components/AdvancedSearchBar.tsx` **Lokacija:** `/src/components/AdvancedSearchBar.tsx`
**Namen:** Napredno iskalno polje z možnostjo čiščenja vnosa. **Namen:** Iskalno polje s podporo za vnos in čiščenje poizvedbe, s poudarjeno vizualno podobo.
**Uporaba:** Uporabite na vrhu strani za iskanje, ko želite omogočiti iskanje po imenih restavracij ali jedi. **Uporaba:** Uporabite kot glavni vnos za iskalno poizvedbo na strani za iskanje.
### 52. FilterHeader ### 52. FilterHeader
**Lokacija:** `/src/components/FilterHeader.tsx` **Lokacija:** `/src/components/FilterHeader.tsx`
**Namen:** Glava sekcije filtrov z naslovom in gumbom za ponastavitev. **Namen:** Naslovni del filtrirne sekcije, ki prikazuje naslov "Filtri" in gumb za ponastavitev vseh filtrov.
**Uporaba:** Uporabite kot uvod v sekcijo filtrov na strani za iskanje. **Uporaba:** Uporabite kot uvod v sklop filtrov na strani za iskanje.
### 53. LocationFilter ### 53. LocationFilter
**Lokacija:** `/src/components/LocationFilter.tsx` **Lokacija:** `/src/components/LocationFilter.tsx`
**Namen:** Filter za izbiro lokacije z vnosnim poljem in hitro izbiro priljubljenih lokacij. **Namen:** Kompleksna komponenta za filtriranje po lokaciji, ki združuje vnosno polje in hitre izbire priljubljenih lokacij.
**Uporaba:** Uporabite v sekciji filtrov za filtriranje restavracij po lokaciji. **Uporaba:** Uporabite za omogočanje različnih načinov določanja lokacije pri iskanju restavracij.
### 54. CuisineFilterGrid ### 54. CuisineFilterGrid
**Lokacija:** `/src/components/CuisineFilterGrid.tsx` **Lokacija:** `/src/components/CuisineFilterGrid.tsx`
**Namen:** Mreža izbirnih polj za filtriranje po vrstah kuhinje. **Namen:** Vizualno privlačna mreža za izbiro vrst kuhinje z ikonami in besedilom, podpira večkratno izbiro.
**Uporaba:** Uporabite v sekciji filtrov za izbiro željenih vrst kuhinj. **Uporaba:** Uporabite za filtriranje restavracij po vrstah kuhinje.
### 55. PriceRangeFilter ### 55. PriceRangeFilter
**Lokacija:** `/src/components/PriceRangeFilter.tsx` **Lokacija:** `/src/components/PriceRangeFilter.tsx`
**Namen:** Filter za izbiro cenovnih razredov restavracij (od € do €€€€). **Namen:** Filter za izbiro enega ali več cenovnih razredov (€, €€, €€€, €€€€).
**Uporaba:** Uporabite v sekciji filtrov za filtriranje po cenovnem razredu. **Uporaba:** Uporabite za filtriranje restavracij po cenovnem razredu.
### 56. RatingSlider ### 56. RatingSlider
**Lokacija:** `/src/components/RatingSlider.tsx` **Lokacija:** `/src/components/RatingSlider.tsx`
**Namen:** Drsnik za filtriranje restavracij po minimalni oceni. **Namen:** Drsnik za izbiro minimalne ocene pri filtriranju, z natančnim prikazom trenutno izbrane vrednosti.
**Uporaba:** Uporabite v sekciji filtrov za filtriranje restavracij po minimalni oceni. **Uporaba:** Uporabite za filtriranje restavracij glede na oceno (od 0 do 5).
### 57. AdditionalOptionsFilter ### 57. AdditionalOptionsFilter
**Lokacija:** `/src/components/AdditionalOptionsFilter.tsx` **Lokacija:** `/src/components/AdditionalOptionsFilter.tsx`
**Namen:** Skupina potrditvenih polj za dodatne možnosti filtriranja (odprto zdaj, parkirišče, ipd.). **Namen:** Zbirka potrditvenih polj za dodatne možnosti filtriranja, kot so trenutno odprto, parkirišče in podobno.
**Uporaba:** Uporabite v sekciji filtrov za bolj natančno filtriranje restavracij. **Uporaba:** Uporabite za omogočanje filtriranja po dodatnih specifikacijah restavracij.
### 58. SearchResultsHeader ### 58. SearchResultsHeader
**Lokacija:** `/src/components/SearchResultsHeader.tsx` **Lokacija:** `/src/components/SearchResultsHeader.tsx`
**Namen:** Glava sekcije rezultatov iskanja z naslovom in izbirnikom za razvrščanje. **Namen:** Naslovni del rezultatov iskanja z naslovom in izbirnikom za razvrščanje rezultatov po različnih kriterijih.
**Uporaba:** Uporabite kot uvod v sekcijo rezultatov iskanja. **Uporaba:** Uporabite na začetku sekcije z rezultati iskanja.
### 59. ActiveFiltersDisplay ### 59. ActiveFiltersDisplay
**Lokacija:** `/src/components/ActiveFiltersDisplay.tsx` **Lokacija:** `/src/components/ActiveFiltersDisplay.tsx`
**Namen:** Prikaz aktivnih filtrov in možnost njihove odstranitve. **Namen:** Prikaz trenutno aktivnih filtrov v obliki značk (chips) z možnostjo hitrega odstranjevanja posameznih filtrov.
**Uporaba:** Uporabite nad rezultati iskanja za prikaz in hitro odstranjevanje aplikaciranih filtrov. **Uporaba:** Uporabite pod naslovom rezultatov iskanja za pregleden prikaz uporabljenih filtrov.
### 60. SearchRestaurantCard ### 60. SearchRestaurantCard
**Lokacija:** `/src/components/SearchRestaurantCard.tsx` **Lokacija:** `/src/components/SearchRestaurantCard.tsx`
**Namen:** Razširjena kartica restavracije s podrobnostmi za prikaz v rezultatih iskanja. **Namen:** Podrobna kartica posamezne restavracije v rezultatih iskanja, ki prikazuje sliko, osnovne podatke, oceno, kuhinje in gumb za rezervacijo.
**Uporaba:** Uporabite za prikaz posamezne restavracije v rezultatih iskanja. **Uporaba:** Uporabite za vsako restavracijo v seznamu rezultatov iskanja.
### 61. LoadMoreButton ### 61. LoadMoreButton
**Lokacija:** `/src/components/LoadMoreButton.tsx` **Lokacija:** `/src/components/LoadMoreButton.tsx`
**Namen:** Gumb za nalaganje dodatnih rezultatov iskanja. **Namen:** Gumb za nalaganje dodatnih rezultatov iskanja za implementacijo paginacije.
**Uporaba:** Uporabite na koncu seznama rezultatov iskanja za prikaz več restavracij. **Uporaba:** Uporabite na koncu seznama rezultatov iskanja, ko je na voljo več rezultatov kot je trenutno prikazano.
## Strani aplikacije ## Strani aplikacije
@ -378,4 +378,70 @@ const { navigateTo } = useContext(NavigationContext);
const handleButtonClick = () => { const handleButtonClick = () => {
navigateTo('pageName'); // kjer je pageName ena izmed: 'home', 'detail', 'reservation', 'confirmation', 'reservations' navigateTo('pageName'); // kjer je pageName ena izmed: 'home', 'detail', 'reservation', 'confirmation', 'reservations'
}; };
``` ```
## Nove komponente za iskanje in filtriranje
V sklopu posodobitve strani za iskanje smo ustvarili naslednje nove komponente:
### SearchNavBar
**Lokacija:** `/src/components/SearchNavBar.tsx`
**Namen:** Navigacijska vrstica za stran z iskanjem, ki vsebuje naslov strani in gumbe za hitro ponastavitev filtrov in dostop do pomoči.
**Uporaba:** Uporabite kot glavno navigacijo na vrhu strani za iskanje in filtriranje.
### AdvancedSearchBar
**Lokacija:** `/src/components/AdvancedSearchBar.tsx`
**Namen:** Iskalno polje s podporo za vnos in čiščenje poizvedbe, s poudarjeno vizualno podobo.
**Uporaba:** Uporabite kot glavni vnos za iskalno poizvedbo na strani za iskanje.
### FilterHeader
**Lokacija:** `/src/components/FilterHeader.tsx`
**Namen:** Naslovni del filtrirne sekcije, ki prikazuje naslov "Filtri" in gumb za ponastavitev vseh filtrov.
**Uporaba:** Uporabite kot uvod v sklop filtrov na strani za iskanje.
### LocationFilter
**Lokacija:** `/src/components/LocationFilter.tsx`
**Namen:** Kompleksna komponenta za filtriranje po lokaciji, ki združuje vnosno polje in hitre izbire priljubljenih lokacij.
**Uporaba:** Uporabite za omogočanje različnih načinov določanja lokacije pri iskanju restavracij.
### CuisineFilterGrid
**Lokacija:** `/src/components/CuisineFilterGrid.tsx`
**Namen:** Vizualno privlačna mreža za izbiro vrst kuhinje z ikonami in besedilom, podpira večkratno izbiro.
**Uporaba:** Uporabite za filtriranje restavracij po vrstah kuhinje.
### PriceRangeFilter
**Lokacija:** `/src/components/PriceRangeFilter.tsx`
**Namen:** Filter za izbiro enega ali več cenovnih razredov (€, €€, €€€, €€€€).
**Uporaba:** Uporabite za filtriranje restavracij po cenovnem razredu.
### RatingSlider
**Lokacija:** `/src/components/RatingSlider.tsx`
**Namen:** Drsnik za izbiro minimalne ocene pri filtriranju, z natančnim prikazom trenutno izbrane vrednosti.
**Uporaba:** Uporabite za filtriranje restavracij glede na oceno (od 0 do 5).
### AdditionalOptionsFilter
**Lokacija:** `/src/components/AdditionalOptionsFilter.tsx`
**Namen:** Zbirka potrditvenih polj za dodatne možnosti filtriranja, kot so trenutno odprto, parkirišče in podobno.
**Uporaba:** Uporabite za omogočanje filtriranja po dodatnih specifikacijah restavracij.
### SearchResultsHeader
**Lokacija:** `/src/components/SearchResultsHeader.tsx`
**Namen:** Naslovni del rezultatov iskanja z naslovom in izbirnikom za razvrščanje rezultatov po različnih kriterijih.
**Uporaba:** Uporabite na začetku sekcije z rezultati iskanja.
### ActiveFiltersDisplay
**Lokacija:** `/src/components/ActiveFiltersDisplay.tsx`
**Namen:** Prikaz trenutno aktivnih filtrov v obliki značk (chips) z možnostjo hitrega odstranjevanja posameznih filtrov.
**Uporaba:** Uporabite pod naslovom rezultatov iskanja za pregleden prikaz uporabljenih filtrov.
### SearchRestaurantCard
**Lokacija:** `/src/components/SearchRestaurantCard.tsx`
**Namen:** Podrobna kartica posamezne restavracije v rezultatih iskanja, ki prikazuje sliko, osnovne podatke, oceno, kuhinje in gumb za rezervacijo.
**Uporaba:** Uporabite za vsako restavracijo v seznamu rezultatov iskanja.
### LoadMoreButton
**Lokacija:** `/src/components/LoadMoreButton.tsx`
**Namen:** Gumb za nalaganje dodatnih rezultatov iskanja za implementacijo paginacije.
**Uporaba:** Uporabite na koncu seznama rezultatov iskanja, ko je na voljo več rezultatov kot je trenutno prikazano.
Te komponente skupaj omogočajo moderno, prilagodljivo in uporabniku prijazno izkušnjo iskanja in filtriranja restavracij, ki sledi najboljšim praksam komponentno usmerjenega razvoja v Reactu.

835
node_modules/.package-lock.json generated vendored

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Add.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Add_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"
}), "Add");
export {
Add_default as default
};
//# sourceMappingURL=@mui_icons-material_Add.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Add.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z\"\n}), 'Add');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,cAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,KAAK;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/ArrowBack.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var ArrowBack_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20z"
}), "ArrowBack");
export {
ArrowBack_default as default
};
//# sourceMappingURL=@mui_icons-material_ArrowBack.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/ArrowBack.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20z\"\n}), 'ArrowBack');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,oBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,WAAW;",
"names": ["_jsx"]
}

View File

@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
createSvgIcon createSvgIcon
} from "./chunk-Y7GULVZW.js"; } from "./chunk-WMQC35LZ.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-CWMN43OP.js"; } from "./chunk-CWMN43OP.js";

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/BookmarkBorder.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var BookmarkBorder_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2m0 15-5-2.18L7 18V5h10z"
}), "BookmarkBorder");
export {
BookmarkBorder_default as default
};
//# sourceMappingURL=@mui_icons-material_BookmarkBorder.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/BookmarkBorder.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M17 3H7c-1.1 0-1.99.9-1.99 2L5 21l7-3 7 3V5c0-1.1-.9-2-2-2m0 15-5-2.18L7 18V5h10z\"\n}), 'BookmarkBorder');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,yBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,gBAAgB;",
"names": ["_jsx"]
}

View File

@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
createSvgIcon createSvgIcon
} from "./chunk-Y7GULVZW.js"; } from "./chunk-WMQC35LZ.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-CWMN43OP.js"; } from "./chunk-CWMN43OP.js";

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/CalendarMonth.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var CalendarMonth_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2m0 16H5V10h14zM9 14H7v-2h2zm4 0h-2v-2h2zm4 0h-2v-2h2zm-8 4H7v-2h2zm4 0h-2v-2h2zm4 0h-2v-2h2z"
}), "CalendarMonth");
export {
CalendarMonth_default as default
};
//# sourceMappingURL=@mui_icons-material_CalendarMonth.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/CalendarMonth.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2m0 16H5V10h14zM9 14H7v-2h2zm4 0h-2v-2h2zm4 0h-2v-2h2zm-8 4H7v-2h2zm4 0h-2v-2h2zm4 0h-2v-2h2z\"\n}), 'CalendarMonth');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,wBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,eAAe;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/CalendarToday.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var CalendarToday_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m0 18H4V8h16z"
}), "CalendarToday");
export {
CalendarToday_default as default
};
//# sourceMappingURL=@mui_icons-material_CalendarToday.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/CalendarToday.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m0 18H4V8h16z\"\n}), 'CalendarToday');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,wBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,eAAe;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Call.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Call_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M20.01 15.38c-1.23 0-2.42-.2-3.53-.56-.35-.12-.74-.03-1.01.24l-1.57 1.97c-2.83-1.35-5.48-3.9-6.89-6.83l1.95-1.66c.27-.28.35-.67.24-1.02-.37-1.11-.56-2.3-.56-3.53 0-.54-.45-.99-.99-.99H4.19C3.65 3 3 3.24 3 3.99 3 13.28 10.73 21 20.01 21c.71 0 .99-.63.99-1.18v-3.45c0-.54-.45-.99-.99-.99"
}), "Call");
export {
Call_default as default
};
//# sourceMappingURL=@mui_icons-material_Call.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Call.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M20.01 15.38c-1.23 0-2.42-.2-3.53-.56-.35-.12-.74-.03-1.01.24l-1.57 1.97c-2.83-1.35-5.48-3.9-6.89-6.83l1.95-1.66c.27-.28.35-.67.24-1.02-.37-1.11-.56-2.3-.56-3.53 0-.54-.45-.99-.99-.99H4.19C3.65 3 3 3.24 3 3.99 3 13.28 10.73 21 20.01 21c.71 0 .99-.63.99-1.18v-3.45c0-.54-.45-.99-.99-.99\"\n}), 'Call');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,eAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,MAAM;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Collections.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Collections_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2m-11-4 2.03 2.71L16 11l4 5H8zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6z"
}), "Collections");
export {
Collections_default as default
};
//# sourceMappingURL=@mui_icons-material_Collections.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Collections.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2m-11-4 2.03 2.71L16 11l4 5H8zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6z\"\n}), 'Collections');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,sBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,aAAa;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Directions.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Directions_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "m21.41 10.59-7.99-8c-.78-.78-2.05-.78-2.83 0l-8.01 8c-.78.78-.78 2.05 0 2.83l8.01 8c.78.78 2.05.78 2.83 0l7.99-8c.79-.79.79-2.05 0-2.83M13.5 14.5V12H10v3H8v-4c0-.55.45-1 1-1h4.5V7.5L17 11z"
}), "Directions");
export {
Directions_default as default
};
//# sourceMappingURL=@mui_icons-material_Directions.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Directions.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"m21.41 10.59-7.99-8c-.78-.78-2.05-.78-2.83 0l-8.01 8c-.78.78-.78 2.05 0 2.83l8.01 8c.78.78 2.05.78 2.83 0l7.99-8c.79-.79.79-2.05 0-2.83M13.5 14.5V12H10v3H8v-4c0-.55.45-1 1-1h4.5V7.5L17 11z\"\n}), 'Directions');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,qBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,YAAY;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/ExpandLess.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var ExpandLess_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"
}), "ExpandLess");
export {
ExpandLess_default as default
};
//# sourceMappingURL=@mui_icons-material_ExpandLess.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/ExpandLess.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z\"\n}), 'ExpandLess');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,qBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,YAAY;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/ExpandMore.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var ExpandMore_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z"
}), "ExpandMore");
export {
ExpandMore_default as default
};
//# sourceMappingURL=@mui_icons-material_ExpandMore.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/ExpandMore.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z\"\n}), 'ExpandMore');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,qBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,YAAY;",
"names": ["_jsx"]
}

View File

@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
createSvgIcon createSvgIcon
} from "./chunk-Y7GULVZW.js"; } from "./chunk-WMQC35LZ.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-CWMN43OP.js"; } from "./chunk-CWMN43OP.js";

View File

@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
createSvgIcon createSvgIcon
} from "./chunk-Y7GULVZW.js"; } from "./chunk-WMQC35LZ.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-CWMN43OP.js"; } from "./chunk-CWMN43OP.js";

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/HelpOutline.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var HelpOutline_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M11 18h2v-2h-2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4"
}), "HelpOutline");
export {
HelpOutline_default as default
};
//# sourceMappingURL=@mui_icons-material_HelpOutline.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/HelpOutline.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M11 18h2v-2h-2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4\"\n}), 'HelpOutline');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,sBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,aAAa;",
"names": ["_jsx"]
}

View File

@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
createSvgIcon createSvgIcon
} from "./chunk-Y7GULVZW.js"; } from "./chunk-WMQC35LZ.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-CWMN43OP.js"; } from "./chunk-CWMN43OP.js";

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/InfoOutlined.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var InfoOutlined_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8"
}), "InfoOutlined");
export {
InfoOutlined_default as default
};
//# sourceMappingURL=@mui_icons-material_InfoOutlined.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/InfoOutlined.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M11 7h2v2h-2zm0 4h2v6h-2zm1-9C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8\"\n}), 'InfoOutlined');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,uBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,cAAc;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Language.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Language_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2m6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56M12 4.04c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96M4.26 14C4.1 13.36 4 12.69 4 12s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2s.06 1.34.14 2zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56m2.95-8H5.08c.96-1.66 2.49-2.93 4.33-3.56C8.81 5.55 8.35 6.75 8.03 8M12 19.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96M14.34 14H9.66c-.09-.66-.16-1.32-.16-2s.07-1.35.16-2h4.68c.09.65.16 1.32.16 2s-.07 1.34-.16 2m.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56M16.36 14c.08-.66.14-1.32.14-2s-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2z"
}), "Language");
export {
Language_default as default
};
//# sourceMappingURL=@mui_icons-material_Language.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Language.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M11.99 2C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2m6.93 6h-2.95c-.32-1.25-.78-2.45-1.38-3.56 1.84.63 3.37 1.91 4.33 3.56M12 4.04c.83 1.2 1.48 2.53 1.91 3.96h-3.82c.43-1.43 1.08-2.76 1.91-3.96M4.26 14C4.1 13.36 4 12.69 4 12s.1-1.36.26-2h3.38c-.08.66-.14 1.32-.14 2s.06 1.34.14 2zm.82 2h2.95c.32 1.25.78 2.45 1.38 3.56-1.84-.63-3.37-1.9-4.33-3.56m2.95-8H5.08c.96-1.66 2.49-2.93 4.33-3.56C8.81 5.55 8.35 6.75 8.03 8M12 19.96c-.83-1.2-1.48-2.53-1.91-3.96h3.82c-.43 1.43-1.08 2.76-1.91 3.96M14.34 14H9.66c-.09-.66-.16-1.32-.16-2s.07-1.35.16-2h4.68c.09.65.16 1.32.16 2s-.07 1.34-.16 2m.25 5.56c.6-1.11 1.06-2.31 1.38-3.56h2.95c-.96 1.65-2.49 2.93-4.33 3.56M16.36 14c.08-.66.14-1.32.14-2s-.06-1.34-.14-2h3.38c.16.64.26 1.31.26 2s-.1 1.36-.26 2z\"\n}), 'Language');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,mBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,UAAU;",
"names": ["_jsx"]
}

View File

@ -1,22 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/LocalFireDepartment.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var LocalFireDepartment_default = createSvgIcon([(0, import_jsx_runtime.jsx)("path", {
d: "m12 12.9-2.13 2.09c-.56.56-.87 1.29-.87 2.07C9 18.68 10.35 20 12 20s3-1.32 3-2.94c0-.78-.31-1.52-.87-2.07z"
}, "0"), (0, import_jsx_runtime.jsx)("path", {
d: "m16 6-.44.55C14.38 8.02 12 7.19 12 5.3V2S4 6 4 13c0 2.92 1.56 5.47 3.89 6.86-.56-.79-.89-1.76-.89-2.8 0-1.32.52-2.56 1.47-3.5L12 10.1l3.53 3.47c.95.93 1.47 2.17 1.47 3.5 0 1.02-.31 1.96-.85 2.75 1.89-1.15 3.29-3.06 3.71-5.3.66-3.55-1.07-6.9-3.86-8.52"
}, "1")], "LocalFireDepartment");
export {
LocalFireDepartment_default as default
};
//# sourceMappingURL=@mui_icons-material_LocalFireDepartment.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/LocalFireDepartment.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon([/*#__PURE__*/_jsx(\"path\", {\n d: \"m12 12.9-2.13 2.09c-.56.56-.87 1.29-.87 2.07C9 18.68 10.35 20 12 20s3-1.32 3-2.94c0-.78-.31-1.52-.87-2.07z\"\n}, \"0\"), /*#__PURE__*/_jsx(\"path\", {\n d: \"m16 6-.44.55C14.38 8.02 12 7.19 12 5.3V2S4 6 4 13c0 2.92 1.56 5.47 3.89 6.86-.56-.79-.89-1.76-.89-2.8 0-1.32.52-2.56 1.47-3.5L12 10.1l3.53 3.47c.95.93 1.47 2.17 1.47 3.5 0 1.02-.31 1.96-.85 2.75 1.89-1.15 3.29-3.06 3.71-5.3.66-3.55-1.07-6.9-3.86-8.52\"\n}, \"1\")], 'LocalFireDepartment');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,8BAAQ,cAAc,KAAc,mBAAAA,KAAK,QAAQ;AAAA,EACtD,GAAG;AACL,GAAG,GAAG,OAAgB,mBAAAA,KAAK,QAAQ;AAAA,EACjC,GAAG;AACL,GAAG,GAAG,CAAC,GAAG,qBAAqB;",
"names": ["_jsx"]
}

View File

@ -1,24 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/LocationOnOutlined.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var LocationOnOutlined_default = createSvgIcon([(0, import_jsx_runtime.jsx)("path", {
d: "M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7M7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 2.88-2.88 7.19-5 9.88C9.92 16.21 7 11.85 7 9"
}, "0"), (0, import_jsx_runtime.jsx)("circle", {
cx: "12",
cy: "9",
r: "2.5"
}, "1")], "LocationOnOutlined");
export {
LocationOnOutlined_default as default
};
//# sourceMappingURL=@mui_icons-material_LocationOnOutlined.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/LocationOnOutlined.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon([/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7M7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 2.88-2.88 7.19-5 9.88C9.92 16.21 7 11.85 7 9\"\n}, \"0\"), /*#__PURE__*/_jsx(\"circle\", {\n cx: \"12\",\n cy: \"9\",\n r: \"2.5\"\n}, \"1\")], 'LocationOnOutlined');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,6BAAQ,cAAc,KAAc,mBAAAA,KAAK,QAAQ;AAAA,EACtD,GAAG;AACL,GAAG,GAAG,OAAgB,mBAAAA,KAAK,UAAU;AAAA,EACnC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,GAAG;AACL,GAAG,GAAG,CAAC,GAAG,oBAAoB;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Map.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Map_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "m20.5 3-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5M15 19l-6-2.11V5l6 2.11z"
}), "Map");
export {
Map_default as default
};
//# sourceMappingURL=@mui_icons-material_Map.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Map.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"m20.5 3-.16.03L15 5.1 9 3 3.36 4.9c-.21.07-.36.25-.36.48V20.5c0 .28.22.5.5.5l.16-.03L9 18.9l6 2.1 5.64-1.9c.21-.07.36-.25.36-.48V3.5c0-.28-.22-.5-.5-.5M15 19l-6-2.11V5l6 2.11z\"\n}), 'Map');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,cAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,KAAK;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Menu.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Menu_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M3 18h18v-2H3zm0-5h18v-2H3zm0-7v2h18V6z"
}), "Menu");
export {
Menu_default as default
};
//# sourceMappingURL=@mui_icons-material_Menu.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Menu.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M3 18h18v-2H3zm0-5h18v-2H3zm0-7v2h18V6z\"\n}), 'Menu');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,eAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,MAAM;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/People.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var People_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5s-3 1.34-3 3 1.34 3 3 3m-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5 5 6.34 5 8s1.34 3 3 3m0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5m8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5"
}), "People");
export {
People_default as default
};
//# sourceMappingURL=@mui_icons-material_People.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/People.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5s-3 1.34-3 3 1.34 3 3 3m-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5 5 6.34 5 8s1.34 3 3 3m0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5m8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5\"\n}), 'People');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,iBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,QAAQ;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/PersonOutline.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var PersonOutline_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1S9.9 9.16 9.9 8s.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1H5.9V17c0-.64 3.13-2.1 6.1-2.1M12 4C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4m0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4"
}), "PersonOutline");
export {
PersonOutline_default as default
};
//# sourceMappingURL=@mui_icons-material_PersonOutline.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/PersonOutline.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 5.9c1.16 0 2.1.94 2.1 2.1s-.94 2.1-2.1 2.1S9.9 9.16 9.9 8s.94-2.1 2.1-2.1m0 9c2.97 0 6.1 1.46 6.1 2.1v1.1H5.9V17c0-.64 3.13-2.1 6.1-2.1M12 4C9.79 4 8 5.79 8 8s1.79 4 4 4 4-1.79 4-4-1.79-4-4-4m0 9c-2.67 0-8 1.34-8 4v3h16v-3c0-2.66-5.33-4-8-4\"\n}), 'PersonOutline');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,wBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,eAAe;",
"names": ["_jsx"]
}

View File

@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
createSvgIcon createSvgIcon
} from "./chunk-Y7GULVZW.js"; } from "./chunk-WMQC35LZ.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-CWMN43OP.js"; } from "./chunk-CWMN43OP.js";

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/PhoneOutlined.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var PhoneOutlined_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M6.54 5c.06.89.21 1.76.45 2.59l-1.2 1.2c-.41-1.2-.67-2.47-.76-3.79zm9.86 12.02c.85.24 1.72.39 2.6.45v1.49c-1.32-.09-2.59-.35-3.8-.75zM7.5 3H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.49c0-.55-.45-1-1-1-1.24 0-2.45-.2-3.57-.57-.1-.04-.21-.05-.31-.05-.26 0-.51.1-.71.29l-2.2 2.2c-2.83-1.45-5.15-3.76-6.59-6.59l2.2-2.2c.28-.28.36-.67.25-1.02C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1"
}), "PhoneOutlined");
export {
PhoneOutlined_default as default
};
//# sourceMappingURL=@mui_icons-material_PhoneOutlined.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/PhoneOutlined.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M6.54 5c.06.89.21 1.76.45 2.59l-1.2 1.2c-.41-1.2-.67-2.47-.76-3.79zm9.86 12.02c.85.24 1.72.39 2.6.45v1.49c-1.32-.09-2.59-.35-3.8-.75zM7.5 3H4c-.55 0-1 .45-1 1 0 9.39 7.61 17 17 17 .55 0 1-.45 1-1v-3.49c0-.55-.45-1-1-1-1.24 0-2.45-.2-3.57-.57-.1-.04-.21-.05-.31-.05-.26 0-.51.1-.71.29l-2.2 2.2c-2.83-1.45-5.15-3.76-6.59-6.59l2.2-2.2c.28-.28.36-.67.25-1.02C8.7 6.45 8.5 5.25 8.5 4c0-.55-.45-1-1-1\"\n}), 'PhoneOutlined');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,wBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,eAAe;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Remove.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Remove_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M19 13H5v-2h14z"
}), "Remove");
export {
Remove_default as default
};
//# sourceMappingURL=@mui_icons-material_Remove.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Remove.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M19 13H5v-2h14z\"\n}), 'Remove');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,iBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,QAAQ;",
"names": ["_jsx"]
}

View File

@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
createSvgIcon createSvgIcon
} from "./chunk-Y7GULVZW.js"; } from "./chunk-WMQC35LZ.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-CWMN43OP.js"; } from "./chunk-CWMN43OP.js";

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Search.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Search_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14"
}), "Search");
export {
Search_default as default
};
//# sourceMappingURL=@mui_icons-material_Search.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Search.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14\"\n}), 'Search');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,iBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,QAAQ;",
"names": ["_jsx"]
}

View File

@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
createSvgIcon createSvgIcon
} from "./chunk-Y7GULVZW.js"; } from "./chunk-WMQC35LZ.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-CWMN43OP.js"; } from "./chunk-CWMN43OP.js";

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Share.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Share_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92-1.31-2.92-2.92-2.92"
}), "Share");
export {
Share_default as default
};
//# sourceMappingURL=@mui_icons-material_Share.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Share.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M18 16.08c-.76 0-1.44.3-1.96.77L8.91 12.7c.05-.23.09-.46.09-.7s-.04-.47-.09-.7l7.05-4.11c.54.5 1.25.81 2.04.81 1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3c0 .24.04.47.09.7L8.04 9.81C7.5 9.31 6.79 9 6 9c-1.66 0-3 1.34-3 3s1.34 3 3 3c.79 0 1.5-.31 2.04-.81l7.12 4.16c-.05.21-.08.43-.08.65 0 1.61 1.31 2.92 2.92 2.92s2.92-1.31 2.92-2.92-1.31-2.92-2.92-2.92\"\n}), 'Share');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,gBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,OAAO;",
"names": ["_jsx"]
}

View File

@ -1,22 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Spa.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Spa_default = createSvgIcon([(0, import_jsx_runtime.jsx)("path", {
d: "M8.55 12c-1.07-.71-2.25-1.27-3.53-1.61 1.28.34 2.46.9 3.53 1.61m10.43-1.61c-1.29.34-2.49.91-3.57 1.64 1.08-.73 2.28-1.3 3.57-1.64"
}, "0"), (0, import_jsx_runtime.jsx)("path", {
d: "M15.49 9.63c-.18-2.79-1.31-5.51-3.43-7.63-2.14 2.14-3.32 4.86-3.55 7.63 1.28.68 2.46 1.56 3.49 2.63 1.03-1.06 2.21-1.94 3.49-2.63m-6.5 2.65c-.14-.1-.3-.19-.45-.29.15.11.31.19.45.29m6.42-.25c-.13.09-.27.16-.4.26.13-.1.27-.17.4-.26M12 15.45C9.85 12.17 6.18 10 2 10c0 5.32 3.36 9.82 8.03 11.49.63.23 1.29.4 1.97.51.68-.12 1.33-.29 1.97-.51C18.64 19.82 22 15.32 22 10c-4.18 0-7.85 2.17-10 5.45"
}, "1")], "Spa");
export {
Spa_default as default
};
//# sourceMappingURL=@mui_icons-material_Spa.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Spa.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon([/*#__PURE__*/_jsx(\"path\", {\n d: \"M8.55 12c-1.07-.71-2.25-1.27-3.53-1.61 1.28.34 2.46.9 3.53 1.61m10.43-1.61c-1.29.34-2.49.91-3.57 1.64 1.08-.73 2.28-1.3 3.57-1.64\"\n}, \"0\"), /*#__PURE__*/_jsx(\"path\", {\n d: \"M15.49 9.63c-.18-2.79-1.31-5.51-3.43-7.63-2.14 2.14-3.32 4.86-3.55 7.63 1.28.68 2.46 1.56 3.49 2.63 1.03-1.06 2.21-1.94 3.49-2.63m-6.5 2.65c-.14-.1-.3-.19-.45-.29.15.11.31.19.45.29m6.42-.25c-.13.09-.27.16-.4.26.13-.1.27-.17.4-.26M12 15.45C9.85 12.17 6.18 10 2 10c0 5.32 3.36 9.82 8.03 11.49.63.23 1.29.4 1.97.51.68-.12 1.33-.29 1.97-.51C18.64 19.82 22 15.32 22 10c-4.18 0-7.85 2.17-10 5.45\"\n}, \"1\")], 'Spa');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,cAAQ,cAAc,KAAc,mBAAAA,KAAK,QAAQ;AAAA,EACtD,GAAG;AACL,GAAG,GAAG,OAAgB,mBAAAA,KAAK,QAAQ;AAAA,EACjC,GAAG;AACL,GAAG,GAAG,CAAC,GAAG,KAAK;",
"names": ["_jsx"]
}

View File

@ -1,7 +1,7 @@
"use client"; "use client";
import { import {
createSvgIcon createSvgIcon
} from "./chunk-Y7GULVZW.js"; } from "./chunk-WMQC35LZ.js";
import { import {
require_jsx_runtime require_jsx_runtime
} from "./chunk-CWMN43OP.js"; } from "./chunk-CWMN43OP.js";

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/StarHalf.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var StarHalf_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "m22 9.24-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03zM12 15.4V6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28z"
}), "StarHalf");
export {
StarHalf_default as default
};
//# sourceMappingURL=@mui_icons-material_StarHalf.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/StarHalf.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"m22 9.24-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03zM12 15.4V6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28z\"\n}), 'StarHalf');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,mBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,UAAU;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/StarOutline.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var StarOutline_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "m22 9.24-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28z"
}), "StarOutline");
export {
StarOutline_default as default
};
//# sourceMappingURL=@mui_icons-material_StarOutline.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/StarOutline.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"m22 9.24-7.19-.62L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21 12 17.27 18.18 21l-1.63-7.03zM12 15.4l-3.76 2.27 1-4.28-3.32-2.88 4.38-.38L12 6.1l1.71 4.04 4.38.38-3.32 2.88 1 4.28z\"\n}), 'StarOutline');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,sBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,aAAa;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/ThreeSixty.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var ThreeSixty_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M12 7C6.48 7 2 9.24 2 12c0 2.24 2.94 4.13 7 4.77V20l4-4-4-4v2.73c-3.15-.56-5-1.9-5-2.73 0-1.06 3.04-3 8-3s8 1.94 8 3c0 .73-1.46 1.89-4 2.53v2.05c3.53-.77 6-2.53 6-4.58 0-2.76-4.48-5-10-5"
}), "ThreeSixty");
export {
ThreeSixty_default as default
};
//# sourceMappingURL=@mui_icons-material_ThreeSixty.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/ThreeSixty.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M12 7C6.48 7 2 9.24 2 12c0 2.24 2.94 4.13 7 4.77V20l4-4-4-4v2.73c-3.15-.56-5-1.9-5-2.73 0-1.06 3.04-3 8-3s8 1.94 8 3c0 .73-1.46 1.89-4 2.53v2.05c3.53-.77 6-2.53 6-4.58 0-2.76-4.48-5-10-5\"\n}), 'ThreeSixty');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,qBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,YAAY;",
"names": ["_jsx"]
}

View File

@ -1,20 +0,0 @@
"use client";
import {
createSvgIcon
} from "./chunk-Y7GULVZW.js";
import {
require_jsx_runtime
} from "./chunk-CWMN43OP.js";
import {
__toESM
} from "./chunk-37AZBUIX.js";
// node_modules/@mui/icons-material/esm/Warning.js
var import_jsx_runtime = __toESM(require_jsx_runtime());
var Warning_default = createSvgIcon((0, import_jsx_runtime.jsx)("path", {
d: "M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z"
}), "Warning");
export {
Warning_default as default
};
//# sourceMappingURL=@mui_icons-material_Warning.js.map

View File

@ -1,7 +0,0 @@
{
"version": 3,
"sources": ["../../@mui/icons-material/esm/Warning.js"],
"sourcesContent": ["\"use client\";\n\nimport createSvgIcon from \"./utils/createSvgIcon.js\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default createSvgIcon(/*#__PURE__*/_jsx(\"path\", {\n d: \"M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z\"\n}), 'Warning');"],
"mappings": ";;;;;;;;;;;;AAGA,yBAA4B;AAC5B,IAAO,kBAAQ,kBAA2B,mBAAAA,KAAK,QAAQ;AAAA,EACrD,GAAG;AACL,CAAC,GAAG,SAAS;",
"names": ["_jsx"]
}

View File

@ -1,274 +1,100 @@
{ {
"hash": "5ef07269", "hash": "8ebffc56",
"configHash": "09fb8e3b", "configHash": "a6bbf03f",
"lockfileHash": "831dfe8f", "lockfileHash": "3a42d559",
"browserHash": "45e8d737", "browserHash": "40d3e13b",
"optimized": { "optimized": {
"react": { "react": {
"src": "../../react/index.js", "src": "../../react/index.js",
"file": "react.js", "file": "react.js",
"fileHash": "7fb7686f", "fileHash": "48e354ea",
"needsInterop": true "needsInterop": true
}, },
"react-dom": { "react-dom": {
"src": "../../react-dom/index.js", "src": "../../react-dom/index.js",
"file": "react-dom.js", "file": "react-dom.js",
"fileHash": "df7d2859", "fileHash": "79612f02",
"needsInterop": true "needsInterop": true
}, },
"react/jsx-dev-runtime": { "react/jsx-dev-runtime": {
"src": "../../react/jsx-dev-runtime.js", "src": "../../react/jsx-dev-runtime.js",
"file": "react_jsx-dev-runtime.js", "file": "react_jsx-dev-runtime.js",
"fileHash": "6ecc5f3c", "fileHash": "b266e8aa",
"needsInterop": true "needsInterop": true
}, },
"react/jsx-runtime": { "react/jsx-runtime": {
"src": "../../react/jsx-runtime.js", "src": "../../react/jsx-runtime.js",
"file": "react_jsx-runtime.js", "file": "react_jsx-runtime.js",
"fileHash": "8e582a50", "fileHash": "cbf05157",
"needsInterop": true "needsInterop": true
}, },
"@mui/icons-material/Bolt": { "@mui/icons-material/Bolt": {
"src": "../../@mui/icons-material/esm/Bolt.js", "src": "../../@mui/icons-material/esm/Bolt.js",
"file": "@mui_icons-material_Bolt.js", "file": "@mui_icons-material_Bolt.js",
"fileHash": "d9f5a101", "fileHash": "f86d1873",
"needsInterop": false
},
"@mui/icons-material/BookmarkBorder": {
"src": "../../@mui/icons-material/esm/BookmarkBorder.js",
"file": "@mui_icons-material_BookmarkBorder.js",
"fileHash": "056b53e6",
"needsInterop": false "needsInterop": false
}, },
"@mui/icons-material/BookmarkBorderOutlined": { "@mui/icons-material/BookmarkBorderOutlined": {
"src": "../../@mui/icons-material/esm/BookmarkBorderOutlined.js", "src": "../../@mui/icons-material/esm/BookmarkBorderOutlined.js",
"file": "@mui_icons-material_BookmarkBorderOutlined.js", "file": "@mui_icons-material_BookmarkBorderOutlined.js",
"fileHash": "d5424b85", "fileHash": "1b7152dd",
"needsInterop": false "needsInterop": false
}, },
"@mui/icons-material/Favorite": { "@mui/icons-material/Favorite": {
"src": "../../@mui/icons-material/esm/Favorite.js", "src": "../../@mui/icons-material/esm/Favorite.js",
"file": "@mui_icons-material_Favorite.js", "file": "@mui_icons-material_Favorite.js",
"fileHash": "5c7d1679", "fileHash": "a4e2c7a3",
"needsInterop": false "needsInterop": false
}, },
"@mui/icons-material/FavoriteBorder": { "@mui/icons-material/FavoriteBorder": {
"src": "../../@mui/icons-material/esm/FavoriteBorder.js", "src": "../../@mui/icons-material/esm/FavoriteBorder.js",
"file": "@mui_icons-material_FavoriteBorder.js", "file": "@mui_icons-material_FavoriteBorder.js",
"fileHash": "222f66ec", "fileHash": "bd44a34f",
"needsInterop": false "needsInterop": false
}, },
"@mui/icons-material/HomeOutlined": { "@mui/icons-material/HomeOutlined": {
"src": "../../@mui/icons-material/esm/HomeOutlined.js", "src": "../../@mui/icons-material/esm/HomeOutlined.js",
"file": "@mui_icons-material_HomeOutlined.js", "file": "@mui_icons-material_HomeOutlined.js",
"fileHash": "6ad849c1", "fileHash": "1f6ed9ce",
"needsInterop": false
},
"@mui/icons-material/Map": {
"src": "../../@mui/icons-material/esm/Map.js",
"file": "@mui_icons-material_Map.js",
"fileHash": "48df0f94",
"needsInterop": false
},
"@mui/icons-material/Menu": {
"src": "../../@mui/icons-material/esm/Menu.js",
"file": "@mui_icons-material_Menu.js",
"fileHash": "e09e4ac3",
"needsInterop": false
},
"@mui/icons-material/People": {
"src": "../../@mui/icons-material/esm/People.js",
"file": "@mui_icons-material_People.js",
"fileHash": "0043bea8",
"needsInterop": false
},
"@mui/icons-material/PersonOutline": {
"src": "../../@mui/icons-material/esm/PersonOutline.js",
"file": "@mui_icons-material_PersonOutline.js",
"fileHash": "1e63241b",
"needsInterop": false "needsInterop": false
}, },
"@mui/icons-material/PersonOutlineOutlined": { "@mui/icons-material/PersonOutlineOutlined": {
"src": "../../@mui/icons-material/esm/PersonOutlineOutlined.js", "src": "../../@mui/icons-material/esm/PersonOutlineOutlined.js",
"file": "@mui_icons-material_PersonOutlineOutlined.js", "file": "@mui_icons-material_PersonOutlineOutlined.js",
"fileHash": "b25f8bad", "fileHash": "722ee881",
"needsInterop": false "needsInterop": false
}, },
"@mui/icons-material/Schedule": { "@mui/icons-material/Schedule": {
"src": "../../@mui/icons-material/esm/Schedule.js", "src": "../../@mui/icons-material/esm/Schedule.js",
"file": "@mui_icons-material_Schedule.js", "file": "@mui_icons-material_Schedule.js",
"fileHash": "2d43d762", "fileHash": "73ecbc4d",
"needsInterop": false
},
"@mui/icons-material/Search": {
"src": "../../@mui/icons-material/esm/Search.js",
"file": "@mui_icons-material_Search.js",
"fileHash": "a7b7bf11",
"needsInterop": false "needsInterop": false
}, },
"@mui/icons-material/SearchOutlined": { "@mui/icons-material/SearchOutlined": {
"src": "../../@mui/icons-material/esm/SearchOutlined.js", "src": "../../@mui/icons-material/esm/SearchOutlined.js",
"file": "@mui_icons-material_SearchOutlined.js", "file": "@mui_icons-material_SearchOutlined.js",
"fileHash": "bba631f6", "fileHash": "933e8dc9",
"needsInterop": false
},
"@mui/icons-material/Spa": {
"src": "../../@mui/icons-material/esm/Spa.js",
"file": "@mui_icons-material_Spa.js",
"fileHash": "287698ce",
"needsInterop": false "needsInterop": false
}, },
"@mui/icons-material/Star": { "@mui/icons-material/Star": {
"src": "../../@mui/icons-material/esm/Star.js", "src": "../../@mui/icons-material/esm/Star.js",
"file": "@mui_icons-material_Star.js", "file": "@mui_icons-material_Star.js",
"fileHash": "499e2dfb", "fileHash": "a6bf3f83",
"needsInterop": false "needsInterop": false
}, },
"react-dom/client": { "react-dom/client": {
"src": "../../react-dom/client.js", "src": "../../react-dom/client.js",
"file": "react-dom_client.js", "file": "react-dom_client.js",
"fileHash": "8816a7b7", "fileHash": "a09bec96",
"needsInterop": true "needsInterop": true
},
"@mui/icons-material/ArrowBack": {
"src": "../../@mui/icons-material/esm/ArrowBack.js",
"file": "@mui_icons-material_ArrowBack.js",
"fileHash": "26cb48ab",
"needsInterop": false
},
"@mui/icons-material/Share": {
"src": "../../@mui/icons-material/esm/Share.js",
"file": "@mui_icons-material_Share.js",
"fileHash": "796301c3",
"needsInterop": false
},
"@mui/icons-material/StarHalf": {
"src": "../../@mui/icons-material/esm/StarHalf.js",
"file": "@mui_icons-material_StarHalf.js",
"fileHash": "90e94703",
"needsInterop": false
},
"@mui/icons-material/StarOutline": {
"src": "../../@mui/icons-material/esm/StarOutline.js",
"file": "@mui_icons-material_StarOutline.js",
"fileHash": "92a31d90",
"needsInterop": false
},
"@mui/icons-material/Call": {
"src": "../../@mui/icons-material/esm/Call.js",
"file": "@mui_icons-material_Call.js",
"fileHash": "36ed310e",
"needsInterop": false
},
"@mui/icons-material/Directions": {
"src": "../../@mui/icons-material/esm/Directions.js",
"file": "@mui_icons-material_Directions.js",
"fileHash": "62829467",
"needsInterop": false
},
"@mui/icons-material/Language": {
"src": "../../@mui/icons-material/esm/Language.js",
"file": "@mui_icons-material_Language.js",
"fileHash": "00dcdbbd",
"needsInterop": false
},
"@mui/icons-material/ExpandMore": {
"src": "../../@mui/icons-material/esm/ExpandMore.js",
"file": "@mui_icons-material_ExpandMore.js",
"fileHash": "0b8cc1b4",
"needsInterop": false
},
"@mui/icons-material/LocalFireDepartment": {
"src": "../../@mui/icons-material/esm/LocalFireDepartment.js",
"file": "@mui_icons-material_LocalFireDepartment.js",
"fileHash": "df6a7447",
"needsInterop": false
},
"@mui/icons-material/Warning": {
"src": "../../@mui/icons-material/esm/Warning.js",
"file": "@mui_icons-material_Warning.js",
"fileHash": "49c2238e",
"needsInterop": false
},
"@mui/icons-material/Add": {
"src": "../../@mui/icons-material/esm/Add.js",
"file": "@mui_icons-material_Add.js",
"fileHash": "181647c0",
"needsInterop": false
},
"@mui/icons-material/Remove": {
"src": "../../@mui/icons-material/esm/Remove.js",
"file": "@mui_icons-material_Remove.js",
"fileHash": "9314724d",
"needsInterop": false
},
"@mui/icons-material/CalendarMonth": {
"src": "../../@mui/icons-material/esm/CalendarMonth.js",
"file": "@mui_icons-material_CalendarMonth.js",
"fileHash": "0a3f523f",
"needsInterop": false
},
"@mui/icons-material/Collections": {
"src": "../../@mui/icons-material/esm/Collections.js",
"file": "@mui_icons-material_Collections.js",
"fileHash": "121e09e9",
"needsInterop": false
},
"@mui/icons-material/ThreeSixty": {
"src": "../../@mui/icons-material/esm/ThreeSixty.js",
"file": "@mui_icons-material_ThreeSixty.js",
"fileHash": "bc898f7a",
"needsInterop": false
},
"react-router-dom": {
"src": "../../react-router-dom/dist/index.mjs",
"file": "react-router-dom.js",
"fileHash": "0b4ed6cc",
"needsInterop": false
},
"@mui/icons-material/ExpandLess": {
"src": "../../@mui/icons-material/esm/ExpandLess.js",
"file": "@mui_icons-material_ExpandLess.js",
"fileHash": "9f28451f",
"needsInterop": false
},
"@mui/icons-material/LocationOnOutlined": {
"src": "../../@mui/icons-material/esm/LocationOnOutlined.js",
"file": "@mui_icons-material_LocationOnOutlined.js",
"fileHash": "766b07fd",
"needsInterop": false
},
"@mui/icons-material/PhoneOutlined": {
"src": "../../@mui/icons-material/esm/PhoneOutlined.js",
"file": "@mui_icons-material_PhoneOutlined.js",
"fileHash": "e371a20f",
"needsInterop": false
},
"@mui/icons-material/InfoOutlined": {
"src": "../../@mui/icons-material/esm/InfoOutlined.js",
"file": "@mui_icons-material_InfoOutlined.js",
"fileHash": "af5a8ac9",
"needsInterop": false
},
"@mui/icons-material/HelpOutline": {
"src": "../../@mui/icons-material/esm/HelpOutline.js",
"file": "@mui_icons-material_HelpOutline.js",
"fileHash": "5bb97e48",
"needsInterop": false
},
"@mui/icons-material/CalendarToday": {
"src": "../../@mui/icons-material/esm/CalendarToday.js",
"file": "@mui_icons-material_CalendarToday.js",
"fileHash": "6a98d87e",
"needsInterop": false
} }
}, },
"chunks": { "chunks": {
"chunk-GJJM2GG4": { "chunk-GJJM2GG4": {
"file": "chunk-GJJM2GG4.js" "file": "chunk-GJJM2GG4.js"
}, },
"chunk-Y7GULVZW": { "chunk-WMQC35LZ": {
"file": "chunk-Y7GULVZW.js" "file": "chunk-WMQC35LZ.js"
}, },
"chunk-CWMN43OP": { "chunk-CWMN43OP": {
"file": "chunk-CWMN43OP.js" "file": "chunk-CWMN43OP.js"

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

838
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -34,6 +34,6 @@
"tailwindcss": "^3.3.5", "tailwindcss": "^3.3.5",
"typescript": "~5.7.2", "typescript": "~5.7.2",
"typescript-eslint": "^8.26.1", "typescript-eslint": "^8.26.1",
"vite": "^6.3.1" "vite": "^6.3.2"
} }
} }

View File

@ -7,11 +7,12 @@ import ReservationPage from './pages/ReservationPage'
import ConfirmationPage from './pages/ConfirmationPage' import ConfirmationPage from './pages/ConfirmationPage'
import ReservationsHistoryPage from './pages/ReservationsHistoryPage' import ReservationsHistoryPage from './pages/ReservationsHistoryPage'
import SearchPage from './pages/SearchPage' import SearchPage from './pages/SearchPage'
import ProfilePage from './pages/ProfilePage'
// Ustvarimo kontekst za navigacijo // Ustvarimo kontekst za navigacijo
export const NavigationContext = createContext<{ export const NavigationContext = createContext<{
navigateTo: (page: 'home' | 'detail' | 'reservation' | 'confirmation' | 'reservations' | 'search', restaurantId?: number) => void; navigateTo: (page: 'home' | 'detail' | 'reservation' | 'confirmation' | 'reservations' | 'search' | 'profile', restaurantId?: number) => void;
currentPage: 'home' | 'detail' | 'reservation' | 'confirmation' | 'reservations' | 'search'; currentPage: 'home' | 'detail' | 'reservation' | 'confirmation' | 'reservations' | 'search' | 'profile';
currentRestaurantId?: number; currentRestaurantId?: number;
}>({ }>({
navigateTo: () => {}, navigateTo: () => {},
@ -19,11 +20,11 @@ export const NavigationContext = createContext<{
}); });
function App() { function App() {
const [currentPage, setCurrentPage] = useState<'home' | 'detail' | 'reservation' | 'confirmation' | 'reservations' | 'search'>('home'); const [currentPage, setCurrentPage] = useState<'home' | 'detail' | 'reservation' | 'confirmation' | 'reservations' | 'search' | 'profile'>('home');
const [currentRestaurantId, setCurrentRestaurantId] = useState<number | undefined>(1); const [currentRestaurantId, setCurrentRestaurantId] = useState<number | undefined>(1);
// Funkcija za navigacijo med stranmi // Funkcija za navigacijo med stranmi
const navigateTo = (page: 'home' | 'detail' | 'reservation' | 'confirmation' | 'reservations' | 'search', restaurantId?: number) => { const navigateTo = (page: 'home' | 'detail' | 'reservation' | 'confirmation' | 'reservations' | 'search' | 'profile', restaurantId?: number) => {
setCurrentPage(page); setCurrentPage(page);
if (restaurantId) { if (restaurantId) {
setCurrentRestaurantId(restaurantId); setCurrentRestaurantId(restaurantId);
@ -57,6 +58,8 @@ function App() {
return <ReservationsHistoryPage />; return <ReservationsHistoryPage />;
case 'search': case 'search':
return <SearchPage />; return <SearchPage />;
case 'profile':
return <ProfilePage />;
default: default:
return <HomePage />; return <HomePage />;
} }

View File

@ -0,0 +1,36 @@
import React from 'react';
interface ActiveFiltersDisplayProps {
activeFilters: string[];
onRemoveFilter: (filter: string) => void;
}
const ActiveFiltersDisplay: React.FC<ActiveFiltersDisplayProps> = ({
activeFilters,
onRemoveFilter
}) => {
if (activeFilters.length === 0) {
return null;
}
return (
<div className="flex flex-wrap gap-2 mb-4">
{activeFilters.map(filter => (
<div
key={filter}
className="px-3 py-1 bg-black text-white text-xs rounded-full flex items-center"
>
{filter}
<span
className="material-icons-outlined text-xs ml-1 cursor-pointer"
onClick={() => onRemoveFilter(filter)}
>
close
</span>
</div>
))}
</div>
);
};
export default ActiveFiltersDisplay;

View File

@ -0,0 +1,79 @@
import React from 'react';
interface AdditionalOptions {
openNow: boolean;
hasParking: boolean;
acceptsReservations: boolean;
hasWifi: boolean;
outdoorSeating: boolean;
}
interface AdditionalOptionsFilterProps {
options: AdditionalOptions;
onOptionChange: (option: keyof AdditionalOptions) => void;
}
const AdditionalOptionsFilter: React.FC<AdditionalOptionsFilterProps> = ({
options,
onOptionChange
}) => {
return (
<div className="mb-4">
<h3 className="text-sm font-medium text-black mb-2">Dodatne možnosti</h3>
<div className="space-y-2">
<div className="flex items-center">
<input
type="checkbox"
id="open-now"
checked={options.openNow}
onChange={() => onOptionChange('openNow')}
className="w-4 h-4 mr-2"
/>
<label htmlFor="open-now" className="text-sm text-black">Trenutno odprto</label>
</div>
<div className="flex items-center">
<input
type="checkbox"
id="has-parking"
checked={options.hasParking}
onChange={() => onOptionChange('hasParking')}
className="w-4 h-4 mr-2"
/>
<label htmlFor="has-parking" className="text-sm text-black">Parkirišče</label>
</div>
<div className="flex items-center">
<input
type="checkbox"
id="accepts-reservations"
checked={options.acceptsReservations}
onChange={() => onOptionChange('acceptsReservations')}
className="w-4 h-4 mr-2"
/>
<label htmlFor="accepts-reservations" className="text-sm text-black">Sprejema rezervacije</label>
</div>
<div className="flex items-center">
<input
type="checkbox"
id="wifi"
checked={options.hasWifi}
onChange={() => onOptionChange('hasWifi')}
className="w-4 h-4 mr-2"
/>
<label htmlFor="wifi" className="text-sm text-black">Brezplačen Wi-Fi</label>
</div>
<div className="flex items-center">
<input
type="checkbox"
id="outdoor-seating"
checked={options.outdoorSeating}
onChange={() => onOptionChange('outdoorSeating')}
className="w-4 h-4 mr-2"
/>
<label htmlFor="outdoor-seating" className="text-sm text-black">Zunanja terasa</label>
</div>
</div>
</div>
);
};
export default AdditionalOptionsFilter;

View File

@ -1,61 +1,35 @@
import React, { useState } from 'react'; import React from 'react';
interface AdvancedSearchBarProps { interface AdvancedSearchBarProps {
onSearch: (query: string) => void; query: string;
initialQuery?: string; onSearch: (e: React.ChangeEvent<HTMLInputElement>) => void;
placeholder?: string; onClear: () => void;
} }
const AdvancedSearchBar: React.FC<AdvancedSearchBarProps> = ({ const AdvancedSearchBar: React.FC<AdvancedSearchBarProps> = ({ query, onSearch, onClear }) => {
onSearch,
initialQuery = '',
placeholder = 'Išči restavracije, jedi...'
}) => {
const [query, setQuery] = useState(initialQuery);
const handleClear = () => {
setQuery('');
onSearch('');
};
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setQuery(e.target.value);
};
const handleSubmit = (e: React.FormEvent) => {
e.preventDefault();
onSearch(query);
};
return ( return (
<form <div className="px-5 pt-4 pb-2">
onSubmit={handleSubmit} <div className="relative mb-4">
className="w-full px-5 py-3" <span className="material-icons-outlined absolute left-3 top-3 text-gray-400">search</span>
> <input
<div className="relative"> type="text"
<span className="absolute left-3 top-1/2 transform -translate-y-1/2 material-icons-outlined text-gray-500">
search
</span>
<input
type="text"
value={query} value={query}
onChange={handleChange} onChange={onSearch}
placeholder={placeholder} placeholder="Išči po imenu restavracije ali jedi"
className="w-full pl-10 pr-10 py-3 border border-gray-300 rounded-xl focus:outline-none focus:ring-2 focus:ring-blue-400" aria-label="Iskanje restavracij po imenu"
aria-label="Iskalni vnos" className="w-full py-3 pl-10 pr-10 rounded-xl border border-gray-200 bg-white text-black card-shadow focus:outline-none focus:ring-2 focus:ring-blue-200"
/> />
{query.length > 0 && ( {query && (
<button <button
type="button" className="absolute right-3 top-3 text-gray-400"
onClick={handleClear} aria-label="Počisti iskanje"
className="absolute right-3 top-1/2 transform -translate-y-1/2 material-icons-outlined text-gray-500" onClick={onClear}
aria-label="Počisti iskalno polje"
> >
cancel <span className="material-icons-outlined">close</span>
</button> </button>
)} )}
</div> </div>
</form> </div>
); );
}; };

View File

@ -0,0 +1,46 @@
import React from 'react';
import { Category } from '../types';
interface CuisineFilterGridProps {
categories: Category[];
selectedCuisines: string[];
onCuisineSelect: (cuisineId: string) => void;
}
const CuisineFilterGrid: React.FC<CuisineFilterGridProps> = ({
categories,
selectedCuisines,
onCuisineSelect
}) => {
return (
<div className="mb-4">
<h3 className="text-sm font-medium text-black mb-2">Vrsta kuhinje</h3>
<div className="grid grid-cols-3 gap-2">
{categories.slice(0, 8).map((category) => (
<div key={category.id} className="cuisine-filter-item">
<input
type="checkbox"
id={`cuisine-${category.id}`}
checked={selectedCuisines.includes(category.id.toString())}
onChange={() => onCuisineSelect(category.id.toString())}
className="hidden cuisine-checkbox"
/>
<label
htmlFor={`cuisine-${category.id}`}
className={`flex flex-col items-center p-3 ${selectedCuisines.includes(category.id.toString()) ? 'bg-black text-white' : 'bg-white text-black'} border border-gray-200 rounded-xl cursor-pointer`}
>
<span className="text-xl mb-1">{category.emoji}</span>
<span className="text-xs">{category.name}</span>
</label>
</div>
))}
<button className="flex flex-col items-center justify-center p-3 bg-white border border-gray-200 rounded-xl text-black">
<span className="material-icons-outlined mb-1">add</span>
<span className="text-xs">Več</span>
</button>
</div>
</div>
);
};
export default CuisineFilterGrid;

View File

@ -1,29 +1,29 @@
import React from 'react'; import React from 'react';
interface EmptyReservationsProps { interface EmptyReservationsProps {
onFindRestaurantsClick?: () => void; onFindRestaurantsClick: () => void;
} }
const EmptyReservations: React.FC<EmptyReservationsProps> = ({ const EmptyReservations: React.FC<EmptyReservationsProps> = ({
onFindRestaurantsClick onFindRestaurantsClick
}) => { }) => {
return ( return (
<div className="px-5 py-10"> <div className="flex flex-col items-center justify-center px-5 py-12 h-full">
<div className="flex flex-col items-center justify-center text-center"> <div className="bg-gray-100 w-20 h-20 rounded-full flex items-center justify-center mb-6">
<div className="w-20 h-20 rounded-full bg-gray-100 flex items-center justify-center mb-4"> <span className="material-icons-outlined text-gray-400 text-4xl">event_busy</span>
<span className="material-icons-outlined text-gray-400 text-3xl">calendar_today</span>
</div>
<h3 className="text-lg font-medium text-black mb-2">Ni rezervacij</h3>
<p className="text-sm text-black opacity-70 mb-6 max-w-[250px]">
Trenutno nimate nobenih rezervacij. Raziščite restavracije in ustvarite svojo prvo rezervacijo.
</p>
<button
className="px-6 py-3 bg-black text-white rounded-xl font-medium btn-press"
onClick={onFindRestaurantsClick}
>
Poišči restavracije
</button>
</div> </div>
<h2 className="text-xl font-bold text-black mb-2 text-center">Nimate še rezervacij</h2>
<p className="text-gray-600 text-center mb-8">
Odkrijte odlične restavracije v vaši bližini in rezervirajte mizo.
</p>
<button
className="py-3 px-6 bg-black text-white rounded-lg font-medium"
onClick={onFindRestaurantsClick}
>
Poiščite restavracije
</button>
</div> </div>
); );
}; };

View File

@ -0,0 +1,106 @@
import React from 'react';
import { restaurants } from '../data/mockData';
interface FavoriteRestaurantsProps {
onRestaurantClick: (id: number) => void;
onReservationClick: (id: number) => void;
}
const FavoriteRestaurants = ({
onRestaurantClick,
onReservationClick
}: FavoriteRestaurantsProps) => {
// Uporabimo nekaj naključnih restavracij za demo
const favoriteRestaurants = restaurants.slice(0, 2);
if (favoriteRestaurants.length === 0) {
return (
<div className="px-5 py-8 text-center">
<span className="material-icons-outlined text-gray-400 text-5xl mb-2">restaurant</span>
<p className="text-gray-600 mb-4">Nimate še priljubljenih restavracij</p>
<button
className="py-2 px-4 bg-black text-white rounded-lg text-sm"
onClick={() => onRestaurantClick(1)}
>
Raziščite restavracije
</button>
</div>
);
}
return (
<div className="px-5 py-4">
<div className="space-y-4">
{favoriteRestaurants.map(restaurant => (
<div
key={restaurant.id}
className="bg-white rounded-xl overflow-hidden card-shadow"
>
<img
src={restaurant.image}
alt={restaurant.imageAlt}
className="w-full h-48 object-cover cursor-pointer"
onClick={() => onRestaurantClick(restaurant.id)}
loading="lazy"
/>
<div className="p-3">
<div className="flex justify-between items-start">
<div className="cursor-pointer" onClick={() => onRestaurantClick(restaurant.id)}>
<h3 className="font-semibold text-black">{restaurant.name}</h3>
<p className="text-xs text-black opacity-70">{restaurant.location} {restaurant.distance}</p>
</div>
<div className="flex items-center gap-2">
<div className="flex items-center gap-1">
<span className="material-icons-outlined text-sm text-black">star</span>
<span className="text-sm font-medium text-black">{restaurant.rating}</span>
</div>
<button
className="favorite-btn p-1"
aria-label="Odstrani iz priljubljenih"
onClick={(e) => {
e.stopPropagation();
alert('Odstranjeno iz priljubljenih');
}}
>
<span className="material-icons text-red-500 text-sm">favorite</span>
</button>
</div>
</div>
<div className="flex flex-wrap items-center gap-2 mt-2">
{restaurant.cuisines.map(cuisine => (
<span
key={cuisine}
className="text-xs text-black bg-gray-100 px-2 py-1 rounded-full"
>
{cuisine}
</span>
))}
<span className={`text-xs text-black ${restaurant.isOpen ? 'bg-green-100' : 'bg-orange-100'} px-2 py-1 rounded-full flex items-center`}>
<span className="material-icons-outlined text-xs mr-0.5">schedule</span>
{restaurant.isOpen ? 'Odprto zdaj' : 'Trenutno zaprto'}
</span>
</div>
<div className="mt-2 pt-2 border-t border-gray-100 flex justify-between items-center">
<div className="text-xs text-black">
<span className="font-medium"></span>
<span className="opacity-70 ml-1">Povprečen obrok</span>
</div>
<button
className="py-1 px-3 bg-black text-white text-xs rounded-lg"
onClick={(e) => {
e.stopPropagation();
onReservationClick(restaurant.id);
}}
>
Rezerviraj
</button>
</div>
</div>
</div>
))}
</div>
</div>
);
};
export default FavoriteRestaurants;

View File

@ -0,0 +1,21 @@
import React from 'react';
interface FilterHeaderProps {
onReset: () => void;
}
const FilterHeader: React.FC<FilterHeaderProps> = ({ onReset }) => {
return (
<div className="flex justify-between items-center mb-4">
<h2 className="text-base font-semibold text-black">Filtri</h2>
<button
className="text-sm text-blue-500"
onClick={onReset}
>
Ponastavi vse
</button>
</div>
);
};
export default FilterHeader;

View File

@ -0,0 +1,18 @@
import React from 'react';
interface LoadMoreButtonProps {
onClick: () => void;
}
const LoadMoreButton: React.FC<LoadMoreButtonProps> = ({ onClick }) => {
return (
<button
className="w-full py-3 text-center text-sm font-medium text-black border border-gray-200 rounded-xl mt-2"
onClick={onClick}
>
Naloži več
</button>
);
};
export default LoadMoreButton;

View File

@ -0,0 +1,45 @@
import React from 'react';
interface LocationFilterProps {
selectedLocation: string;
onLocationChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
onLocationSelect: (location: string) => void;
availableLocations?: string[];
}
const LocationFilter: React.FC<LocationFilterProps> = ({
selectedLocation,
onLocationChange,
onLocationSelect,
availableLocations = ['V bližini', 'Ljubljana Center', 'Šiška', 'Bežigrad', 'Vič']
}) => {
return (
<div className="mb-4">
<h3 className="text-sm font-medium text-black mb-2">Lokacija</h3>
<div className="relative">
<span className="material-icons-outlined absolute left-3 top-3 text-gray-400">place</span>
<input
type="text"
value={selectedLocation}
onChange={onLocationChange}
placeholder="Vnesite lokacijo ali razdaljo"
aria-label="Filter po lokaciji"
className="w-full py-3 pl-10 pr-3 rounded-xl border border-gray-200 bg-white text-black focus:outline-none focus:ring-2 focus:ring-blue-200"
/>
</div>
<div className="flex overflow-x-auto hide-scrollbar gap-2 mt-2">
{availableLocations.map((location) => (
<button
key={location}
className={`py-2 px-3 border ${selectedLocation === location ? 'bg-black text-white' : 'border-gray-200 text-black'} rounded-lg whitespace-nowrap text-xs font-medium`}
onClick={() => onLocationSelect(location)}
>
{location}
</button>
))}
</div>
</div>
);
};
export default LocationFilter;

View File

@ -0,0 +1,40 @@
import React from 'react';
interface PriceRangeFilterProps {
selectedPriceRange: string[];
onPriceSelect: (price: string) => void;
}
const PriceRangeFilter: React.FC<PriceRangeFilterProps> = ({
selectedPriceRange,
onPriceSelect
}) => {
const priceOptions = ['€', '€€', '€€€', '€€€€'];
return (
<div className="mb-4">
<h3 className="text-sm font-medium text-black mb-2">Cenovni razred</h3>
<div className="flex gap-2">
{priceOptions.map((price, index) => (
<div key={price} className="price-filter-item flex-1">
<input
type="checkbox"
id={`price-${index + 1}`}
checked={selectedPriceRange.includes(price)}
onChange={() => onPriceSelect(price)}
className="hidden price-checkbox"
/>
<label
htmlFor={`price-${index + 1}`}
className={`flex items-center justify-center py-3 ${selectedPriceRange.includes(price) ? 'bg-black text-white' : 'bg-white text-black'} border border-gray-200 rounded-xl cursor-pointer w-full`}
>
<span className="text-sm">{price}</span>
</label>
</div>
))}
</div>
</div>
);
};
export default PriceRangeFilter;

View File

@ -0,0 +1,66 @@
import React from 'react';
interface ProfileHeaderProps {
userName: string;
userEmail: string;
userImageUrl?: string;
reservationsCount: number;
favoritesCount: number;
onEditProfileClick: () => void;
}
const ProfileHeader = ({
userName,
userEmail,
userImageUrl,
reservationsCount,
favoritesCount,
onEditProfileClick
}: ProfileHeaderProps) => {
return (
<div className="px-5 py-6 bg-white">
<div className="flex items-center">
<div className="relative mr-4">
{userImageUrl ? (
<img
src={userImageUrl}
alt={`Profilna slika uporabnika ${userName}`}
className="w-20 h-20 rounded-full object-cover"
/>
) : (
<div className="w-20 h-20 rounded-full bg-gray-300 flex items-center justify-center">
<span className="material-icons text-gray-500 text-3xl">person</span>
</div>
)}
</div>
<div className="flex-1">
<h1 className="text-xl font-bold text-black">{userName}</h1>
<p className="text-gray-600 text-sm">{userEmail}</p>
<button
className="mt-2 text-sm text-primary-600 font-medium"
onClick={onEditProfileClick}
aria-label="Uredi profil"
>
Uredi profil
</button>
</div>
</div>
<div className="flex justify-between mt-6">
<div className="text-center">
<p className="text-2xl font-bold text-black">{reservationsCount}</p>
<p className="text-sm text-gray-600">Rezervacij</p>
</div>
<div className="text-center">
<p className="text-2xl font-bold text-black">{favoritesCount}</p>
<p className="text-sm text-gray-600">Priljubljenih</p>
</div>
</div>
</div>
);
};
export default ProfileHeader;

View File

@ -0,0 +1,39 @@
import React from 'react';
interface ProfileNavBarProps {
onSettingsClick: () => void;
onHelpClick: () => void;
}
const ProfileNavBar = ({
onSettingsClick,
onHelpClick
}: ProfileNavBarProps) => {
return (
<nav
className="sticky top-0 bg-white py-4 px-5 flex items-center justify-between shadow-sm z-10"
role="navigation"
aria-label="Glavna navigacija"
>
<div className="font-bold text-lg text-black">Moj profil</div>
<div className="flex items-center gap-4">
<button
aria-label="Nastavitve profila"
className="p-1"
onClick={onSettingsClick}
>
<span className="material-icons-outlined text-black">settings</span>
</button>
<button
aria-label="Pomoč"
className="p-1"
onClick={onHelpClick}
>
<span className="material-icons-outlined text-black">help_outline</span>
</button>
</div>
</nav>
);
};
export default ProfileNavBar;

View File

@ -0,0 +1,44 @@
import React from 'react';
interface ProfileTabsProps {
activeTab: 'favorites' | 'reservations' | 'reviews';
onTabChange: (tab: 'favorites' | 'reservations' | 'reviews') => void;
}
const ProfileTabs = ({
activeTab,
onTabChange
}: ProfileTabsProps) => {
return (
<div className="px-5 pt-4 pb-2 bg-white">
<div className="flex border-b border-gray-200">
<button
className={`flex-1 text-center py-3 text-sm font-medium ${activeTab === 'favorites' ? 'border-b-2 border-black text-black' : 'text-gray-500'}`}
onClick={() => onTabChange('favorites')}
aria-selected={activeTab === 'favorites'}
role="tab"
>
Priljubljene
</button>
<button
className={`flex-1 text-center py-3 text-sm font-medium ${activeTab === 'reservations' ? 'border-b-2 border-black text-black' : 'text-gray-500'}`}
onClick={() => onTabChange('reservations')}
aria-selected={activeTab === 'reservations'}
role="tab"
>
Rezervacije
</button>
<button
className={`flex-1 text-center py-3 text-sm font-medium ${activeTab === 'reviews' ? 'border-b-2 border-black text-black' : 'text-gray-500'}`}
onClick={() => onTabChange('reviews')}
aria-selected={activeTab === 'reviews'}
role="tab"
>
Mnenja
</button>
</div>
</div>
);
};
export default ProfileTabs;

View File

@ -0,0 +1,32 @@
import React from 'react';
interface RatingSliderProps {
rating: number;
onRatingChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
}
const RatingSlider: React.FC<RatingSliderProps> = ({ rating, onRatingChange }) => {
return (
<div className="mb-4">
<h3 className="text-sm font-medium text-black mb-2">Ocena</h3>
<div className="flex items-center mb-3">
<input
type="range"
min="0"
max="5"
step="0.5"
value={rating}
onChange={onRatingChange}
className="w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer"
/>
<span className="ml-3 text-sm font-medium">{rating > 0 ? `${rating.toFixed(1)}+` : 'Vse'}</span>
</div>
<div className="flex justify-between text-xs text-gray-500">
<span>Vse ocene</span>
<span>5.0</span>
</div>
</div>
);
};
export default RatingSlider;

View File

@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import ReservationHistoryCard, { ReservationHistoryItem } from './ReservationHistoryCard'; import { ReservationHistoryItem } from './ReservationHistoryCard';
import ReservationHistoryCard from './ReservationHistoryCard';
interface ReservationsGroup { interface ReservationsGroup {
title: string; title: string;
@ -25,34 +26,54 @@ const ReservationsList: React.FC<ReservationsListProps> = ({
onLoadMoreClick, onLoadMoreClick,
hasMoreItems = false hasMoreItems = false
}) => { }) => {
// Preveri, če so sploh kakšne rezervacije
const hasReservations = groups.some(group => group.items.length > 0);
if (!hasReservations) {
return (
<div className="p-5 text-center">
<div className="mb-3 text-gray-400">
<span className="material-icons-outlined text-6xl">event_busy</span>
</div>
<h3 className="font-semibold text-black mb-1">
{isPastList ? 'Nimate preteklih rezervacij' : 'Nimate prihajajočih rezervacij'}
</h3>
<p className="text-sm text-gray-600">
{isPastList
? 'Ko boste obiskali restavracije, se bodo pojavile tukaj.'
: 'Ko rezervirate mizo, se bodo rezervacije pojavile tukaj.'}
</p>
</div>
);
}
return ( return (
<div className="tab-content"> <div className="p-4">
{groups.map((group, index) => ( {groups.map((group, index) =>
<div key={index} className={`px-5 ${index === 0 ? 'pt-6 pb-3' : 'py-3'}`}> group.items.length > 0 && (
<h2 className="text-sm font-medium text-black opacity-70 mb-4">{group.title}</h2> <div key={group.title} className={index > 0 ? 'mt-6' : ''}>
<h3 className="text-sm font-medium text-black mb-3">{group.title}</h3>
{group.items.map(reservation => (
<ReservationHistoryCard {group.items.map(reservation => (
key={reservation.id} <ReservationHistoryCard
reservation={reservation} key={reservation.id}
onEditClick={onEditClick} reservation={reservation}
onCancelClick={onCancelClick} onEditClick={isPastList ? undefined : onEditClick}
onRateClick={onRateClick} onCancelClick={isPastList ? undefined : onCancelClick}
/> onRateClick={isPastList ? onRateClick : undefined}
))} />
</div> ))}
))} </div>
)
)}
{/* Gumb za nalaganje več (samo za pretekle rezervacije) */}
{isPastList && hasMoreItems && ( {isPastList && hasMoreItems && (
<div className="px-5 py-3"> <button
<button className="w-full py-3 text-center text-sm font-medium text-black border border-gray-200 rounded-lg mt-4"
className="w-full py-3 text-center text-sm font-medium text-black border border-gray-200 rounded-lg mt-2 btn-press" onClick={onLoadMoreClick}
onClick={onLoadMoreClick} >
> Naloži več
Prikaži več rezervacij </button>
</button>
</div>
)} )}
</div> </div>
); );

View File

@ -1,8 +1,8 @@
import React from 'react'; import React from 'react';
interface ReservationsNavBarProps { interface ReservationsNavBarProps {
onFilterClick?: () => void; onFilterClick: () => void;
onHelpClick?: () => void; onHelpClick: () => void;
} }
const ReservationsNavBar: React.FC<ReservationsNavBarProps> = ({ const ReservationsNavBar: React.FC<ReservationsNavBarProps> = ({
@ -13,9 +13,9 @@ const ReservationsNavBar: React.FC<ReservationsNavBarProps> = ({
<nav <nav
className="sticky top-0 bg-white py-4 px-5 flex items-center justify-between shadow-sm z-10" className="sticky top-0 bg-white py-4 px-5 flex items-center justify-between shadow-sm z-10"
role="navigation" role="navigation"
aria-label="Glavna navigacija" aria-label="Navigacijska vrstica za rezervacije"
> >
<div className="font-bold text-lg text-black">Moje rezervacije</div> <div className="font-bold text-lg text-black">Rezervacije</div>
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<button <button
aria-label="Filtriraj rezervacije" aria-label="Filtriraj rezervacije"

View File

@ -10,25 +10,21 @@ const ReservationsTabs: React.FC<ReservationsTabsProps> = ({
onTabChange onTabChange
}) => { }) => {
return ( return (
<div className="sticky bg-white py-2 px-5 z-10"> <div className="sticky top-14 z-10 bg-white px-5 pt-4 pb-0 shadow-sm">
<div className="flex border-b border-gray-200"> <div className="flex border-b border-gray-200">
<button <button
className={`px-4 py-3 text-sm font-medium text-black flex-1 tab-button ${activeTab === 'upcoming' ? 'border-b-2 border-black' : 'opacity-60'}`} className={`flex-1 text-center py-3 text-sm font-medium ${activeTab === 'upcoming' ? 'border-b-2 border-black text-black' : 'text-gray-500'}`}
onClick={() => onTabChange('upcoming')} onClick={() => onTabChange('upcoming')}
aria-selected={activeTab === 'upcoming'} aria-selected={activeTab === 'upcoming'}
role="tab" role="tab"
aria-controls="upcoming-reservations"
id="tab-upcoming"
> >
Prihajajoče Prihajajoče
</button> </button>
<button <button
className={`px-4 py-3 text-sm font-medium text-black flex-1 tab-button ${activeTab === 'past' ? 'border-b-2 border-black' : 'opacity-60'}`} className={`flex-1 text-center py-3 text-sm font-medium ${activeTab === 'past' ? 'border-b-2 border-black text-black' : 'text-gray-500'}`}
onClick={() => onTabChange('past')} onClick={() => onTabChange('past')}
aria-selected={activeTab === 'past'} aria-selected={activeTab === 'past'}
role="tab" role="tab"
aria-controls="past-reservations"
id="tab-past"
> >
Pretekle Pretekle
</button> </button>

View File

@ -1,8 +1,8 @@
import React from 'react'; import React from 'react';
interface SearchNavBarProps { interface SearchNavBarProps {
onResetClick?: () => void; onResetClick: () => void;
onHelpClick?: () => void; onHelpClick: () => void;
} }
const SearchNavBar: React.FC<SearchNavBarProps> = ({ const SearchNavBar: React.FC<SearchNavBarProps> = ({

View File

@ -0,0 +1,83 @@
import React from 'react';
import { Restaurant } from '../types';
interface SearchRestaurantCardProps {
restaurant: Restaurant;
onRestaurantClick: (id: number) => void;
onReservationClick: (id: number) => void;
}
const SearchRestaurantCard: React.FC<SearchRestaurantCardProps> = ({
restaurant,
onRestaurantClick,
onReservationClick
}) => {
return (
<div
className="bg-white rounded-xl overflow-hidden card-shadow hover-card"
onClick={() => onRestaurantClick(restaurant.id)}
>
<img
src={restaurant.image}
alt={restaurant.imageAlt}
className="w-full h-48 object-cover"
loading="lazy"
/>
<div className="p-3">
<div className="flex justify-between items-start">
<div>
<h3 className="font-semibold text-black">{restaurant.name}</h3>
<p className="text-xs text-black opacity-70">{restaurant.location} {restaurant.distance}</p>
</div>
<div className="flex items-center gap-2">
<div className="flex items-center gap-1">
<span className="material-icons-outlined text-sm text-black">star</span>
<span className="text-sm font-medium text-black">{restaurant.rating}</span>
</div>
<button
className="favorite-btn p-1"
aria-label="Dodaj med priljubljene"
onClick={(e) => {
e.stopPropagation();
alert('Dodano med priljubljene');
}}
>
<span className="material-icons-outlined text-sm">favorite_border</span>
</button>
</div>
</div>
<div className="flex flex-wrap items-center gap-2 mt-2">
{restaurant.cuisines.map(cuisine => (
<span
key={cuisine}
className="text-xs text-black bg-gray-100 px-2 py-1 rounded-full"
>
{cuisine}
</span>
))}
<span className={`text-xs text-black ${restaurant.isOpen ? 'bg-green-100' : 'bg-orange-100'} px-2 py-1 rounded-full flex items-center`}>
<span className="material-icons-outlined text-xs mr-0.5">schedule</span>
{restaurant.isOpen ? 'Odprto zdaj' : 'Trenutno zaprto'}
</span>
</div>
<div className="mt-2 pt-2 border-t border-gray-100 flex justify-between items-center">
<div className="text-xs text-black">
<span className="font-medium"></span>
<span className="opacity-70 ml-1">Povprečen obrok</span>
</div>
<button
className="py-1 px-3 bg-black text-white text-xs rounded-lg"
onClick={(e) => {
e.stopPropagation();
onReservationClick(restaurant.id);
}}
>
Rezerviraj
</button>
</div>
</div>
</div>
);
};
export default SearchRestaurantCard;

View File

@ -0,0 +1,34 @@
import React from 'react';
interface SearchResultsHeaderProps {
sortBy: string;
onSortChange: (e: React.ChangeEvent<HTMLSelectElement>) => void;
}
const SearchResultsHeader: React.FC<SearchResultsHeaderProps> = ({ sortBy, onSortChange }) => {
return (
<div className="flex justify-between items-center mb-4">
<h2 className="text-base font-semibold text-black">Rezultati iskanja</h2>
<div className="flex items-center">
<span className="text-sm text-black mr-2">Razvrsti po:</span>
<div className="relative">
<select
className="text-sm text-black bg-white py-1 pl-2 pr-6 rounded-lg border border-gray-200 appearance-none"
value={sortBy}
onChange={onSortChange}
>
<option>Priporočeno</option>
<option>Ocena</option>
<option>Razdalja</option>
<option>Popularnost</option>
</select>
<span className="material-icons-outlined absolute right-1 top-1/2 transform -translate-y-1/2 text-black text-sm pointer-events-none">
expand_more
</span>
</div>
</div>
</div>
);
};
export default SearchResultsHeader;

View File

@ -0,0 +1,99 @@
import React from 'react';
interface UserReservationsProps {
onDetailsClick: (id: number) => void;
}
const UserReservations = ({
onDetailsClick
}: UserReservationsProps) => {
// Demo podatki za rezervacije
const reservations = [
{
id: 1,
restaurantName: "Gostilna Pri lipi",
date: "Petek, 15. maj 2023",
time: "19:00",
guests: 2,
status: "confirmed",
image: "https://images.unsplash.com/photo-1514933651103-005eec06c04b?ixlib=rb-1.2.1&auto=format&fit=crop&w=1074&q=80"
},
{
id: 2,
restaurantName: "Azijska kuhinja Sakura",
date: "Ponedeljek, 22. maj 2023",
time: "20:30",
guests: 4,
status: "completed",
image: "https://images.unsplash.com/photo-1555396273-367ea4eb4db5?ixlib=rb-1.2.1&auto=format&fit=crop&w=1074&q=80"
}
];
if (reservations.length === 0) {
return (
<div className="px-5 py-8 text-center">
<span className="material-icons-outlined text-gray-400 text-5xl mb-2">event_busy</span>
<p className="text-gray-600 mb-4">Nimate še rezervacij</p>
<button
className="py-2 px-4 bg-black text-white rounded-lg text-sm"
onClick={() => onDetailsClick(1)}
>
Rezervirajte zdaj
</button>
</div>
);
}
return (
<div className="px-5 py-4">
<div className="space-y-4">
{reservations.map(reservation => (
<div
key={reservation.id}
className="bg-white rounded-xl overflow-hidden card-shadow"
onClick={() => onDetailsClick(reservation.id)}
>
<div className="flex">
<div className="w-24 h-24 flex-shrink-0">
<img
src={reservation.image}
alt={`Restavracija ${reservation.restaurantName}`}
className="w-full h-full object-cover"
loading="lazy"
/>
</div>
<div className="p-3 flex-1">
<h3 className="font-semibold text-black">{reservation.restaurantName}</h3>
<div className="flex flex-col text-xs text-black mt-1">
<span className="mb-1 flex items-center">
<span className="material-icons-outlined text-xs mr-1">calendar_today</span>
{reservation.date}
</span>
<span className="mb-1 flex items-center">
<span className="material-icons-outlined text-xs mr-1">schedule</span>
{reservation.time}
</span>
<span className="flex items-center">
<span className="material-icons-outlined text-xs mr-1">people</span>
{reservation.guests} {reservation.guests === 1 ? 'oseba' : 'osebi'}
</span>
</div>
</div>
<div className="p-3 flex items-center">
<span className={`px-2 py-1 rounded-full text-xs ${
reservation.status === 'confirmed'
? 'bg-green-100 text-green-800'
: 'bg-gray-100 text-gray-800'
}`}>
{reservation.status === 'confirmed' ? 'Potrjeno' : 'Zaključeno'}
</span>
</div>
</div>
</div>
))}
</div>
</div>
);
};
export default UserReservations;

View File

@ -0,0 +1,94 @@
import React from 'react';
const UserReviews = () => {
// Demo podatki za ocene
const reviews = [
{
id: 1,
restaurantName: "Gostilna Pri lipi",
date: "15. maj 2023",
rating: 4.5,
text: "Odlična hrana in prijazna postrežba. Ambient je zelo prijeten in primeren za večerjo v dvoje ali s prijatelji. Priporočam njihove domače jedi!",
image: "https://images.unsplash.com/photo-1514933651103-005eec06c04b?ixlib=rb-1.2.1&auto=format&fit=crop&w=1074&q=80"
},
{
id: 2,
restaurantName: "Azijska kuhinja Sakura",
date: "22. april 2023",
rating: 5,
text: "Najboljši suši v mestu! Svež in odlično pripravljen. Strežno osebje je zelo pozorno in hitro. Definitivno se bom še vrnil.",
image: "https://images.unsplash.com/photo-1555396273-367ea4eb4db5?ixlib=rb-1.2.1&auto=format&fit=crop&w=1074&q=80"
}
];
const renderStars = (rating: number) => {
const stars = [];
const fullStars = Math.floor(rating);
const hasHalfStar = rating % 1 >= 0.5;
for (let i = 0; i < fullStars; i++) {
stars.push(<span key={`full-${i}`} className="material-icons-outlined text-black text-sm">star</span>);
}
if (hasHalfStar) {
stars.push(<span key="half" className="material-icons-outlined text-black text-sm">star_half</span>);
}
const remainingStars = 5 - fullStars - (hasHalfStar ? 1 : 0);
for (let i = 0; i < remainingStars; i++) {
stars.push(<span key={`empty-${i}`} className="material-icons-outlined text-black opacity-30 text-sm">star</span>);
}
return stars;
};
if (reviews.length === 0) {
return (
<div className="px-5 py-8 text-center">
<span className="material-icons-outlined text-gray-400 text-5xl mb-2">rate_review</span>
<p className="text-gray-600 mb-4">Nimate še mnenj</p>
<button className="py-2 px-4 bg-black text-white rounded-lg text-sm">
Odkrijte restavracije
</button>
</div>
);
}
return (
<div className="px-5 py-4">
<div className="space-y-4">
{reviews.map(review => (
<div key={review.id} className="bg-white p-4 rounded-xl card-shadow">
<div className="flex items-start mb-3">
<div className="w-12 h-12 mr-3">
<img
src={review.image}
alt={`Restavracija ${review.restaurantName}`}
className="w-full h-full object-cover rounded-full"
loading="lazy"
/>
</div>
<div className="flex-1">
<h3 className="font-semibold text-black">{review.restaurantName}</h3>
<div className="flex items-center text-xs text-black mt-1">
<span className="flex">{renderStars(review.rating)}</span>
<span className="ml-2 opacity-70">{review.date}</span>
</div>
</div>
<button className="p-1 text-black">
<span className="material-icons-outlined text-sm">more_vert</span>
</button>
</div>
<p className="text-sm text-black">{review.text}</p>
<div className="mt-3 pt-2 border-t border-gray-100 flex justify-end">
<button className="text-xs text-blue-600 ml-auto">Uredi</button>
<button className="text-xs text-red-600 ml-3">Izbriši</button>
</div>
</div>
))}
</div>
</div>
);
};
export default UserReviews;

View File

@ -43,8 +43,7 @@ const HomePage: React.FC = () => {
} else if (itemId === 'search') { } else if (itemId === 'search') {
navigateTo('search'); navigateTo('search');
} else if (itemId === 'profile') { } else if (itemId === 'profile') {
// Implementacija navigacije na profil navigateTo('profile');
alert('Stran za profil še ni implementirana.');
} }
}; };

107
src/pages/ProfilePage.tsx Normal file
View File

@ -0,0 +1,107 @@
import React, { useState, useContext } from 'react';
import { NavigationContext } from '../App';
import ProfileNavBar from '../components/ProfileNavBar';
import ProfileHeader from '../components/ProfileHeader';
import ProfileTabs from '../components/ProfileTabs';
import FavoriteRestaurants from '../components/FavoriteRestaurants';
import UserReservations from '../components/UserReservations';
import UserReviews from '../components/UserReviews';
import Footer from '../components/Footer';
const ProfilePage = () => {
const [activeTab, setActiveTab] = useState('favorites' as 'favorites' | 'reservations' | 'reviews');
const { navigateTo } = useContext(NavigationContext);
const handleTabChange = (tab: 'favorites' | 'reservations' | 'reviews') => {
setActiveTab(tab);
};
const handleNavItemClick = (itemId: string) => {
if (itemId === 'home') {
navigateTo('home');
} else if (itemId === 'search') {
navigateTo('search');
} else if (itemId === 'reservations') {
navigateTo('reservations');
} else if (itemId === 'profile') {
// Že smo na profilu, ne naredi nič
}
};
const handleSettingsClick = () => {
console.log('Nastavitve profila');
// Implementacija odpiranja nastavitev
};
const handleHelpClick = () => {
console.log('Pomoč za profil');
// Implementacija odpiranja pomoči
};
const handleEditProfileClick = () => {
console.log('Urejanje profila');
// Implementacija urejanja profila
};
const handleRestaurantClick = (id: number) => {
navigateTo('detail', id);
};
const handleReservationClick = (id: number) => {
navigateTo('reservation', id);
};
return (
<div className="h-full gradient-bg relative">
{/* Skip to content link za dostopnost */}
<a href="#profile-content" className="sr-only focus:not-sr-only focus:absolute focus:bg-white focus:text-black focus:p-2 focus:z-50">
Preskoči na vsebino
</a>
<ProfileNavBar
onSettingsClick={handleSettingsClick}
onHelpClick={handleHelpClick}
/>
{/* Vsebina začne tukaj - main content z dodatnim padding-bottom za sticky footer */}
<div className="content-container overflow-y-auto hide-scrollbar h-full has-sticky-footer">
<main id="profile-content">
<ProfileHeader
userName="Janez Novak"
userEmail="janez.novak@email.com"
userImageUrl="https://images.unsplash.com/photo-1500648767791-00dcc994a43e?ixlib=rb-1.2.1&auto=format&fit=crop&w=400&q=80"
reservationsCount={12}
favoritesCount={8}
onEditProfileClick={handleEditProfileClick}
/>
<ProfileTabs
activeTab={activeTab}
onTabChange={handleTabChange}
/>
{activeTab === 'favorites' && (
<FavoriteRestaurants
onRestaurantClick={handleRestaurantClick}
onReservationClick={handleReservationClick}
/>
)}
{activeTab === 'reservations' && (
<UserReservations
onDetailsClick={handleRestaurantClick}
/>
)}
{activeTab === 'reviews' && (
<UserReviews />
)}
</main>
</div>
<Footer activeItem="profile" onNavItemClick={handleNavItemClick} />
</div>
);
};
export default ProfilePage;

View File

@ -59,9 +59,9 @@ const ReservationsHistoryPage: React.FC = () => {
if (itemId === 'home') { if (itemId === 'home') {
navigateTo('home'); navigateTo('home');
} else if (itemId === 'search') { } else if (itemId === 'search') {
// Implementacija navigacije na iskanje navigateTo('search');
} else if (itemId === 'profile') { } else if (itemId === 'profile') {
// Implementacija navigacije na profil navigateTo('profile');
} }
// Za 'reservations' smo že na tej strani // Za 'reservations' smo že na tej strani
}; };

Some files were not shown because too many files have changed in this diff Show More