diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 6e72e28..2ea3154 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1,12 +1,12 @@ # This configuration was generated by # `rubocop --auto-gen-config --exclude-limit 10000` -# on 2024-01-09 21:03:14 UTC using RuboCop version 1.59.0. +# on 2024-02-16 22:15:49 UTC using RuboCop version 1.59.0. # The point is for the user to remove these configuration records # one by one as the offenses are removed from the code base. # Note that changes in the inspected code, or installation of new # versions of RuboCop, may require this file to be generated again. -# Offense count: 6 +# Offense count: 7 # This cop supports safe autocorrection (--autocorrect). Layout/EmptyLineAfterGuardClause: Exclude: @@ -14,7 +14,7 @@ Layout/EmptyLineAfterGuardClause: - 'app/models/resource.rb' - 'lib/triclops/raster.rb' -# Offense count: 6 +# Offense count: 7 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: EnforcedStyle. # SupportedStyles: normal, indented_internal_methods @@ -24,7 +24,7 @@ Layout/IndentationConsistency: - 'app/controllers/api_controller.rb' - 'app/controllers/application_controller.rb' -# Offense count: 6 +# Offense count: 7 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: Width, AllowedPatterns. Layout/IndentationWidth: @@ -33,22 +33,10 @@ Layout/IndentationWidth: - 'app/controllers/api_controller.rb' - 'app/controllers/application_controller.rb' -# Offense count: 1 -# This cop supports safe autocorrection (--autocorrect). -Layout/SpaceAfterComma: - Exclude: - - 'app/models/user.rb' - -# Offense count: 1 -# Configuration parameters: AllowKeywordBlockArguments. -Lint/UnderscorePrefixedVariableName: - Exclude: - - 'app/models/user.rb' - # Offense count: 1 # Configuration parameters: AllowedMethods, AllowedPatterns, CountRepeatedAttributes. Metrics/AbcSize: - Max: 32 + Max: 43 # Offense count: 1 # Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode. @@ -59,27 +47,12 @@ Metrics/BlockLength: # Offense count: 1 # Configuration parameters: AllowedMethods, AllowedPatterns. Metrics/CyclomaticComplexity: - Max: 8 - -# Offense count: 1 -# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns. -Metrics/MethodLength: - Max: 19 + Max: 12 # Offense count: 1 # Configuration parameters: AllowedMethods, AllowedPatterns. Metrics/PerceivedComplexity: - Max: 9 - -# Offense count: 1 -# Configuration parameters: NamePrefix, ForbiddenPrefixes, AllowedMethods, MethodDefinitionMacros. -# NamePrefix: is_, has_, have_ -# ForbiddenPrefixes: is_, has_, have_ -# AllowedMethods: is_a? -# MethodDefinitionMacros: define_method, define_singleton_method -Naming/PredicateName: - Exclude: - - 'app/models/user.rb' + Max: 12 # Offense count: 21 # This cop supports safe autocorrection (--autocorrect). @@ -159,21 +132,6 @@ Rails/IndexWith: Exclude: - 'app/models/concerns/triclops/resource/as_json.rb' -# Offense count: 1 -# Configuration parameters: Include. -# Include: app/models/**/*.rb -Rails/UniqueValidationWithoutIndex: - Exclude: - - 'app/models/user.rb' - -# Offense count: 1 -# This cop supports unsafe autocorrection (--autocorrect-all). -# Configuration parameters: EnforcedStyle. -# SupportedStyles: always, conditionals -Style/AndOr: - Exclude: - - 'app/models/user.rb' - # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: Keywords, RequireColon. @@ -182,14 +140,6 @@ Style/CommentAnnotation: Exclude: - 'spec/requests/iiif/images/raster_spec.rb' -# Offense count: 1 -# This cop supports safe autocorrection (--autocorrect). -# Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions. -# SupportedStyles: assign_to_condition, assign_inside_condition -Style/ConditionalAssignment: - Exclude: - - 'app/models/user.rb' - # Offense count: 1 # This cop supports safe autocorrection (--autocorrect). Style/ExpandPathArguments: @@ -202,14 +152,6 @@ Style/ExplicitBlockArgument: Exclude: - 'lib/triclops/lock.rb' -# Offense count: 4 -# This cop supports safe autocorrection (--autocorrect). -Style/IfUnlessModifier: - Exclude: - - 'app/models/user.rb' - - 'config/routes.rb' - - 'lib/triclops/raster.rb' - # Offense count: 1 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: EnforcedStyle. @@ -225,13 +167,12 @@ Style/RedundantFetchBlock: Exclude: - 'config/puma.rb' -# Offense count: 7 +# Offense count: 6 # This cop supports unsafe autocorrection (--autocorrect-all). # Configuration parameters: Mode. Style/StringConcatenation: Exclude: - 'app/models/resource.rb' - - 'app/models/user.rb' - 'spec/models/concerns/triclops/resource/iiif_info_spec.rb' - 'spec/models/resource_spec.rb' @@ -260,7 +201,7 @@ Style/StringLiterals: - 'spec/triclops/raster_cache_spec.rb' - 'spec/triclops/raster_spec.rb' -# Offense count: 15 +# Offense count: 17 # This cop supports safe autocorrection (--autocorrect). # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, AllowedPatterns. # URISchemes: http, https diff --git a/app/controllers/api/v1/resources_controller.rb b/app/controllers/api/v1/resources_controller.rb index 8eae2b5..1e276ab 100644 --- a/app/controllers/api/v1/resources_controller.rb +++ b/app/controllers/api/v1/resources_controller.rb @@ -46,8 +46,41 @@ def destroy end end + # GET /resources + def index + per_page, status, page, identifier = get_index_query_params(index_params[:per_page], index_params[:status], index_params[:page], index_params[:identifier]) + + resources = Resource + identifier && identifier != 'any' && resources = resources.where(identifier: identifier) + status && status != 'any' && resources = resources.where(status: status) + resources, last_page = find_page(resources, page, per_page) + + render json: + { resources: resources.map(&:attributes), last_page: last_page } + end + private + def find_page(resources, page, per_page) + last_page = per_page * (page - 1) < resources.order(:status).length && per_page * page >= resources.order(:status).length + + resources = resources.limit(per_page).offset((page - 1) * per_page) + status && status != 'any' && resources = resources.order(:status) + [resources, last_page] + end + + def get_index_query_params(per_page_p, status_p, page_p, identifier_p) + statuses = ['pending', 'processing', 'failure', 'ready'] + + per_page = per_page_p ? Integer(per_page_p) : 50 + param_status = status_p.is_a?(String) ? status_p.downcase : status_p + identifier = identifier_p.is_a?(String) ? identifier_p.downcase : identifier_p + status = statuses.include?(param_status) ? statuses.index(param_status) : param_status + page = page_p ? Integer(page_p) : 1 + + [per_page, status, page, identifier] + end + def set_resource @resource = Resource.find_by(identifier: params[:id]) end @@ -55,6 +88,10 @@ def set_resource def create_params params.require(:resource).permit(:source_uri, :featured_region, :pcdm_type) end + + def index_params + params.permit(:status, :page, :identifier, :format, :per_page) + end end end end diff --git a/app/controllers/api_controller.rb b/app/controllers/api_controller.rb index cb11f5b..addcf91 100644 --- a/app/controllers/api_controller.rb +++ b/app/controllers/api_controller.rb @@ -19,6 +19,7 @@ def ensure_json_request # :forbidden status if the request uses an invalid request token. This method should be # used as a before_action callback for any controller actions that require authorization. def authenticate_request_token + return if user_signed_in? authenticate_or_request_with_http_token do |token, _options| ActiveSupport::SecurityUtils.secure_compare(TRICLOPS['remote_request_api_key'], token) end diff --git a/app/javascript/components/App.tsx b/app/javascript/components/App.tsx index 318d53d..44daf70 100644 --- a/app/javascript/components/App.tsx +++ b/app/javascript/components/App.tsx @@ -1,22 +1,21 @@ import React, { useState, useEffect } from 'react'; +import '../stylesheets/triclops_v1.scss'; // app css entry point +import { RouterProvider, createBrowserRouter } from 'react-router-dom'; +import HomePage from '../pages/Home'; +import ResourcesPage from '../pages/Resources'; -const App = () => { - const [appVersion, setAppVersion] = useState(null); - - useEffect(() => { - setAppVersion(document.body.getAttribute('data-app-version')); - }, [appVersion]) - - if (!appVersion) { - return 'Loading...'; +const router = createBrowserRouter([ + { + path: '/', + children: [ + { index: true, element: }, + { path: '/admin/resources', element: } + ] } +]) - return ( -
-

