diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..6cc387d
Binary files /dev/null and b/.DS_Store differ
diff --git a/README.md b/README.md
index 39691fc..84f59ad 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,109 @@
-Add a readme for your dashboard here. Include content overview, data citations, and any relevant technical details.
\ No newline at end of file
+# **Philadelphia Itinerary Builder Dashboard**
+Created by Lu Yii Wong
+
+Fall 2025
+
+This project expands on **Assignment 1’s Philadelphia Story Map**, transforming it into an interactive tool that helps visitors design a custom itinerary based on their interests, time, and budget. Users can filter destinations across Philadelphia and instantly see tailored recommendations on both the map and sidebar.
+
+---
+
+## **Overview**
+
+The dashboard allows users to:
+
+* Select themes of interest (history, food, recreation, museums, etc.)
+* Add more specific tags such as architecture, waterfront, or university
+* Set a time budget (half day or full day)
+* Choose a maximum spending amount
+* View a dynamically updated itinerary with estimated total time and cost
+
+Compared to the original story map, this version:
+
+* Includes **more locations** across Philadelphia
+* Provides **more extensive detail** for each stop
+* Covers **additional neighborhoods** beyond the initial assignment
+* Gives users **control over how their itinerary is structured**
+
+---
+## **Technical Details**
+### **Key Functional Components**
+
+#### **1. Event Handling**
+
+Event listeners are used for:
+
+* Theme selection
+* Budget slider
+* Time-availability dropdown
+* Map interactions (optional)
+
+#### **2. Data Filtering**
+
+A custom filtering pipeline:
+
+* Reads all themes of each location
+* Applies budget and time constraints
+* Returns only the stops that meet user criteria
+* Updates the map layer and sidebar
+
+#### **3. Data Structure**
+
+Stored in:
+
+```
+data/itinerary_stops.geojson
+```
+
+Each feature contains:
+
+```json
+{
+ "type": "Feature",
+ "properties": {
+ "id": "example_id",
+ "name": "Example Location",
+ "address": "123 Example St",
+ "themes": ["history", "architecture"],
+ "est_duration_min": 60,
+ "est_cost": 10,
+ "description": "Description of the location.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.0000, 39.9500]
+ }
+}
+```
+
+---
+
+## **Data Sources & Citations**
+
+**Basemap Tiles:**
+CARTO Light Basemap
+Attribution: © OpenStreetMap contributors • © CARTO
+
+**Location Information:**
+All destination details (names, addresses, descriptions) were compiled manually using publicly available information from:
+
+* Visit Philadelphia
+* Google Maps
+* Official websites of museums and attractions
+
+Estimated visit durations and costs were created manually for demostration purposes.
+
+---
+
+## **File Structure**
+
+```
+/
+├── index.html
+├── css/
+│ └── styles.css
+├── js/
+│ └── main.js
+└── data/
+ └── itinerary_stops.geojson
+```
diff --git a/css/styles.css b/css/styles.css
new file mode 100644
index 0000000..cd4a959
--- /dev/null
+++ b/css/styles.css
@@ -0,0 +1,266 @@
+html {
+ font-size: 18px;
+ font-family: system-ui, sans-serif;
+ height: 100%;
+}
+
+body {
+ margin: 0;
+ padding: 0;
+ height: 100%;
+}
+
+/* MAIN LAYOUT */
+main {
+ display: flex;
+ flex-direction: column;
+}
+
+.app-header {
+ width: 100%;
+ background-color: #f5f5f5;
+ padding: 1rem 1.5rem;
+ border-bottom: 1px solid #ddd;
+}
+
+.app-header h1 {
+ margin: 0;
+ font-size: 1.8rem;
+ font-weight: 700;
+ text-align: left;
+}
+
+/* Map Section */
+.map-section {
+ position: relative;
+ width: 100%;
+ height: 50vh;
+ background-color: #ddd;
+
+ display: flex;
+ flex-direction: column;
+}
+
+/*
+.map-search-controls {
+ position: flex;
+ box-sizing: border-box;
+ margin: 0;
+ border: none;
+ padding: 0.5rem;
+ width: 100%;
+ gap: 0.5rem;
+ justify-content: space-between;
+ background-color: #fff;
+ z-index: 1;
+}
+
+.map-search-controls input,
+.map-search-controls select {
+ box-sizing: border-box;
+ border: 1px solid gray;
+ border-radius: 4px;
+ font-size: 0.9rem;
+ font-family: system-ui, sans-serif;
+ padding: 0.25rem 0.5rem;
+}
+*/
+
+.map {
+ position: relative;
+ flex: 1;
+ width: 100%;
+ height: auto;
+}
+
+/* Right side (itinerary panel) */
+.itinerary-section {
+ padding: 0.5rem;
+}
+
+.itinerary-controls {
+ border: 0;
+ padding: 0.5rem;
+ display: flex;
+ flex-direction: column;
+ gap: 0.5rem;
+}
+
+.itinerary-controls legend {
+ font-size: 1.4rem;
+ font-weight: bold;
+ margin-bottom: 0.5rem;
+ display: block;
+}
+
+.theme-filters {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+
+.main-theme-group {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+}
+
+.secondary-theme-group {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+ font-size: 0.9rem;
+}
+
+/* Base pill style */
+.theme-pill {
+ --theme-color: #555;
+ display: inline-flex;
+ align-items: center;
+ cursor: pointer;
+ border: none;
+}
+
+/* Visually hide the native checkbox but keep it accessible */
+.theme-pill input[type="checkbox"] {
+ position: absolute;
+ opacity: 0;
+ width: 1px;
+ height: 1px;
+ overflow: hidden;
+}
+
+/* The visible pill */
+.theme-pill span {
+ display: inline-block;
+ padding: 0.25rem 0.75rem;
+ border-radius: 999px;
+ border: 1px solid rgb(0 0 0 / 8%);
+ background-color: rgb(0 0 0 / 2%);
+ font-size: 0.85rem;
+ color: var(--theme-color);
+ transition: background-color 0.15s ease, color 0.15s ease, transform 0.1s ease;
+}
+
+/* Hover state */
+.theme-pill:hover span {
+ background-color: rgb(0 0 0 / 5%);
+}
+
+/* Checked state: filled pill */
+.theme-pill input[type="checkbox"]:checked + span {
+ background-color: var(--theme-color);
+ color: #fff;
+ border-color: var(--theme-color);
+ transform: translateY(-1px);
+}
+
+/* Theme-specific colors (match your marker colors) */
+.theme-history {
+ --theme-color: #1f77b4;
+}
+
+.theme-food {
+ --theme-color: #ff7f0e;
+}
+
+.theme-recreation {
+ --theme-color: #2ca02c;
+}
+
+.theme-museum {
+ --theme-color: #8c564b;
+}
+
+.price-filters {
+ margin-top: 0.25rem;
+}
+
+.time-filter {
+ display: flex;
+ flex-direction: column;
+ gap: 0.25rem;
+ margin: 0.5rem 0 0.75rem;
+}
+
+.filter-label {
+ font-weight: 600;
+ font-size: 0.9rem;
+ color: #333;
+}
+
+.time-filter select {
+ padding: 0.35rem 0.5rem;
+ font-size: 0.9rem;
+ border-radius: 6px;
+ border: 1px solid #aaa;
+ background-color: #fefefe;
+ cursor: pointer;
+}
+
+/* Stop list styling */
+.stop-list {
+ list-style-type: none;
+ padding: 0;
+ margin: 0.5rem 0 0;
+}
+
+.stop-list .stop {
+ display: grid;
+ grid-template-areas:
+ "name cost"
+ "theme duration"
+ "description description";
+ grid-template-columns: 2fr 1fr;
+ gap: 0.25rem 0.5rem;
+
+ padding: 0.5rem;
+ border-top: 1px solid #ccc;
+}
+
+.stop .name {
+ grid-area: name;
+ font-weight: bold;
+}
+
+.stop .cost {
+ grid-area: cost;
+ justify-self: end;
+ font-size: 0.9em;
+}
+
+.stop .theme {
+ grid-area: theme;
+ font-size: 0.85em;
+ font-style: italic;
+}
+
+.stop .duration {
+ grid-area: duration;
+ justify-self: end;
+ font-size: 0.85em;
+}
+
+.stop .description {
+ grid-area: description;
+ font-size: 0.9em;
+}
+
+/* ===== DESKTOP / WIDE LAYOUT ===== */
+@media (width >= 768px) {
+ main {
+ flex-direction: row; /* map on the left, panel on the right */
+ }
+
+ .map-section {
+ flex: 2;
+ height: 100vh;
+ }
+
+ .itinerary-section {
+ flex: 1;
+ max-height: 100vh;
+ overflow-y: auto;
+ border-left: 1px solid #ddd;
+ }
+}
\ No newline at end of file
diff --git a/data/itinerary_stops.geojson b/data/itinerary_stops.geojson
new file mode 100644
index 0000000..b180a20
--- /dev/null
+++ b/data/itinerary_stops.geojson
@@ -0,0 +1,617 @@
+{
+ "type": "FeatureCollection",
+ "features": [
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "30th_street_station",
+ "name": "30th Street Station",
+ "address": "2955 Market St, Philadelphia, PA 19104",
+ "themes": ["history", "architecture", "transport"],
+ "est_duration_min": 15,
+ "est_cost": 0,
+ "description": "Historic Beaux-Arts train station and a common arrival point into Philadelphia. A good place to start your day and get oriented.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.18197248236983, 39.95588260052245]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "schuylkill_banks",
+ "name": "Schuylkill Banks",
+ "address": "2501 Walnut St, Philadelphia, PA 19103",
+ "themes": ["recreation", "nature"],
+ "est_duration_min": 45,
+ "est_cost": 0,
+ "description": "Scenic waterfront trail along the Schuylkill River, perfect for a relaxed stroll and skyline views.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.17943300253746, 39.9550899034558]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "garden_restaurant_barnes",
+ "name": "The Garden Restaurant Café at the Barnes Foundation",
+ "address": "2025 Benjamin Franklin Pkwy, Philadelphia, PA 19130",
+ "themes": ["food", "architecture", "museum"],
+ "est_duration_min": 90,
+ "est_cost": 25,
+ "description": "A calm café inside the Barnes Foundation complex, ideal for a sit-down brunch or coffee break along the Parkway.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.17258503378102, 39.96104749270321]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "rocky_statue",
+ "name": "The Rocky Statue",
+ "address": "2600 Benjamin Franklin Pkwy, Philadelphia, PA 19130",
+ "themes": ["recreation", "architecture", "iconic"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "Classic photo-op at the base of the Philadelphia Museum of Art steps, made famous by the Rocky films.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.17929096147519, 39.96515137985975]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "reading_terminal_market",
+ "name": "Reading Terminal Market",
+ "address": "1136 Arch St, Philadelphia, PA 19107",
+ "themes": ["food", "history", "architecture", "iconic"],
+ "est_duration_min": 60,
+ "est_cost": 15,
+ "description": "Historic indoor market packed with local vendors, perfect for lunch and sampling Philly favorites.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.15910376445923, 39.953323787806035]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "city_hall",
+ "name": "City Hall",
+ "address": "1400 John F Kennedy Blvd, Philadelphia, PA 19107",
+ "themes": ["history", "architecture", "iconic"],
+ "est_duration_min": 45,
+ "est_cost": 0,
+ "description": "Imposing masonry City Hall at the center of Philadelphia, with ornate architecture and views of the surrounding downtown.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.16361185014377, 39.952931444096926]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "love_park",
+ "name": "LOVE Park",
+ "address": "1501 John F Kennedy Blvd, Philadelphia, PA 19102",
+ "themes": ["recreation", "iconic"],
+ "est_duration_min": 20,
+ "est_cost": 0,
+ "description": "Small urban park best known for the iconic LOVE sculpture—good for a quick photo stop between sights.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.16554304059103, 39.954428273570635]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "chinatown",
+ "name": "Chinatown",
+ "address": "Arch St & N 10th St, Philadelphia, PA 19107",
+ "themes": ["food", "history", "iconic"],
+ "est_duration_min": 45,
+ "est_cost": 15,
+ "description": "Lively neighborhood with restaurants, bakeries, and shops—great for snacks, bubble tea, or an early dinner.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.15619196262854, 39.95392218369031]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "elfreths_alley",
+ "name": "Elfreth's Alley",
+ "address": "126 Elfreth's Alley, Philadelphia, PA 19106",
+ "themes": ["history", "iconic"],
+ "est_duration_min": 60,
+ "est_cost": 0,
+ "description": "One of the oldest continuously inhabited residential streets in the U.S., with cobblestones and historic rowhouses.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.14243373563225, 39.952923411022056]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "philly_cheesesteak_old_city",
+ "name": "Philly Cheesesteak (Old City)",
+ "address": "206 Market St, Philadelphia, PA 19106",
+ "themes": ["food", "iconic"],
+ "est_duration_min": 45,
+ "est_cost": 15,
+ "description": "Old City spots to try an iconic Philly cheesesteak after a day of sightseeing.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.14417180709368, 39.949814506324344]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "betsy_ross_house",
+ "name": "Betsy Ross House",
+ "address": "239 Arch St, Philadelphia, PA 19106",
+ "themes": ["history", "architecture", "museum"],
+ "est_duration_min": 45,
+ "est_cost": 12,
+ "description": "Historic house museum dedicated to Betsy Ross, with a small courtyard and exhibits about early American history.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.14453408290949, 39.95244053699293]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "independence_hall",
+ "name": "Independence Hall",
+ "address": "520 Chestnut St, Philadelphia, PA 19106",
+ "themes": ["history", "architecture", "iconic"],
+ "est_duration_min": 60,
+ "est_cost": 0,
+ "description": "UNESCO World Heritage Site where the Declaration of Independence and the U.S. Constitution were debated and adopted.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.15004562895713, 39.94917669629378]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "liberty_bell",
+ "name": "Liberty Bell",
+ "address": "526 Market St, Philadelphia, PA 19106",
+ "themes": ["history", "iconic"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "Iconic symbol of American independence housed in the Liberty Bell Center, just across from Independence Hall.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.15028189745958, 39.94966351596981]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "philadelphia_museum_of_art",
+ "name": "Philadelphia Museum of Art",
+ "address": "2600 Benjamin Franklin Pkwy, Philadelphia, PA 19130",
+ "themes": ["museum", "architecture", "iconic"],
+ "est_duration_min": 90,
+ "est_cost": 25,
+ "description": "One of the largest art museums in the U.S., with an extensive collection and iconic views over the Benjamin Franklin Parkway.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.18099, 39.9656]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "barnes_foundation_museum",
+ "name": "Barnes Foundation",
+ "address": "2025 Benjamin Franklin Pkwy, Philadelphia, PA 19130",
+ "themes": ["museum", "art", "architecture"],
+ "est_duration_min": 90,
+ "est_cost": 30,
+ "description": "World-renowned collection of Impressionist and modern art in a contemporary building along the Benjamin Franklin Parkway.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1728, 39.9611]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "franklin_institute",
+ "name": "The Franklin Institute",
+ "address": "222 N 20th St, Philadelphia, PA 19103",
+ "themes": ["museum", "science", "family"],
+ "est_duration_min": 90,
+ "est_cost": 30,
+ "description": "Interactive science museum featuring hands-on exhibits, a planetarium, and the famous Giant Heart.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1735, 39.9584]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "rodin_museum",
+ "name": "Rodin Museum",
+ "address": "2151 Benjamin Franklin Pkwy, Philadelphia, PA 19130",
+ "themes": ["museum", "art", "architecture"],
+ "est_duration_min": 45,
+ "est_cost": 15,
+ "description": "Intimate museum and garden with one of the largest collections of Auguste Rodin’s sculptures outside of Paris.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1743, 39.9618]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "african_american_museum_philadelphia",
+ "name": "African American Museum in Philadelphia",
+ "address": "701 Arch St, Philadelphia, PA 19106",
+ "themes": ["museum", "history"],
+ "est_duration_min": 60,
+ "est_cost": 20,
+ "description": "Museum dedicated to interpreting and preserving the history and culture of African Americans, with a focus on Philadelphia and the region.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1528, 39.9525]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "rittenhouse_square",
+ "name": "Rittenhouse Square",
+ "address": "Rittenhouse Square, Philadelphia, PA 19103",
+ "themes": ["recreation", "nature", "iconic"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "Lively park ringed by cafés, restaurants, and shops, ideal for people-watching or a quick break during the day.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1703, 39.9495]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "washington_square",
+ "name": "Washington Square",
+ "address": "210 W Washington Square, Philadelphia, PA 19106",
+ "themes": ["recreation", "history", "nature"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "Historic square with shaded paths and the Tomb of the Unknown Revolutionary War Soldier, a quieter green space near Independence Hall.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1522, 39.9479]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "race_street_pier",
+ "name": "Race Street Pier",
+ "address": "Race St & N Christopher Columbus Blvd, Philadelphia, PA 19123",
+ "themes": ["recreation", "nature", "waterfront"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "Tiered waterfront park beneath the Ben Franklin Bridge with great views of the river and Camden skyline.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1383, 39.9552]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "cherry_street_pier",
+ "name": "Cherry Street Pier",
+ "address": "121 N Christopher Columbus Blvd, Philadelphia, PA 19106",
+ "themes": ["recreation", "art", "waterfront"],
+ "est_duration_min": 45,
+ "est_cost": 0,
+ "description": "Converted historic pier with art installations, events, and riverfront views, often paired with Race Street Pier next door.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1391, 39.9537]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "italian_market",
+ "name": "South 9th Street Italian Market",
+ "address": "9th St & Christian St, Philadelphia, PA 19147",
+ "themes": ["food", "history", "market"],
+ "est_duration_min": 60,
+ "est_cost": 20,
+ "description": "Historic open-air market with produce stands, specialty shops, and casual eateries reflecting Italian and Latinx communities.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1597, 39.9394]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "spruce_street_harbor_park",
+ "name": "Spruce Street Harbor Park",
+ "address": "301 S Christopher Columbus Blvd, Philadelphia, PA 19106",
+ "themes": ["recreation", "waterfront", "food"],
+ "est_duration_min": 45,
+ "est_cost": 10,
+ "description": "Seasonal waterfront park with hammocks, floating gardens, lights, and food vendors — a relaxing place by the river.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1422, 39.9449]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "penns_landing",
+ "name": "Penn's Landing",
+ "address": "101 S Christopher Columbus Blvd, Philadelphia, PA 19106",
+ "themes": ["recreation", "waterfront"],
+ "est_duration_min": 40,
+ "est_cost": 0,
+ "description": "Historic waterfront area hosting events, river views, and seasonal attractions like ice skating or outdoor concerts.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1419, 39.9491]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "mutter_museum",
+ "name": "Mütter Museum",
+ "address": "19 S 22nd St, Philadelphia, PA 19103",
+ "themes": ["museum", "history"],
+ "est_duration_min": 60,
+ "est_cost": 20,
+ "description": "A medical history museum featuring anatomical specimens, medical equipment, and exhibitions on health and science.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1753, 39.9532]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "eastern_state_penitentiary",
+ "name": "Eastern State Penitentiary",
+ "address": "2027 Fairmount Ave, Philadelphia, PA 19130",
+ "themes": ["history", "architecture", "museum"],
+ "est_duration_min": 75,
+ "est_cost": 21,
+ "description": "Historic prison known for its revolutionary design and audio tours led by Steve Buscemi. One of Philly's most popular attractions.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1720, 39.9681]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "fairmount_water_works",
+ "name": "Fairmount Water Works",
+ "address": "640 Waterworks Dr, Philadelphia, PA 19130",
+ "themes": ["history", "architecture", "waterfront"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "Historic 19th-century pumping station with riverfront views; a scenic stop behind the Art Museum.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1801, 39.9660]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "independence_seaport_museum",
+ "name": "Independence Seaport Museum",
+ "address": "211 S Christopher Columbus Blvd, Philadelphia, PA 19106",
+ "themes": ["museum", "history", "waterfront"],
+ "est_duration_min": 75,
+ "est_cost": 20,
+ "description": "Maritime museum featuring historic ships, exhibits on river history, and pier access along the waterfront.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1427, 39.9461]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "upenn_campus",
+ "name": "University of Pennsylvania Campus",
+ "address": "34th & Walnut St, Philadelphia, PA 19104",
+ "themes": ["university"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "An Ivy League campus with historic and modern architecture, tree-lined walkways, and public art installations.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1926, 39.9522]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "drexel_campus",
+ "name": "Drexel University",
+ "address": "3141 Chestnut St, Philadelphia, PA 19104",
+ "themes": ["university"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "Urban university campus adjacent to UPenn, with modern academic buildings and student-centered open spaces.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1890, 39.9566]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "temple_university_center_city",
+ "name": "Temple University Center City (TUCC)",
+ "address": "1515 Market St, Philadelphia, PA 19102",
+ "themes": ["university"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "Temple University's Center City campus offering graduate programs and continuing education in a convenient downtown location near City Hall. Great stop for prospective students exploring urban academic environments.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.16582, 39.95373]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "jefferson_university",
+ "name": "Thomas Jefferson University (Center City Campus)",
+ "address": "1020 Walnut St, Philadelphia, PA 19107",
+ "themes": ["university"],
+ "est_duration_min": 30,
+ "est_cost": 0,
+ "description": "Jefferson’s Center City campus is home to one of Philadelphia’s leading medical and health sciences universities. The area includes academic buildings, research facilities, and green courtyards woven into the heart of downtown—ideal for visitors exploring healthcare or biomedical programs.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.1582, 39.9489]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "philadelphias_magic_gardens",
+ "name": "Philadelphia's Magic Gardens",
+ "address": "1020 South St, Philadelphia, PA 19147",
+ "themes": ["museum", "art", "iconic"],
+ "est_duration_min": 60,
+ "est_cost": 15,
+ "description": "Immersive mosaic art environment by Isaiah Zagar, with indoor galleries and outdoor labyrinthine courtyards—one of Philly's most unique visual art experiences on South Street.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.159296, 39.942859]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "fairmount_park",
+ "name": "Fairmount Park",
+ "address": "Fairmount Park, Philadelphia, PA 19131",
+ "themes": ["recreation", "nature", "waterfront"],
+ "est_duration_min": 60,
+ "est_cost": 0,
+ "description": "Expansive urban parkland along the Schuylkill River with trails, overlooks, and historic sites—great for a walk, bike ride, or a break from the city streets.",
+ "must_see": false
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.2099022, 39.983446]
+ }
+ },
+ {
+ "type": "Feature",
+ "properties": {
+ "id": "shofuso_japanese_cultural_center",
+ "name": "Shofuso Japanese Cultural Center",
+ "address": "Lansdowne Dr & Horticultural Dr, Philadelphia, PA 19131",
+ "themes": ["museum", "nature", "culture"],
+ "est_duration_min": 60,
+ "est_cost": 15,
+ "description": "Traditional Japanese house and garden in West Fairmount Park with koi pond, cherry trees, and serene spaces—ideal for a quieter cultural stop outside Center City.",
+ "must_see": true
+ },
+ "geometry": {
+ "type": "Point",
+ "coordinates": [-75.2128, 39.9814]
+ }
+ }
+ ]
+}
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..64072c8
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,22 @@
+import js from "@eslint/js";
+import globals from "globals";
+import { defineConfig } from "eslint/config";
+
+export default defineConfig([
+ js.configs.recommended,
+ {
+ files: ["js/**/*.js"],
+ languageOptions: {
+ ecmaVersion: 2022,
+ sourceType: "script",
+ globals: {
+ ...globals.browser,
+ L: "readonly",
+ }
+ },
+ rules: {
+ "no-unused-vars": "warn",
+ "no-undef": "error"
+ }
+ }
+]);
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..4b351f5
--- /dev/null
+++ b/index.html
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+ Design Your Custom Philadelphia Itinerary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/js/main.js b/js/main.js
new file mode 100644
index 0000000..38c2a73
--- /dev/null
+++ b/js/main.js
@@ -0,0 +1,205 @@
+// js/main.js
+
+let map;
+let stopsLayer;
+let allStops = []; // will hold all features (GeoJSON features)
+
+// Entry point
+document.addEventListener("DOMContentLoaded", () => {
+ initMap();
+ loadStopsData();
+ setupFilters();
+});
+
+function initMap() {
+ // Center roughly on Philadelphia
+ map = L.map('map').setView([39.9526, -75.1652], 13);
+
+ // Add basemap
+ L.tileLayer(
+ "https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png",
+ {
+ attribution:
+ '© OpenStreetMap contributors © CARTO',
+ subdomains: "abcd",
+ maxZoom: 19
+ }
+ ).addTo(map);
+
+
+ // GeoJSON layer for stops
+ stopsLayer = L.geoJSON(null, {
+ pointToLayer: (feature, latlng) => {
+ const themes = feature.properties.themes || [];
+ const primaryTheme = themes[0] || "other"; // pick first tag for color
+
+ const marker = L.circleMarker(latlng, {
+ radius: 6,
+ weight: 1,
+ color: themeColor(primaryTheme),
+ fillColor: themeColor(primaryTheme),
+ fillOpacity: 0.8
+ });
+ return marker;
+ },
+ onEachFeature: (feature, layer) => {
+ const p = feature.properties;
+ const themes = p.themes || [];
+
+ layer.bindPopup(`
+ ${p.name}
+ Themes: ${themes.join(", ")}
+ Est. duration: ${p.est_duration_min} min
+ Est. cost: $${p.est_cost}
+ ${p.description}
+ `);
+ }
+ }).addTo(map);
+}
+
+function themeColor(theme) {
+ switch (theme) {
+ case "history": return "#1f77b4";
+ case "food": return "#ff7f0e";
+ case "recreation": return "#2ca02c";
+ case "museum": return "#8c564b";
+ case "university": return "#17becf";
+ default: return "#555";
+ }
+}
+
+function loadStopsData() {
+ fetch("data/itinerary_stops.geojson")
+ .then(response => response.json())
+ .then(geojson => {
+ allStops = geojson.features;
+
+ // Add all to map initially
+ stopsLayer.addData(geojson);
+
+ // Populate the HTML list
+ renderStopList(allStops);
+
+ // Fit map to points
+ const bounds = stopsLayer.getBounds();
+ if (bounds.isValid()) {
+ map.fitBounds(bounds, { padding: [20, 20] });
+ }
+ })
+ .catch(err => {
+ console.error("Error loading GeoJSON", err);
+ });
+}
+function setupFilters() {
+ const themeCheckboxes = document.querySelectorAll('input[name="theme"]');
+ const maxPriceInput = document.querySelector('input[name="max-price"]');
+ const maxPriceLabel = document.getElementById("max-price-label");
+ const timeSelect = document.querySelector('select[name="time-available"]');
+
+ // Update label on range drag
+ maxPriceInput.addEventListener("input", () => {
+ maxPriceLabel.textContent = maxPriceInput.value;
+ applyFilters();
+ });
+
+ // Re-filter on theme/time change
+ themeCheckboxes.forEach(cb => {
+ cb.addEventListener("change", applyFilters);
+ });
+
+ timeSelect.addEventListener("change", applyFilters);
+}
+
+function applyFilters() {
+ // Get selected themes
+ const selectedThemes = Array.from(
+ document.querySelectorAll('input[name="theme"]:checked')
+ ).map(cb => cb.value);
+
+ // Get budget + time
+ const maxPrice = Number(document.querySelector('input[name="max-price"]').value);
+ const timeAvailable = document.querySelector('select[name="time-available"]').value;
+
+ // Rough total time constraint (in minutes)
+ const timeLimit = timeAvailable === "half" ? 240 : 480;
+
+ // Filter stops
+ const filtered = [];
+ let totalDuration = 0;
+ let totalCost = 0;
+
+ for (const feature of allStops) {
+ const p = feature.properties;
+
+ const themes = p.themes || [];
+ const matchesTheme = themes.some(t => selectedThemes.includes(t));
+ const withinBudget = (totalCost + p.est_cost) <= maxPrice;
+ const withinTime = (totalDuration + p.est_duration_min) <= timeLimit;
+
+ if (matchesTheme && withinBudget && withinTime) {
+ filtered.push(feature);
+ totalDuration += p.est_duration_min;
+ totalCost += p.est_cost;
+ }
+ }
+
+ // Update map
+ stopsLayer.clearLayers();
+ stopsLayer.addData({
+ type: "FeatureCollection",
+ features: filtered
+ });
+
+ // Update list + summary
+ renderStopList(filtered);
+ updateSummary(filtered, totalDuration, totalCost);
+}
+
+function renderStopList(features) {
+ const listEl = document.querySelector(".stop-list");
+ listEl.innerHTML = "";
+
+ features.forEach(f => {
+ const p = f.properties;
+ const li = document.createElement("li");
+ li.className = "stop";
+
+ // const themes = p.themes || [];
+
+ li.innerHTML = `
+
+ $${p.est_cost}
+ ${p.themes.join(", ")}
+ ${p.est_duration_min} min
+ ${p.description}
+ `;
+
+ // Optional: clicking in list pans map to that stop
+ li.addEventListener("click", () => {
+ const [lng, lat] = f.geometry.coordinates;
+ map.setView([lat, lng], 16);
+ });
+
+ listEl.appendChild(li);
+ });
+
+ if (features.length === 0) {
+ listEl.innerHTML = `No stops match your filters yet.`;
+ }
+}
+
+function updateSummary(features, totalDuration, totalCost) {
+ const summaryEl = document.getElementById("summary-text");
+
+ if (!features.length) {
+ summaryEl.textContent = "No stops selected yet. Try relaxing your filters.";
+ return;
+ }
+
+ const hours = (totalDuration / 60).toFixed(1);
+
+ summaryEl.textContent =
+ `You have ${features.length} stops selected, ` +
+ `for about ${hours} hours of activities ` +
+ `and an estimated total cost of $${totalCost}.`;
+}
diff --git a/js/map.js b/js/map.js
new file mode 100644
index 0000000..e69de29
diff --git a/package-lock.json b/package-lock.json
index 1d7be08..f6cb2b8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,9 +9,11 @@
"version": "1.0.0",
"license": "ISC",
"devDependencies": {
- "eslint": "^8.48.0",
+ "@eslint/js": "^9.39.1",
+ "eslint": "^9.39.1",
"eslint-config-google": "^0.14.0",
- "stylelint": "^15.10.3",
+ "globals": "^16.5.0",
+ "stylelint": "^15.11.0",
"stylelint-config-standard": "^34.0.0"
}
},
@@ -289,73 +291,184 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "eslint-visitor-keys": "^3.3.0"
+ "eslint-visitor-keys": "^3.4.3"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
},
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
"peerDependencies": {
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
"node_modules/@eslint-community/regexpp": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.0.tgz",
- "integrity": "sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
+ "node_modules/@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
"node_modules/@eslint/eslintrc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
- "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
+ "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
+ "js-yaml": "^4.1.1",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@eslint/js": {
- "version": "8.50.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz",
- "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==",
+ "version": "9.39.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz",
+ "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
}
},
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.11.11",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
- "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@humanwhocodes/object-schema": "^1.2.1",
- "debug": "^4.1.1",
- "minimatch": "^3.0.5"
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
},
"engines": {
- "node": ">=10.10.0"
+ "node": ">=18.18.0"
}
},
"node_modules/@humanwhocodes/module-importer": {
@@ -371,11 +484,19 @@
"url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
@@ -412,6 +533,20 @@
"node": ">= 8"
}
},
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/minimist": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz",
@@ -425,10 +560,11 @@
"dev": true
},
"node_modules/acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
+ "license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@@ -441,6 +577,7 @@
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
@@ -450,6 +587,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@@ -670,10 +808,11 @@
}
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -684,12 +823,13 @@
}
},
"node_modules/css-functions-list": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.0.tgz",
- "integrity": "sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
+ "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=12.22"
+ "node": ">=12 || >=16"
}
},
"node_modules/css-tree": {
@@ -798,18 +938,6 @@
"node": ">=8"
}
},
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -838,57 +966,63 @@
}
},
"node_modules/eslint": {
- "version": "8.50.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz",
- "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==",
+ "version": "9.39.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
+ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.2",
- "@eslint/js": "8.50.0",
- "@humanwhocodes/config-array": "^0.11.11",
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.1",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
+ "cross-spawn": "^7.0.6",
"debug": "^4.3.2",
- "doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
+ "file-entry-cache": "^8.0.0",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
"ignore": "^5.2.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
+ "optionator": "^0.9.3"
},
"bin": {
"eslint": "bin/eslint.js"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
}
},
"node_modules/eslint-config-google": {
@@ -904,45 +1038,75 @@
}
},
"node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/eslint/node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "acorn": "^8.9.0",
+ "acorn": "^8.15.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
@@ -965,6 +1129,7 @@
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"estraverse": "^5.2.0"
},
@@ -986,6 +1151,7 @@
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
+ "license": "BSD-2-Clause",
"engines": {
"node": ">=0.10.0"
}
@@ -1028,7 +1194,8 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/fast-levenshtein": {
"version": "2.0.6",
@@ -1055,15 +1222,16 @@
}
},
"node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz",
+ "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "flat-cache": "^3.0.4"
+ "flat-cache": "^3.2.0"
},
"engines": {
- "node": "^10.12.0 || >=12.0.0"
+ "node": ">=12.0.0"
}
},
"node_modules/fill-range": {
@@ -1095,17 +1263,18 @@
}
},
"node_modules/flat-cache": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz",
- "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "flatted": "^3.2.7",
+ "flatted": "^3.2.9",
"keyv": "^4.5.3",
"rimraf": "^3.0.2"
},
"engines": {
- "node": ">=12.0.0"
+ "node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/flatted": {
@@ -1118,7 +1287,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/function-bind": {
"version": "1.1.1",
@@ -1130,7 +1300,9 @@
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
+ "license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -1197,15 +1369,13 @@
}
},
"node_modules/globals": {
- "version": "13.22.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz",
- "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==",
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
"dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -1237,12 +1407,6 @@
"integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
"dev": true
},
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
"node_modules/hard-rejection": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
@@ -1356,7 +1520,9 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
"dev": true,
+ "license": "ISC",
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@@ -1366,7 +1532,8 @@
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/ini": {
"version": "1.3.8",
@@ -1431,15 +1598,6 @@
"node": ">=0.12.0"
}
},
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
@@ -1471,10 +1629,11 @@
"dev": true
},
"node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
@@ -1498,7 +1657,8 @@
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
@@ -1507,10 +1667,11 @@
"dev": true
},
"node_modules/keyv": {
- "version": "4.5.3",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
- "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"json-buffer": "3.0.1"
}
@@ -1525,10 +1686,11 @@
}
},
"node_modules/known-css-properties": {
- "version": "0.28.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz",
- "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==",
- "dev": true
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
+ "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/levn": {
"version": "0.4.1",
@@ -1770,6 +1932,7 @@
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"wrappy": "1"
}
@@ -1865,6 +2028,7 @@
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -1874,6 +2038,7 @@
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -2131,7 +2296,9 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
+ "license": "ISC",
"dependencies": {
"glob": "^7.1.3"
},
@@ -2185,6 +2352,7 @@
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
@@ -2197,6 +2365,7 @@
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -2326,6 +2495,7 @@
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
},
@@ -2340,10 +2510,11 @@
"dev": true
},
"node_modules/stylelint": {
- "version": "15.10.3",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.3.tgz",
- "integrity": "sha512-aBQMMxYvFzJJwkmg+BUUg3YfPyeuCuKo2f+LOw7yYbU8AZMblibwzp9OV4srHVeQldxvSFdz0/Xu8blq2AesiA==",
+ "version": "15.11.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz",
+ "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@csstools/css-parser-algorithms": "^2.3.1",
"@csstools/css-tokenizer": "^2.2.0",
@@ -2352,12 +2523,12 @@
"balanced-match": "^2.0.0",
"colord": "^2.9.3",
"cosmiconfig": "^8.2.0",
- "css-functions-list": "^3.2.0",
+ "css-functions-list": "^3.2.1",
"css-tree": "^2.3.1",
"debug": "^4.3.4",
"fast-glob": "^3.3.1",
"fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^6.0.1",
+ "file-entry-cache": "^7.0.0",
"global-modules": "^2.0.0",
"globby": "^11.1.0",
"globjoin": "^0.1.4",
@@ -2366,13 +2537,13 @@
"import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4",
"is-plain-object": "^5.0.0",
- "known-css-properties": "^0.28.0",
+ "known-css-properties": "^0.29.0",
"mathml-tag-names": "^2.1.3",
"meow": "^10.1.5",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"picocolors": "^1.0.0",
- "postcss": "^8.4.27",
+ "postcss": "^8.4.28",
"postcss-resolve-nested-selector": "^0.1.1",
"postcss-safe-parser": "^6.0.0",
"postcss-selector-parser": "^6.0.13",
@@ -2414,6 +2585,7 @@
"resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-34.0.0.tgz",
"integrity": "sha512-u0VSZnVyW9VSryBG2LSO+OQTjN7zF9XJaAJRX/4EwkmU0R2jYwmBSN10acqZisDitS0CLiEiGjX7+Hrq8TAhfQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"stylelint-config-recommended": "^13.0.0"
},
@@ -2508,12 +2680,6 @@
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true
},
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2550,18 +2716,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -2592,6 +2746,7 @@
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
@@ -2606,7 +2761,8 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/write-file-atomic": {
"version": "5.0.1",
@@ -2827,52 +2983,118 @@
"requires": {}
},
"@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
"dev": true,
"requires": {
- "eslint-visitor-keys": "^3.3.0"
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true
+ }
}
},
"@eslint-community/regexpp": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.0.tgz",
- "integrity": "sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true
},
+ "@eslint/config-array": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
+ "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "dev": true,
+ "requires": {
+ "@eslint/object-schema": "^2.1.7",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ }
+ },
+ "@eslint/config-helpers": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
+ "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
+ "dev": true,
+ "requires": {
+ "@eslint/core": "^0.17.0"
+ }
+ },
+ "@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.15"
+ }
+ },
"@eslint/eslintrc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
- "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz",
+ "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
+ "espree": "^10.0.1",
+ "globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
+ "js-yaml": "^4.1.1",
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true
+ }
}
},
"@eslint/js": {
- "version": "8.50.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz",
- "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==",
+ "version": "9.39.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz",
+ "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==",
"dev": true
},
- "@humanwhocodes/config-array": {
- "version": "0.11.11",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
- "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
+ "@eslint/object-schema": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
+ "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
+ "dev": true
+ },
+ "@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
"dev": true,
"requires": {
- "@humanwhocodes/object-schema": "^1.2.1",
- "debug": "^4.1.1",
- "minimatch": "^3.0.5"
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
+ }
+ },
+ "@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true
+ },
+ "@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "dev": true,
+ "requires": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
}
},
"@humanwhocodes/module-importer": {
@@ -2881,10 +3103,10 @@
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true
},
- "@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"dev": true
},
"@nodelib/fs.scandir": {
@@ -2913,6 +3135,18 @@
"fastq": "^1.6.0"
}
},
+ "@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true
+ },
+ "@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
"@types/minimist": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz",
@@ -2926,9 +3160,9 @@
"dev": true
},
"acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true
},
"acorn-jsx": {
@@ -3096,9 +3330,9 @@
}
},
"cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
@@ -3107,9 +3341,9 @@
}
},
"css-functions-list": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.0.tgz",
- "integrity": "sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
+ "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
"dev": true
},
"css-tree": {
@@ -3182,15 +3416,6 @@
"path-type": "^4.0.0"
}
},
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -3213,48 +3438,66 @@
"dev": true
},
"eslint": {
- "version": "8.50.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz",
- "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==",
+ "version": "9.39.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
+ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
"dev": true,
"requires": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.2",
- "@eslint/js": "8.50.0",
- "@humanwhocodes/config-array": "^0.11.11",
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.21.1",
+ "@eslint/config-helpers": "^0.4.2",
+ "@eslint/core": "^0.17.0",
+ "@eslint/eslintrc": "^3.3.1",
+ "@eslint/js": "9.39.1",
+ "@eslint/plugin-kit": "^0.4.1",
+ "@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
+ "cross-spawn": "^7.0.6",
"debug": "^4.3.2",
- "doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
+ "eslint-scope": "^8.4.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "esquery": "^1.5.0",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
+ "file-entry-cache": "^8.0.0",
"find-up": "^5.0.0",
"glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
"ignore": "^5.2.0",
"imurmurhash": "^0.1.4",
"is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
"lodash.merge": "^4.6.2",
"minimatch": "^3.1.2",
"natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
+ "optionator": "^0.9.3"
+ },
+ "dependencies": {
+ "file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^4.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ }
+ }
}
},
"eslint-config-google": {
@@ -3265,9 +3508,9 @@
"requires": {}
},
"eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"dev": true,
"requires": {
"esrecurse": "^4.3.0",
@@ -3275,20 +3518,20 @@
}
},
"eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true
},
"espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
"requires": {
- "acorn": "^8.9.0",
+ "acorn": "^8.15.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
+ "eslint-visitor-keys": "^4.2.1"
}
},
"esquery": {
@@ -3379,12 +3622,12 @@
}
},
"file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-7.0.2.tgz",
+ "integrity": "sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==",
"dev": true,
"requires": {
- "flat-cache": "^3.0.4"
+ "flat-cache": "^3.2.0"
}
},
"fill-range": {
@@ -3407,12 +3650,12 @@
}
},
"flat-cache": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz",
- "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
"requires": {
- "flatted": "^3.2.7",
+ "flatted": "^3.2.9",
"keyv": "^4.5.3",
"rimraf": "^3.0.2"
}
@@ -3490,13 +3733,10 @@
}
},
"globals": {
- "version": "13.22.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.22.0.tgz",
- "integrity": "sha512-H1Ddc/PbZHTDVJSnj8kWptIRSD6AM3pK+mKytuIVF4uoBV7rshFlhhvA58ceJ5wp3Er58w6zj7bykMpYXt3ETw==",
- "dev": true,
- "requires": {
- "type-fest": "^0.20.2"
- }
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
+ "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
+ "dev": true
},
"globby": {
"version": "11.1.0",
@@ -3518,12 +3758,6 @@
"integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
"dev": true
},
- "graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
"hard-rejection": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
@@ -3658,12 +3892,6 @@
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
- "is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true
- },
"is-plain-obj": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
@@ -3689,9 +3917,9 @@
"dev": true
},
"js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
"requires": {
"argparse": "^2.0.1"
@@ -3722,9 +3950,9 @@
"dev": true
},
"keyv": {
- "version": "4.5.3",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz",
- "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==",
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
"dev": true,
"requires": {
"json-buffer": "3.0.1"
@@ -3737,9 +3965,9 @@
"dev": true
},
"known-css-properties": {
- "version": "0.28.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz",
- "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==",
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
+ "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
"dev": true
},
"levn": {
@@ -4286,9 +4514,9 @@
"dev": true
},
"stylelint": {
- "version": "15.10.3",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.10.3.tgz",
- "integrity": "sha512-aBQMMxYvFzJJwkmg+BUUg3YfPyeuCuKo2f+LOw7yYbU8AZMblibwzp9OV4srHVeQldxvSFdz0/Xu8blq2AesiA==",
+ "version": "15.11.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-15.11.0.tgz",
+ "integrity": "sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==",
"dev": true,
"requires": {
"@csstools/css-parser-algorithms": "^2.3.1",
@@ -4298,12 +4526,12 @@
"balanced-match": "^2.0.0",
"colord": "^2.9.3",
"cosmiconfig": "^8.2.0",
- "css-functions-list": "^3.2.0",
+ "css-functions-list": "^3.2.1",
"css-tree": "^2.3.1",
"debug": "^4.3.4",
"fast-glob": "^3.3.1",
"fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^6.0.1",
+ "file-entry-cache": "^7.0.0",
"global-modules": "^2.0.0",
"globby": "^11.1.0",
"globjoin": "^0.1.4",
@@ -4312,13 +4540,13 @@
"import-lazy": "^4.0.0",
"imurmurhash": "^0.1.4",
"is-plain-object": "^5.0.0",
- "known-css-properties": "^0.28.0",
+ "known-css-properties": "^0.29.0",
"mathml-tag-names": "^2.1.3",
"meow": "^10.1.5",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"picocolors": "^1.0.0",
- "postcss": "^8.4.27",
+ "postcss": "^8.4.28",
"postcss-resolve-nested-selector": "^0.1.1",
"postcss-safe-parser": "^6.0.0",
"postcss-selector-parser": "^6.0.13",
@@ -4421,12 +4649,6 @@
}
}
},
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
- },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -4451,12 +4673,6 @@
"prelude-ls": "^1.2.1"
}
},
- "type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true
- },
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
diff --git a/package.json b/package.json
index 72a1821..453a709 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "dashboard-project",
"version": "1.0.0",
- "description": "",
+ "description": "Created by Lu Yii Wong",
"main": "index.js",
"type": "module",
"directories": {},
@@ -12,9 +12,20 @@
"author": "",
"license": "ISC",
"devDependencies": {
- "eslint": "^8.48.0",
+ "@eslint/js": "^9.39.1",
+ "eslint": "^9.39.1",
"eslint-config-google": "^0.14.0",
- "stylelint": "^15.10.3",
+ "globals": "^16.5.0",
+ "stylelint": "^15.11.0",
"stylelint-config-standard": "^34.0.0"
- }
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/luyiiw/dashboard-project.git"
+ },
+ "keywords": [],
+ "bugs": {
+ "url": "https://github.com/luyiiw/dashboard-project/issues"
+ },
+ "homepage": "https://github.com/luyiiw/dashboard-project#readme"
}