Triclops

-

{`Version ${appVersion}`}

-
- ); +const App = () => { + return ; }; export default App; diff --git a/app/javascript/components/resources/ResourceList.jsx b/app/javascript/components/resources/ResourceList.jsx new file mode 100644 index 0000000..28835f6 --- /dev/null +++ b/app/javascript/components/resources/ResourceList.jsx @@ -0,0 +1,161 @@ +import React, { useEffect, useState } from 'react'; +import styled from 'styled-components'; +import SearchBar from './SearchBar'; +import { useSearchParams, useNavigate } from 'react-router-dom'; + +const filterChoices = ['Pending', 'Processing', 'Failure', 'Ready']; + +export default function ResourceList() { + const [searchParams] = useSearchParams(); + const navigate = useNavigate(); + const [filteredResources, setFilteredResources] = useState([]); + const [pageState, setPageState] = useState({ identifier: 'Any', status: 'Any', pageNumber: 1, per_page: 50 }); + const [lastPage, setLastPage] = useState(true); + + useEffect(() => { + let fetch_url ='/api/v1/resources?' + if (pageState.identifier) {fetch_url += `identifier=${pageState.identifier}&`;} + if (pageState.status) {fetch_url += `status=${pageState.status}&`;} + fetch_url += `page=${pageState.pageNumber ? pageState.pageNumber : 1}&`; + fetch_url += `per_page=${pageState.per_page}`; + (async () => { + const response = await fetch(fetch_url); + const data = await response.json(); + + setFilteredResources(data['resources']); + setLastPage(data['last_page']) + })() + }, [searchParams]); + + function setURL(identifier, status, page, per_page) { + let url = '?'; + url += 'identifier=' + identifier + '&'; + url += 'status=' + status + '&'; + url += 'page=' + page + '&'; + url +='per_page=' + per_page; + navigate(url); + } + + function handleIdentifierSearch(identifier) { + setURL(identifier, pageState.status, 1, pageState.per_page); + } + + function handleStatusFilter(status) { + if(status === 'undefined') { + status = '@undefined' + } + setURL(pageState.identifier, status, 1, pageState.per_page); + } + + function handlePerPageSet(perPage) { + setURL(pageState.identifier, pageState.status, 1, perPage); + } + + function nextPage() { + if(!lastPage) { + setURL(pageState.identifier, pageState.status, parseInt(pageState.pageNumber) + 1, pageState.per_page); + } + } + + function prevPage() { + if(parseInt(pageState.pageNumber) > 1) { + setURL(pageState.identifier, pageState.status, parseInt(pageState.pageNumber) - 1, pageState.per_page); + } + } + + const TableContainer = styled.div` + height: 100%; + ` + + const queryIdentifier = searchParams.get('identifier'); + const queryStatus = searchParams.get('status'); + const queryPage = searchParams.get('page'); + const queryPerPage = searchParams.get('per_page'); + + const newPageState = { ...pageState } + + if ( + (queryIdentifier != pageState.identifier) || + (queryStatus && queryStatus != pageState.status) || + (queryPage && parseInt(queryPage) != pageState.pageNumber) || + (queryPerPage && queryPerPage != pageState.per_page) + ) { + + if (queryIdentifier != pageState.identifier) { + // console.log("changing identifier from " + pageState.identifier + " to " + queryIdentifier); + // setFilteredResources(resources.filter((resource) => resource.identifier === queryIdentifier)); + newPageState.identifier = queryIdentifier; + } + if (queryStatus && queryStatus != pageState.status) { + // console.log("changing status from " + pageState.status + " to " + queryStatus); + // setFilteredResources(filteredResources.filter((resource) => resource.status === queryStatus)); + newPageState.status = queryStatus; + } + if (queryPage && queryPage != pageState.pageNumber) { + // console.log("changing page number from " + pageState.pageNumber + " to " + queryPage); + newPageState.pageNumber = queryPage; + } else if (newPageState.identifier != pageState.identifier || newPageState.status != pageState.status) { + // Move to page 1 if a filter param was updated and the page isn't specified + newPageState.pageNumber = 1; + } + if (queryPerPage && queryPerPage != pageState.per_page) { + newPageState.per_page = queryPerPage; + } + setPageState(newPageState); + } + + return ( +
+ + + + + + + + + + + + + + + + + + + + + + {filteredResources.map((resource) => + + + + + + + + + + + + + )} + +
IdentifierSource URIWidthHeightFeatured RegionPCDM TypeStatusError MessageCreated AtUpdated At
{resource.identifier}{resource.source_uri}{resource.width}{resource.height}{resource.featured_region}{resource.pcdm_type}{resource.status}{resource.error_message}{resource.created_at}{resource.updated_at}
+ {/*
    {resources.map((resource) =>
  1. {JSON.stringify(resource)}
  2. )}
*/} +
+ + + +
+ ); +} \ No newline at end of file diff --git a/app/javascript/components/resources/SearchBar.jsx b/app/javascript/components/resources/SearchBar.jsx new file mode 100644 index 0000000..6a61441 --- /dev/null +++ b/app/javascript/components/resources/SearchBar.jsx @@ -0,0 +1,37 @@ +import React, {useRef} from 'react'; + +// const STATUSES = [1, 2, 3, 4]; + +export default function SearchBar({filterChoices, filterDefault, searchDefault, perPageDefault, onSearch, onFilter, onPerPageSet}) { + const identifierInput = useRef(); + const perPageInput = useRef(); + + return ( +
+
+
+ + +
+
+ + + + + +
+
+ + + + +
+
+
+ ) +} \ No newline at end of file diff --git a/app/javascript/pages/Home.jsx b/app/javascript/pages/Home.jsx new file mode 100644 index 0000000..03f78e9 --- /dev/null +++ b/app/javascript/pages/Home.jsx @@ -0,0 +1,20 @@ +import React, { useEffect, useState } from "react"; + +export default function HomePage() { + const [appVersion, setAppVersion] = useState(null); + + useEffect(() => { + setAppVersion(document.body.getAttribute('data-app-version')); + }, [appVersion]) + + if (!appVersion) { + return 'Loading...'; + } + + return ( +
+

Triclops

+

{`Version ${appVersion}`}

+
+ ) +} \ No newline at end of file diff --git a/app/javascript/pages/Resources.jsx b/app/javascript/pages/Resources.jsx new file mode 100644 index 0000000..fc1a061 --- /dev/null +++ b/app/javascript/pages/Resources.jsx @@ -0,0 +1,9 @@ +import React from 'react'; + +import ResourceList from "../components/resources/ResourceList"; + +export default function ResourcesPage() { + return ( + + ); +} \ No newline at end of file diff --git a/app/javascript/stylesheets/triclops_v1.scss b/app/javascript/stylesheets/triclops_v1.scss new file mode 100644 index 0000000..e44ea1a --- /dev/null +++ b/app/javascript/stylesheets/triclops_v1.scss @@ -0,0 +1,62 @@ +//$form-group-margin-bottom: 1rem !default; + +// Default bootswatch pulse font size is too small, so we'll increase it. +$font-size-base: 0.9375rem !default; + +//$breadcrumb-padding-y: .45rem !default; // Reducing the padding + +@import "bootswatch/dist/pulse/variables"; +@import 'bootstrap/scss/bootstrap.scss'; +@import "bootswatch/dist/pulse/bootswatch"; + +// Disable Bootstrap 5 underlined links + +a, .btn-link { + text-decoration: none; +} + +a:hover, .btn-link:hover { + text-decoration: underline; +} + +.navbar { + a:hover, .btn-link:hover { + text-decoration: none; + } +} + +// Disable Bootstrap 5 link focus shadow + +.btn-link:focus { + box-shadow: none; +} + +.progress { + height: 1rem; +} + +// Other Styles + +.table > :not(:last-child) > :last-child > * { + border-bottom-color: #ccc; +} + +.text-orange { + color: #c78203; +} + +.ace_editor { + border: 1px solid #ddd; +} + +.dropdown-header { + padding: 0rem .5rem; +} + +.inline-badge-list { + .badge { + border-radius: .25rem; + border-color: white; + margin-left: .25rem; + } +} \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 1e2cdc8..d5989cc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -21,11 +21,12 @@ constraints resque_web_constraint do mount Resque::Server.new, at: '/resque' + get 'admin/resources', to: 'pages#home' end namespace :api do namespace :v1, defaults: { format: :json } do - resources :resources, only: [:show, :destroy] + resources :resources, only: [:show, :destroy, :index] # Rather than using the built-in "update" controller action naming convention, we'll point # put/patch to a "create_or_replace" controller action to clarify what these routes do. [:put, :patch].each do |method| diff --git a/package.json b/package.json index 2c9f0e5..3cdb52e 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,13 @@ "vite-plugin-ruby": "^5.0.0" }, "dependencies": { + "bootstrap": "^5.3.2", + "bootswatch": "^5.3.2", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-bootstrap": "^2.10.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.22.0", + "sass": "^1.70.0", + "styled-components": "^6.1.8" } } diff --git a/spec/requests/api/index_spec.rb b/spec/requests/api/index_spec.rb new file mode 100644 index 0000000..e5ff46e --- /dev/null +++ b/spec/requests/api/index_spec.rb @@ -0,0 +1,135 @@ +require 'rails_helper' + +RSpec.describe 'show resource', type: :request do + let(:identifiers) { ['test1', 'test2'] } + + describe 'GET /resources/:id' do + context 'without authentication' do + context 'with valid update params' do + it 'returns a 401 status' do + FactoryBot.create(:resource, identifier: identifiers[0]) + get '/api/v1/resources/' + expect(response).to have_http_status(:unauthorized) + end + end + end + + context 'with authentication' do + it 'returns a list of resources' do + resources = identifiers.map do |identifier| + FactoryBot.create(:resource, identifier: identifier) + end + get_with_auth '/api/v1/resources' + expect(response).to have_http_status(:success) + expected_response_json = { + 'resources' => resources.map do |resource| + { + 'accessed_at' => nil, + 'created_at' => resource.created_at.to_time.iso8601(3), + 'error_message' => nil, + 'featured_region' => resource.featured_region, + 'height' => resource.height, + 'id' => resources.index(resource) + 1, + 'identifier' => resource.identifier, + 'pcdm_type' => 'Image', + 'source_uri' => resource.source_uri, + 'status' => 'pending', + 'updated_at' => resource.updated_at.to_time.iso8601(3), + 'width' => resource.width + } + end, + 'last_page' => true + } + expect(JSON.parse(response.body)).to eq(expected_response_json) + end + + it 'properly filters resources by identifier' do + resources = identifiers.map do |identifier| + FactoryBot.create(:resource, identifier: identifier) + end + get_with_auth "/api/v1/resources?identifier=#{identifiers[1]}" + # puts "/api/v1/resources/identifier=#{identifiers[1]}" + expect(response).to have_http_status(:success) + resource = resources[1] + expected_response_json = + { + 'resources' => [{ + 'accessed_at' => nil, + 'created_at' => resource.created_at.to_time.iso8601(3), + 'error_message' => nil, + 'featured_region' => resource.featured_region, + 'height' => resource.height, + 'id' => resources.index(resource) + 1, + 'identifier' => resource.identifier, + 'pcdm_type' => 'Image', + 'source_uri' => resource.source_uri, + 'status' => 'pending', + 'updated_at' => resource.updated_at.to_time.iso8601(3), + 'width' => resource.width + }], + 'last_page' => true + } + expect(JSON.parse(response.body)).to eq(expected_response_json) + end + + it 'properly filters resources by status' do + resources = [ + FactoryBot.create(:resource, identifier: identifiers[0]), + FactoryBot.create(:resource, :ready, identifier: identifiers[1]) + ] + get_with_auth '/api/v1/resources?status=ready' + # puts "/api/v1/resources/identifier=#{identifiers[1]}" + expect(response).to have_http_status(:success) + resource = resources[1] + expected_response_json = + { + 'resources' => [{ + 'accessed_at' => nil, + 'created_at' => resource.created_at.to_time.iso8601(3), + 'error_message' => nil, + 'featured_region' => resource.featured_region, + 'height' => resource.height, + 'id' => resources.index(resource) + 1, + 'identifier' => resource.identifier, + 'pcdm_type' => 'Image', + 'source_uri' => resource.source_uri, + 'status' => 'ready', + 'updated_at' => resource.updated_at.to_time.iso8601(3), + 'width' => resource.width + }], + 'last_page' => true + } + expect(JSON.parse(response.body)).to eq(expected_response_json) + end + + it 'properly recieves a page' do + resources = identifiers.map do |identifier| + FactoryBot.create(:resource, identifier: identifier) + end + get_with_auth '/api/v1/resources?per_page=1&page=2' + # puts "/api/v1/resources/identifier=#{identifiers[1]}" + expect(response).to have_http_status(:success) + resource = resources[1] + expected_response_json = + { + 'resources' => [{ + 'accessed_at' => nil, + 'created_at' => resource.created_at.to_time.iso8601(3), + 'error_message' => nil, + 'featured_region' => resource.featured_region, + 'height' => resource.height, + 'id' => resources.index(resource) + 1, + 'identifier' => resource.identifier, + 'pcdm_type' => 'Image', + 'source_uri' => resource.source_uri, + 'status' => 'pending', + 'updated_at' => resource.updated_at.to_time.iso8601(3), + 'width' => resource.width + }], + 'last_page' => true + } + expect(JSON.parse(response.body)).to eq(expected_response_json) + end + end + end +end diff --git a/yarn.lock b/yarn.lock index bea3f9a..22ebb13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,30 @@ # yarn lockfile v1 +"@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + dependencies: + regenerator-runtime "^0.14.0" + +"@emotion/is-prop-valid@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/unitless@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + "@esbuild/aix-ppc64@0.19.11": version "0.19.11" resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz#2acd20be6d4f0458bc8c784103495ff24f13b1d3" @@ -24,7 +48,7 @@ "@esbuild/darwin-arm64@0.19.11": version "0.19.11" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz#533fb7f5a08c37121d82c66198263dcc1bed29bf" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz" integrity sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ== "@esbuild/darwin-x64@0.19.11": @@ -119,7 +143,7 @@ "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" @@ -127,17 +151,56 @@ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@popperjs/core@^2.11.6": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@react-aria/ssr@^3.5.0": + version "3.9.1" + resolved "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.1.tgz" + integrity sha512-NqzkLFP8ZVI4GSorS0AYljC13QW2sc8bDqJOkBvkAt3M8gbcAXJWVRGtZBCRscki9RZF+rNlnPdg0G0jYkhJcg== + dependencies: + "@swc/helpers" "^0.5.0" + +"@remix-run/router@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.0.tgz#461a952c2872dd82c8b2e9b74c4dfaff569123e2" + integrity sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ== + +"@restart/hooks@^0.4.9": + version "0.4.15" + resolved "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.15.tgz" + integrity sha512-cZFXYTxbpzYcieq/mBwSyXgqnGMHoBVh3J7MU0CCoIB4NRZxV9/TuwTBAaLMqpNhC3zTPMCgkQ5Ey07L02Xmcw== + dependencies: + dequal "^2.0.3" + +"@restart/ui@^1.6.6": + version "1.6.6" + resolved "https://registry.npmjs.org/@restart/ui/-/ui-1.6.6.tgz" + integrity sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA== + dependencies: + "@babel/runtime" "^7.21.0" + "@popperjs/core" "^2.11.6" + "@react-aria/ssr" "^3.5.0" + "@restart/hooks" "^0.4.9" + "@types/warning" "^3.0.0" + dequal "^2.0.3" + dom-helpers "^5.2.0" + uncontrollable "^8.0.1" + warning "^4.0.3" + "@rollup/rollup-android-arm-eabi@4.9.4": version "4.9.4" resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.4.tgz#b1094962742c1a0349587040bc06185e2a667c9b" @@ -150,7 +213,7 @@ "@rollup/rollup-darwin-arm64@4.9.4": version "4.9.4" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.4.tgz#2456630c007cc5905cb368acb9ff9fc04b2d37be" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.4.tgz" integrity sha512-1fzh1lWExwSTWy8vJPnNbNM02WZDS8AW3McEOb7wW+nPChLKf3WG2aG7fhaUmfX5FKw9zhsF5+MBwArGyNM7NA== "@rollup/rollup-darwin-x64@4.9.4": @@ -203,28 +266,156 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.4.tgz#16295ccae354707c9bc6842906bdeaad4f3ba7a5" integrity sha512-LfdGXCV9rdEify1oxlN9eamvDSjv9md9ZVMAbNHA87xqIfFCxImxan9qZ8+Un54iK2nnqPlbnSi4R54ONtbWBw== +"@swc/helpers@^0.5.0": + version "0.5.3" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz" + integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A== + dependencies: + tslib "^2.4.0" + "@types/estree@1.0.5": version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== -braces@^3.0.2: +"@types/prop-types@*": + version "15.7.11" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz" + integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== + +"@types/react-transition-group@^4.4.6": + version "4.4.10" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz" + integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@>=16.9.11": + version "18.2.48" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz" + integrity sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.8" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz" + integrity sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A== + +"@types/stylis@4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/stylis/-/stylis-4.2.0.tgz#199a3f473f0c3a6f6e4e1b17cdbc967f274bdc6b" + integrity sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw== + +"@types/warning@^3.0.0": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz" + integrity sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bootstrap@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz" + integrity sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g== + +bootswatch@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/bootswatch/-/bootswatch-5.3.2.tgz#b59aa9d37671cb25dd781e4a6d6773008d6c9356" + integrity sha512-r05xOSLSx7MJvjpk/uoU8wPYgkPHWLV+uenLaRsS7yBsqSUcWYPjeUkz+tmrRv6s1eFxkF08NvQfBSSPCTyYaA== + +braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" +camelize@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" + integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== + +"chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +classnames@^2.3.2: + version "2.5.1" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +css-color-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" + integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== + +css-to-react-native@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.2.0.tgz#cdd8099f71024e149e4f6fe17a7d46ecd55f1e32" + integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== + dependencies: + camelize "^1.0.0" + css-color-keywords "^1.0.0" + postcss-value-parser "^4.0.2" + +csstype@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + debug@^4.3.4: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + esbuild@^0.19.3: version "0.19.11" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.11.tgz#4a02dca031e768b5556606e1b468fe72e3325d96" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz" integrity sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA== optionalDependencies: "@esbuild/aix-ppc64" "0.19.11" @@ -253,7 +444,7 @@ esbuild@^0.19.3: fast-glob@^3.3.2: version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -264,67 +455,86 @@ fast-glob@^3.3.2: fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +immutable@^4.0.0: + version "4.3.5" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz" + integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-glob@^4.0.1: +is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -loose-envify@^1.1.0: +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: js-tokens "^3.0.0 || ^4.0.0" merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -332,61 +542,167 @@ micromatch@^4.0.4: ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nanoid@^3.3.7: +nanoid@^3.3.6, nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +postcss-value-parser@^4.0.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@^8.4.32: version "8.4.33" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz" integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" source-map-js "^1.0.2" +prop-types-extra@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz" + integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== + dependencies: + react-is "^16.3.2" + warning "^4.0.0" + +prop-types@^15.6.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +react-bootstrap@^2.10.0: + version "2.10.0" + resolved "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.0.tgz" + integrity sha512-87gRP69VAfeU2yKgp8RI3HvzhPNrnYIV2QNranYXataz3ef+k7OhvKGGdxQLQfUsQ2RTmlY66tn4pdFrZ94hNg== + dependencies: + "@babel/runtime" "^7.22.5" + "@restart/hooks" "^0.4.9" + "@restart/ui" "^1.6.6" + "@types/react-transition-group" "^4.4.6" + classnames "^2.3.2" + dom-helpers "^5.2.1" + invariant "^2.2.4" + prop-types "^15.8.1" + prop-types-extra "^1.1.0" + react-transition-group "^4.4.5" + uncontrollable "^7.2.1" + warning "^4.0.3" + react-dom@^18.2.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" scheduler "^0.23.0" +react-is@^16.13.1, react-is@^16.3.2: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-lifecycles-compat@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-router-dom@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.0.tgz#177c8bd27146decbb991eafb5df159f7a9f70035" + integrity sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag== + dependencies: + "@remix-run/router" "1.15.0" + react-router "6.22.0" + +react-router@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.0.tgz#a22b44851a79dafc6b944cb418db3e80622b9be1" + integrity sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg== + dependencies: + "@remix-run/router" "1.15.0" + +react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + react@^18.2.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rollup@^4.2.0: version "4.9.4" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.4.tgz#37bc0c09ae6b4538a9c974f4d045bb64b2e7c27c" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.9.4.tgz" integrity sha512-2ztU7pY/lrQyXSCnnoU4ICjT/tCG9cdH3/G25ERqE3Lst6vl2BCM5hL2Nw+sslAvAf+ccKsAq1SkKQALyqhR7g== dependencies: "@types/estree" "1.0.5" @@ -408,33 +724,92 @@ rollup@^4.2.0: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" +sass@^1.70.0: + version "1.70.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.70.0.tgz#761197419d97b5358cb25f9dd38c176a8a270a75" + integrity sha512-uUxNQ3zAHeAx5nRFskBnrWzDUJrrvpCPD5FNAoRvTi0WwremlheES3tg+56PaVtCs5QDRX5CBLxxKMDJMEa1WQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + scheduler@^0.23.0: version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" -source-map-js@^1.0.2: +shallowequal@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +styled-components@^6.1.8: + version "6.1.8" + resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-6.1.8.tgz#c109d36aeea52d8f049e12de2f3be39a6fc86201" + integrity sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw== + dependencies: + "@emotion/is-prop-valid" "1.2.1" + "@emotion/unitless" "0.8.0" + "@types/stylis" "4.2.0" + css-to-react-native "3.2.0" + csstype "3.1.2" + postcss "8.4.31" + shallowequal "1.1.0" + stylis "4.3.1" + tslib "2.5.0" + +stylis@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.3.1.tgz#ed8a9ebf9f76fe1e12d462f5cc3c4c980b23a7eb" + integrity sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ== + to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" +tslib@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +uncontrollable@^7.2.1: + version "7.2.1" + resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz" + integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== + dependencies: + "@babel/runtime" "^7.6.3" + "@types/react" ">=16.9.11" + invariant "^2.2.4" + react-lifecycles-compat "^3.0.4" + +uncontrollable@^8.0.1: + version "8.0.4" + resolved "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz" + integrity sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ== + vite-plugin-ruby@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/vite-plugin-ruby/-/vite-plugin-ruby-5.0.0.tgz#cd891198a7672f2e8402439f53ab9d2b08f6502d" + resolved "https://registry.npmjs.org/vite-plugin-ruby/-/vite-plugin-ruby-5.0.0.tgz" integrity sha512-c8PjTp21Ah/ttgnNUyu0qvCXZI08Jr9I24oUKg3TRIRhF5GcOZ++6wtlTCrNFd9COEQbpXHxlRIXd/MEg0iZJw== dependencies: debug "^4.3.4" @@ -442,7 +817,7 @@ vite-plugin-ruby@^5.0.0: vite@^5.0.10: version "5.0.11" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.11.tgz#31562e41e004cb68e1d51f5d2c641ab313b289e4" + resolved "https://registry.npmjs.org/vite/-/vite-5.0.11.tgz" integrity sha512-XBMnDjZcNAw/G1gEiskiM1v6yzM4GE5aMGvhWTlHAYYhxb7S3/V1s3m2LDHa8Vh6yIWYYB0iJwsEaS523c4oYA== dependencies: esbuild "^0.19.3" @@ -450,3 +825,10 @@ vite@^5.0.10: rollup "^4.2.0" optionalDependencies: fsevents "~2.3.3" + +warning@^4.0.0, warning@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0"