From b532b15f0406fcb90d2512967f39992845a58f1d Mon Sep 17 00:00:00 2001 From: Nabil Freij Date: Sun, 25 Jan 2026 13:39:33 -0800 Subject: [PATCH 01/25] Rewrite to use astro --- .circleci/config.yml | 96 +- .github/workflows/ci.yml | 76 + .gitignore | 11 +- .gitmodules | 3 - .markdownlint-cli2.jsonc | 4 + .markdownlint.json | 11 + .prettierignore | 1 + .prettierrc.cjs | 11 + Gemfile | 8 - LICENSE | 3 +- README.md | 101 +- _config.yml | 49 - _data/icons.yaml | 34 - _data/members.yaml | 365 - _includes/footer.html | 39 - _includes/head.html | 71 - _includes/header.html | 36 - _includes/member.html | 88 - _includes/style.html | 7 - _layouts/default.html | 22 - _layouts/display.html | 20 - _layouts/mission.html | 15 - _layouts/page.html | 14 - _layouts/post.html | 15 - _layouts/projects.html | 40 - _plugins/shuffle.rb | 9 - _projects/2017/casacore/testing.md | 30 - .../2018/astropy/astropy-learn-website.md | 50 - .../2018/astropy/sphinx-example-index.md | 54 - _projects/2018/astropy/table-optimize.md | 61 - _projects/2019/astropy/table-optimize.md | 63 - _projects/2019/astropy/telescopy.md | 50 - _projects/2019/sunpy/featuresevents.md | 75 - _projects/2020/.gitkeep | 0 ...-for-Schwarzschild-and-Kerr-Geometries..md | 96 - .../radis_atmosphere_calculation_interface.md | 62 - _projects/2021/.gitkeep | 0 _projects/2021/astropy/astropyCDS.md | 48 - _projects/2022/.gitkeep | 0 _projects/2022/astropy/.gitkeep | 0 _projects/2022/gnuastro/.gitkeep | 0 _projects/2022/juliaastro/.gitkeep | 0 _projects/2022/radis/.gitkeep | 0 _projects/2022/radis/performance_tweaks.md | 76 - _projects/2022/stingray/.gitkeep | 0 .../2022/stingray/type_hints_stingray.md | 53 - _projects/2022/sunpy/.gitkeep | 0 _projects/2023/.gitkeep | 0 .../2023/radis/out_of_core_calculations.md | 81 - _projects/2023/sunpy/.gitkeep | 0 _projects/2024/.gitkeep | 0 _projects/2024/sunpy/.gitkeep | 0 _projects/2025/.gitkeep | 0 _projects/2025/sunpy/.gitkeep | 0 _projects/2026/.gitkeep | 0 _projects/2026/juliaastro/.gitkeep | 0 _projects/2026/radis/.gitkeep | 0 _projects/2026/stingray/.gitkeep | 0 _projects/2026/sunpy/.gitkeep | 0 _projects/README.md | 39 - _sass/_base.scss | 227 - _sass/_layout.scss | 343 - _sass/_syntax-highlighting.scss | 67 - _sass/bootstrap-sass-3.3.7 | 1 - _sass/materialize-src/LICENSE | 21 - _sass/materialize-src/README.md | 90 - .../sass/components/_badges.scss | 47 - .../sass/components/_buttons.scss | 291 - .../sass/components/_cards.scss | 196 - .../sass/components/_carousel.scss | 90 - .../sass/components/_chips.scss | 89 - .../sass/components/_collapsible.scss | 84 - .../sass/components/_color.scss | 412 - .../sass/components/_dropdown.scss | 68 - .../sass/components/_global.scss | 734 -- .../sass/components/_grid.scss | 156 - .../components/_icons-material-design.scss | 5 - .../sass/components/_materialbox.scss | 43 - .../sass/components/_modal.scss | 90 - .../sass/components/_navbar.scss | 208 - .../sass/components/_normalize.scss | 424 - .../sass/components/_preloader.scss | 334 - .../sass/components/_pulse.scss | 34 - .../sass/components/_roboto.scss | 39 - .../sass/components/_sideNav.scss | 214 - .../sass/components/_slider.scss | 92 - .../sass/components/_table_of_contents.scss | 33 - .../sass/components/_tabs.scss | 93 - .../sass/components/_tapTarget.scss | 103 - .../sass/components/_toast.scss | 59 - .../sass/components/_tooltip.scss | 31 - .../sass/components/_transitions.scss | 13 - .../sass/components/_typography.scss | 61 - .../sass/components/_variables.scss | 343 - .../sass/components/_waves.scss | 114 - .../components/date_picker/_default.date.scss | 456 - .../sass/components/date_picker/_default.scss | 212 - .../components/date_picker/_default.time.scss | 267 - .../sass/components/forms/_checkboxes.scss | 210 - .../sass/components/forms/_file-input.scss | 44 - .../sass/components/forms/_forms.scss | 22 - .../sass/components/forms/_input-fields.scss | 333 - .../sass/components/forms/_radio-buttons.scss | 115 - .../sass/components/forms/_range.scss | 160 - .../sass/components/forms/_select.scss | 182 - .../sass/components/forms/_switches.scss | 89 - _sass/materialize-src/sass/materialize.scss | 42 - astro.config.mjs | 10 + css/bootstrap/bootstrap-responsive.css | 1092 --- css/bootstrap/bootstrap.css | 6047 ------------ .../img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes css/bootstrap/img/glyphicons-halflings.png | Bin 12799 -> 0 bytes css/main.scss | 70 - css/swc-bootstrap.css | 263 - css/swc.css | 560 -- eslint.config.mjs | 63 + feed.xml | 30 - gsoc/contributor_guidelines.md | 100 - gsoc/display/LICENSE | 619 -- gsoc/display/data/admins.js | 11 - gsoc/display/data/faq.js | 15 - .../data/faq/contributor_obligations.md | 8 - gsoc/display/data/faq/gsoc_requirements.md | 9 - gsoc/display/data/faq/i_want_to_do_a_gsoc.md | 3 - gsoc/display/data/faq/own_project_idea.md | 2 - .../data/faq/working_out_the_proposal.md | 2 - .../data/faq/writing_a_great_proposal.md | 18 - gsoc/display/partials/tabs/faq.html | 17 - gsoc/display/partials/tabs/mentors.html | 73 - gsoc/display/partials/tabs/projects.html | 136 - gsoc/display/resources/css/style.scss | 532 -- gsoc/display/resources/js/app.js | 183 - .../angular-sanitize/angular-sanitize.js | 739 -- gsoc/display/vendors/markdown/markdown.js | 36 - gsoc/display/vendors/showdown/showdown.js | 1454 --- gsoc/gsoc2015/ideas.md | 29 - gsoc/gsoc2016/ideas.md | 29 - gsoc/gsoc2017/index.md | 6 - gsoc/gsoc2018/index.md | 6 - gsoc/gsoc2019/index.md | 6 - gsoc/gsoc2020/index.md | 6 - gsoc/gsoc2021/index.md | 6 - gsoc/gsoc2022/index.md | 6 - gsoc/gsoc2023/index.md | 6 - gsoc/gsoc2024/index.md | 6 - gsoc/gsoc2025/index.md | 6 - gsoc/gsoc2026/index.md | 6 - gsoc/index.md | 66 - gsoc/suborg_guidelines.md | 186 - img/icons/cgit.png | Bin 5427 -> 0 bytes img/logo/logoOA.png | Bin 309171 -> 0 bytes img/logo/logoOA.svg | 123 - img/logo/logoOA_embed.svg | 5546 ----------- img/members/casacore.svg | 62 - img/members/gnuastro.svg | 982 -- img/members/heliopy.png | Bin 36651 -> 0 bytes img/members/juliaastro.svg | 119 - img/members/sherpa_logo.gif | Bin 7925 -> 0 bytes index.md | 34 - linkcheck.skip.txt | 3 + {img/logo => logo_source}/logoOA.xcf | Bin members.md | 17 - news.md | 10 - package-lock.json | 8380 +++++++++++++++++ package.json | 39 + CNAME => public/CNAME | 0 public/css/astro-overrides.css | 445 + {img => public/img}/IMG_20160111_094506.jpg | Bin .../og/openastronomy-og.png | Bin scripts/linkcheck.mjs | 346 + .../assets/background}/background_ap.jpg | Bin .../assets/background}/background_sp.jpg | Bin {img/icons => src/assets}/discourse_icon.png | Bin src/assets/logoOA.png | Bin 0 -> 461786 bytes .../assets/logoOA_white.png | Bin .../assets}/members/astronomy-commons.png | Bin {img => src/assets}/members/astropy.png | Bin src/assets/members/casacore.png | Bin 0 -> 8825 bytes {img => src/assets}/members/chiantipy.png | Bin {img => src/assets}/members/coin.png | Bin {img => src/assets}/members/ctlearn.png | Bin {img => src/assets}/members/einsteinpy.png | Bin {img => src/assets}/members/glue.png | Bin src/assets/members/gnuastro.png | Bin 0 -> 125758 bytes {img => src/assets}/members/ims.png | Bin src/assets/members/juliaastro.png | Bin 0 -> 12439 bytes .../assets}/members/lincc-frameworks.png | Bin {img => src/assets}/members/plasmapy.png | Bin {img => src/assets}/members/poliastro.png | Bin {img => src/assets}/members/radis_ico.png | Bin {img => src/assets}/members/reltrans_logo.png | Bin src/assets/members/sherpa_logo.png | Bin 0 -> 5495 bytes {img => src/assets}/members/stingray_logo.png | Bin {img => src/assets}/members/sunpy.png | Bin {img => src/assets}/members/yt.png | Bin src/components/Footer.astro | 48 + src/components/Head.astro | 84 + src/components/Header.astro | 99 + src/components/MemberCard.astro | 183 + src/content/config.ts | 23 + src/content/pages/gsoc/2015/ideas.md | 18 + .../content/pages/gsoc/2015}/ideas_astropy.md | 127 +- .../gsoc/2015}/ideas_astropy_affiliated.md | 104 +- .../pages/gsoc/2015}/ideas_chiantipy.md | 37 +- .../content/pages/gsoc/2015}/ideas_sunpy.md | 91 +- .../content/pages/gsoc/2015}/ideas_yt.md | 60 +- src/content/pages/gsoc/2016/ideas.md | 19 + .../content/pages/gsoc/2016}/ideas_astropy.md | 165 +- .../pages/gsoc/2016}/ideas_casacore.md | 67 +- .../content/pages/gsoc/2016}/ideas_eras.md | 39 +- .../pages/gsoc/2016}/ideas_juliaastro.md | 17 +- .../content/pages/gsoc/2016}/ideas_sunpy.md | 85 +- .../content/pages/gsoc/2016}/ideas_yt.md | 97 +- .../gsoc}/2017/astropy/astroplan-speed.md | 26 +- .../pages/gsoc}/2017/astropy/astroquery.md | 30 +- .../pages/gsoc}/2017/astropy/astrowidgets.md | 34 +- .../gsoc}/2017/astropy/coord-velocities.md | 22 +- .../pages/gsoc}/2017/astropy/ds9-regions.md | 16 +- .../gsoc}/2017/astropy/fits-table-wcs.md | 28 +- .../content/pages/gsoc}/2017/astropy/hips.md | 28 +- .../pages/gsoc}/2017/astropy/performance.md | 33 +- .../pages/gsoc}/2017/astropy/test-helper.md | 24 +- .../pages/gsoc/2017/casacore/testing.md | 30 + .../content/pages/gsoc}/2017/glue/notebook.md | 17 +- .../content/pages/gsoc/2017}/glue/widgets.md | 27 +- src/content/pages/gsoc/2017/index.md | 5 + .../pages/gsoc}/2017/juliaastro/astrolib.md | 34 +- .../content/pages/gsoc}/2017/sunpy/drms.md | 48 +- .../content/pages/gsoc}/2017/sunpy/iris.md | 79 +- .../pages/gsoc}/2017/sunpy/mag_field.md | 62 +- .../pages/gsoc}/2017/sunpy/realtimesun.md | 28 +- .../content/pages/gsoc}/2017/sunpy/roi.md | 23 +- .../pages/gsoc}/2017/sunpy/sunkit-image.md | 43 +- .../content/pages/gsoc}/2017/sunpy/theme.md | 33 +- .../2018/astropy/astropy-learn-website.md | 52 + .../pages/gsoc}/2018/astropy/astroquery.md | 31 +- .../pages/gsoc}/2018/astropy/astrowidgets.md | 34 +- .../pages/gsoc}/2018/astropy/casa-regions.md | 21 +- .../gsoc}/2018/astropy/ccdproc-optimize.md | 43 +- .../content/pages/gsoc}/2018/astropy/mcmc.md | 50 +- .../gsoc/2018/astropy/sphinx-example-index.md | 55 + .../pages/gsoc/2018/astropy/table-optimize.md | 61 + .../pages/gsoc}/2018/astropy/tutorials.md | 43 +- .../content/pages/gsoc/2018}/glue/widgets.md | 27 +- .../pages/gsoc}/2018/heliopy/heliopy-units.md | 31 +- src/content/pages/gsoc/2018/index.md | 5 + .../gsoc}/2018/juliaastro/astronomicaltime.md | 26 +- .../gsoc}/2018/plasmapy/plasma-object.md | 18 +- .../2018/poliastro/benchmark-propagators.md | 48 +- .../pages/gsoc}/2018/poliastro/export-czml.md | 46 +- .../gsoc}/2018/poliastro/reference-frames.md | 46 +- .../gsoc}/2018/poliastro/web-app-neos.md | 42 +- .../pages/gsoc}/2018/sunpy/mag_field.md | 60 +- .../pages/gsoc}/2018/sunpy/remote_data.md | 38 +- .../content/pages/gsoc}/2018/sunpy/roi.md | 23 +- .../pages/gsoc}/2018/sunpy/sunkit-image.md | 47 +- .../pages/gsoc}/2018/sunpy/time_refactor.md | 39 +- .../content/pages/gsoc}/2018/timelab/XSPEC.md | 83 +- .../pages/gsoc}/2018/timelab/optimize.md | 29 +- .../pages/gsoc}/2018/timelab/quasiperiodic.md | 55 +- .../pages/gsoc}/2019/astropy/astroquery.md | 25 +- .../pages/gsoc}/2019/astropy/astrowidgets.md | 40 +- .../pages/gsoc}/2019/astropy/n-waymatch.md | 17 +- .../pages/gsoc}/2019/astropy/stcs_regions.md | 28 +- .../pages/gsoc/2019/astropy/table-optimize.md | 63 + .../pages/gsoc/2019/astropy/telescopy.md | 50 + .../gsoc}/2019/ctlearn/3d-reconstruction.md | 54 +- .../2019/ctlearn/hexagonal_convolution.md | 50 +- .../pages/gsoc}/2019/ctlearn/optimization.md | 50 +- .../pages/gsoc}/2019/ctlearn/regression.md | 54 +- .../pages/gsoc}/2019/ctlearn/rootinput.md | 50 +- src/content/pages/gsoc/2019/index.md | 5 + .../gsoc}/2019/juliaastro/astroimages.md | 46 +- .../poliastro/earth-specific-capabilities.md | 60 +- .../pages/gsoc}/2019/poliastro/export-czml.md | 46 +- .../2019/poliastro/poliastro-as-a-service.md | 51 +- .../2019/poliastro/validation-framework.md | 63 +- .../pages/gsoc/2019/sunpy/featuresevents.md | 74 + .../pages/gsoc}/2019/sunpy/helioviewer.md | 44 +- .../pages/gsoc}/2019/sunpy/irispy_response.md | 52 +- .../pages/gsoc}/2019/sunpy/mag_field.md | 52 +- .../pages/gsoc}/2019/sunpy/ndcube_ape14.md | 47 +- .../pages/gsoc}/2019/sunpy/remote_data.md | 38 +- .../pages/gsoc}/2019/sunpy/sunkit_image.md | 60 +- .../pages/gsoc}/2019/sunpy/sunspotter.md | 43 +- .../astronomy-commons/spark-jupyter-widget.md | 42 +- .../pages/gsoc}/2020/ctlearn/rootinput.md | 50 +- ...-for-Schwarzschild-and-Kerr-Geometries..md | 98 + .../Performance-Improvements-in-EinsteinPy.md | 82 +- src/content/pages/gsoc/2020/index.md | 5 + .../2020/juliaastro/ccd_data_reduction.md | 28 +- .../poliastro/earth-specific-capabilities.md | 58 +- .../2020/poliastro/poliastro-as-a-service.md | 50 +- .../2020/poliastro/validation-framework.md | 62 +- ...celerate_synthetic_spectra_calculations.md | 71 +- .../radis_atmosphere_calculation_interface.md | 60 + .../pages/gsoc}/2020/stingray/multitaper.md | 38 +- .../pages/gsoc}/2020/stingray/optimize.md | 31 +- .../content/pages/gsoc}/2020/sunpy/fido.md | 27 +- .../pages/gsoc}/2020/sunpy/solarglue.md | 48 +- .../pages/gsoc}/2020/sunpy/sunspotter.md | 45 +- .../pages/gsoc/2021/astropy/astropyCDS.md | 48 + .../pages/gsoc}/2021/gnuastro/astrometry.md | 49 +- .../gsoc}/2021/gnuastro/python-wrapper.md | 51 +- src/content/pages/gsoc/2021/index.md | 5 + .../pages/gsoc}/2021/juliaastro/NOVAS.md | 51 +- .../gsoc}/2021/radis/atmosphere_interface.md | 59 +- .../pages/gsoc}/2021/radis/auto_engine.md | 65 +- .../pages/gsoc}/2021/radis/non_air_diluent.md | 63 +- .../gsoc}/2021/radis/reduce_memory_usage.md | 53 +- .../pages/gsoc}/2021/stingray/daveupdate.md | 41 +- .../2021/stingray/modeling_improvements.md | 40 +- .../pages/gsoc}/2021/stingray/multitaper.md | 35 +- .../pages/gsoc}/2021/stingray/typing.md | 35 +- .../pages/gsoc}/2021/sunpy/3dplotting.md | 37 +- .../gsoc}/2021/sunpy/ndcube_resampling.md | 45 +- .../content/pages/gsoc}/2021/sunpy/scraper.md | 51 +- .../pages/gsoc}/2021/sunpy/sunraster.md | 47 +- .../2022/gnuastro/astrometry_distortions.md | 53 +- .../gsoc}/2022/gnuastro/python_wrappers.md | 49 +- src/content/pages/gsoc/2022/index.md | 5 + .../gsoc}/2022/juliaastro/stingray_porting.md | 56 +- .../gsoc}/2022/radis/atmosphere_interface.md | 63 +- .../pages/gsoc}/2022/radis/non_air_diluent.md | 71 +- .../gsoc/2022/radis/performance_tweaks.md | 73 + .../gsoc}/2022/radis/radis_app_improvement.md | 79 +- .../gsoc}/2022/radis/spectrum_fitting.md | 64 +- .../pages/gsoc}/2022/stingray/bexvar.md | 53 +- .../gsoc/2022/stingray/type_hints_stingray.md | 53 + .../pages/gsoc}/2022/sunpy/database.md | 37 +- .../pages/gsoc}/2022/sunpy/helioviewer.md | 40 +- .../content/pages/gsoc}/2022/sunpy/scraper.md | 32 +- .../content/pages/gsoc}/2022/sunpy/theme.md | 44 +- .../gsoc}/2023/gnuastro/python_wrappers.md | 47 +- src/content/pages/gsoc/2023/index.md | 5 + .../pages/gsoc}/2023/radis/common_api.md | 70 +- .../gsoc}/2023/radis/optimizing_radis_app.md | 59 +- .../2023/radis/out_of_core_calculations.md | 76 + .../gsoc}/2023/stingray/gaussianprocesses.md | 85 +- .../pages/gsoc}/2023/stingray/lombscargle.md | 44 +- .../content/pages/gsoc}/2023/sunpy/hek.md | 32 +- .../content/pages/gsoc}/2023/sunpy/scraper.md | 36 +- .../pages/gsoc}/2023/sunpy/sunkit_image.md | 35 +- .../gsoc}/2024/gnuastro/opencl_integration.md | 58 +- src/content/pages/gsoc/2024/index.md | 5 + .../gsoc}/2024/irsa-fornax/astrodata_DL.md | 48 +- .../2024/irsa-fornax/light_curve_dask.md | 35 +- .../gsoc}/2024/radis/Kurucz_and_commonAPI.md | 67 +- .../pages/gsoc}/2024/stingray/dashboard.md | 52 +- .../pages/gsoc}/2024/sunpy/_3dplotting.md | 38 +- .../content/pages/gsoc}/2024/sunpy/eclipse.md | 38 +- .../content/pages/gsoc}/2024/sunpy/hek.md | 30 +- .../pages/gsoc}/2024/sunpy/ndcube_io.md | 58 +- .../pages/gsoc}/2024/sunpy/sunkit_image.md | 28 +- .../pages/gsoc}/2024/sunpy/sunpy-soar.md | 34 +- src/content/pages/gsoc/2025/index.md | 5 + .../gsoc}/2025/juliaastro/stingray_porting.md | 72 +- .../2025/radis/Exomol_electronic_spectra.md | 63 +- .../pages/gsoc}/2025/radis/Fast_Parsing.md | 56 +- .../gsoc}/2025/radis/Optimizing_Radis_app.md | 46 +- .../2025/stingray/interactive_database.md | 50 +- .../2026/astropy/astropy_core_improvements.md | 53 +- src/content/pages/gsoc/2026/index.md | 5 + .../pages/gsoc}/2026/juliaastro/spectra.md | 41 +- .../gsoc}/2026/juliaastro/stingray_porting.md | 58 +- .../gsoc}/2026/lincc-fw/pyarrow4astro.md | 56 +- .../gsoc}/2026/radis/vaex_alternatives.md | 80 +- .../gsoc}/2026/reltrans/profiling_reltrans.md | 50 +- .../reltrans/tutorial_and_unit-testing.md | 67 +- .../pages/gsoc}/2026/sunpy/radiospectra.md | 29 +- .../content/pages/gsoc/_project_template.md | 39 +- .../content/pages/gsoc}/background.md | 88 +- .../pages/gsoc/contributor_guidelines.md | 107 + src/content/pages/gsoc/index.md | 66 + src/content/pages/gsoc/suborg_guidelines.md | 159 + .../content/posts}/2016-01-15-Workshop.md | 5 +- .../content/posts}/2018-08-14-GSoC.md | 1 - .../content/posts}/2018-09-24-dotastro.md | 1 - .../content/posts}/2019-07-29-pyastro.md | 2 - src/data/gsoc-admins.json | 12 + src/data/icons.json | 8 + src/data/members.json | 297 + src/data/site.json | 18 + src/layouts/BaseLayout.astro | 23 + src/layouts/PageLayout.astro | 16 + src/layouts/PostLayout.astro | 29 + src/layouts/ProjectsLayout.astro | 428 + src/lib/posts.js | 37 + src/lib/relative-paths.js | 22 + src/pages/[...slug].astro | 90 + src/pages/[year]/[month]/[day]/[slug].astro | 28 + src/pages/index.astro | 66 + src/pages/members.astro | 23 + src/pages/news.astro | 71 + tsconfig.json | 3 + 395 files changed, 15815 insertions(+), 32061 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .gitmodules create mode 100644 .markdownlint-cli2.jsonc create mode 100644 .markdownlint.json create mode 100644 .prettierignore create mode 100644 .prettierrc.cjs delete mode 100644 Gemfile delete mode 100644 _config.yml delete mode 100644 _data/icons.yaml delete mode 100644 _data/members.yaml delete mode 100644 _includes/footer.html delete mode 100644 _includes/head.html delete mode 100644 _includes/header.html delete mode 100644 _includes/member.html delete mode 100644 _includes/style.html delete mode 100644 _layouts/default.html delete mode 100644 _layouts/display.html delete mode 100644 _layouts/mission.html delete mode 100644 _layouts/page.html delete mode 100644 _layouts/post.html delete mode 100644 _layouts/projects.html delete mode 100644 _plugins/shuffle.rb delete mode 100644 _projects/2017/casacore/testing.md delete mode 100644 _projects/2018/astropy/astropy-learn-website.md delete mode 100644 _projects/2018/astropy/sphinx-example-index.md delete mode 100644 _projects/2018/astropy/table-optimize.md delete mode 100644 _projects/2019/astropy/table-optimize.md delete mode 100644 _projects/2019/astropy/telescopy.md delete mode 100644 _projects/2019/sunpy/featuresevents.md delete mode 100644 _projects/2020/.gitkeep delete mode 100644 _projects/2020/einsteinpy/Null-geodesics-for-Schwarzschild-and-Kerr-Geometries..md delete mode 100644 _projects/2020/radis/radis_atmosphere_calculation_interface.md delete mode 100644 _projects/2021/.gitkeep delete mode 100644 _projects/2021/astropy/astropyCDS.md delete mode 100644 _projects/2022/.gitkeep delete mode 100644 _projects/2022/astropy/.gitkeep delete mode 100644 _projects/2022/gnuastro/.gitkeep delete mode 100644 _projects/2022/juliaastro/.gitkeep delete mode 100644 _projects/2022/radis/.gitkeep delete mode 100644 _projects/2022/radis/performance_tweaks.md delete mode 100644 _projects/2022/stingray/.gitkeep delete mode 100644 _projects/2022/stingray/type_hints_stingray.md delete mode 100644 _projects/2022/sunpy/.gitkeep delete mode 100644 _projects/2023/.gitkeep delete mode 100644 _projects/2023/radis/out_of_core_calculations.md delete mode 100644 _projects/2023/sunpy/.gitkeep delete mode 100644 _projects/2024/.gitkeep delete mode 100644 _projects/2024/sunpy/.gitkeep delete mode 100644 _projects/2025/.gitkeep delete mode 100644 _projects/2025/sunpy/.gitkeep delete mode 100644 _projects/2026/.gitkeep delete mode 100644 _projects/2026/juliaastro/.gitkeep delete mode 100644 _projects/2026/radis/.gitkeep delete mode 100644 _projects/2026/stingray/.gitkeep delete mode 100644 _projects/2026/sunpy/.gitkeep delete mode 100644 _projects/README.md delete mode 100644 _sass/_base.scss delete mode 100644 _sass/_layout.scss delete mode 100644 _sass/_syntax-highlighting.scss delete mode 160000 _sass/bootstrap-sass-3.3.7 delete mode 100644 _sass/materialize-src/LICENSE delete mode 100644 _sass/materialize-src/README.md delete mode 100644 _sass/materialize-src/sass/components/_badges.scss delete mode 100644 _sass/materialize-src/sass/components/_buttons.scss delete mode 100644 _sass/materialize-src/sass/components/_cards.scss delete mode 100644 _sass/materialize-src/sass/components/_carousel.scss delete mode 100644 _sass/materialize-src/sass/components/_chips.scss delete mode 100644 _sass/materialize-src/sass/components/_collapsible.scss delete mode 100644 _sass/materialize-src/sass/components/_color.scss delete mode 100644 _sass/materialize-src/sass/components/_dropdown.scss delete mode 100644 _sass/materialize-src/sass/components/_global.scss delete mode 100644 _sass/materialize-src/sass/components/_grid.scss delete mode 100644 _sass/materialize-src/sass/components/_icons-material-design.scss delete mode 100644 _sass/materialize-src/sass/components/_materialbox.scss delete mode 100644 _sass/materialize-src/sass/components/_modal.scss delete mode 100644 _sass/materialize-src/sass/components/_navbar.scss delete mode 100644 _sass/materialize-src/sass/components/_normalize.scss delete mode 100644 _sass/materialize-src/sass/components/_preloader.scss delete mode 100644 _sass/materialize-src/sass/components/_pulse.scss delete mode 100644 _sass/materialize-src/sass/components/_roboto.scss delete mode 100644 _sass/materialize-src/sass/components/_sideNav.scss delete mode 100644 _sass/materialize-src/sass/components/_slider.scss delete mode 100644 _sass/materialize-src/sass/components/_table_of_contents.scss delete mode 100644 _sass/materialize-src/sass/components/_tabs.scss delete mode 100644 _sass/materialize-src/sass/components/_tapTarget.scss delete mode 100644 _sass/materialize-src/sass/components/_toast.scss delete mode 100644 _sass/materialize-src/sass/components/_tooltip.scss delete mode 100644 _sass/materialize-src/sass/components/_transitions.scss delete mode 100644 _sass/materialize-src/sass/components/_typography.scss delete mode 100644 _sass/materialize-src/sass/components/_variables.scss delete mode 100644 _sass/materialize-src/sass/components/_waves.scss delete mode 100644 _sass/materialize-src/sass/components/date_picker/_default.date.scss delete mode 100644 _sass/materialize-src/sass/components/date_picker/_default.scss delete mode 100644 _sass/materialize-src/sass/components/date_picker/_default.time.scss delete mode 100644 _sass/materialize-src/sass/components/forms/_checkboxes.scss delete mode 100644 _sass/materialize-src/sass/components/forms/_file-input.scss delete mode 100644 _sass/materialize-src/sass/components/forms/_forms.scss delete mode 100644 _sass/materialize-src/sass/components/forms/_input-fields.scss delete mode 100644 _sass/materialize-src/sass/components/forms/_radio-buttons.scss delete mode 100644 _sass/materialize-src/sass/components/forms/_range.scss delete mode 100644 _sass/materialize-src/sass/components/forms/_select.scss delete mode 100644 _sass/materialize-src/sass/components/forms/_switches.scss delete mode 100644 _sass/materialize-src/sass/materialize.scss create mode 100644 astro.config.mjs delete mode 100644 css/bootstrap/bootstrap-responsive.css delete mode 100644 css/bootstrap/bootstrap.css delete mode 100644 css/bootstrap/img/glyphicons-halflings-white.png delete mode 100644 css/bootstrap/img/glyphicons-halflings.png delete mode 100755 css/main.scss delete mode 100644 css/swc-bootstrap.css delete mode 100644 css/swc.css create mode 100644 eslint.config.mjs delete mode 100644 feed.xml delete mode 100644 gsoc/contributor_guidelines.md delete mode 100644 gsoc/display/LICENSE delete mode 100644 gsoc/display/data/admins.js delete mode 100644 gsoc/display/data/faq.js delete mode 100644 gsoc/display/data/faq/contributor_obligations.md delete mode 100644 gsoc/display/data/faq/gsoc_requirements.md delete mode 100644 gsoc/display/data/faq/i_want_to_do_a_gsoc.md delete mode 100644 gsoc/display/data/faq/own_project_idea.md delete mode 100644 gsoc/display/data/faq/working_out_the_proposal.md delete mode 100644 gsoc/display/data/faq/writing_a_great_proposal.md delete mode 100644 gsoc/display/partials/tabs/faq.html delete mode 100644 gsoc/display/partials/tabs/mentors.html delete mode 100644 gsoc/display/partials/tabs/projects.html delete mode 100644 gsoc/display/resources/css/style.scss delete mode 100644 gsoc/display/resources/js/app.js delete mode 100644 gsoc/display/vendors/angular-sanitize/angular-sanitize.js delete mode 100644 gsoc/display/vendors/markdown/markdown.js delete mode 100644 gsoc/display/vendors/showdown/showdown.js delete mode 100644 gsoc/gsoc2015/ideas.md delete mode 100644 gsoc/gsoc2016/ideas.md delete mode 100644 gsoc/gsoc2017/index.md delete mode 100644 gsoc/gsoc2018/index.md delete mode 100644 gsoc/gsoc2019/index.md delete mode 100644 gsoc/gsoc2020/index.md delete mode 100644 gsoc/gsoc2021/index.md delete mode 100644 gsoc/gsoc2022/index.md delete mode 100644 gsoc/gsoc2023/index.md delete mode 100644 gsoc/gsoc2024/index.md delete mode 100644 gsoc/gsoc2025/index.md delete mode 100644 gsoc/gsoc2026/index.md delete mode 100644 gsoc/index.md delete mode 100644 gsoc/suborg_guidelines.md delete mode 100644 img/icons/cgit.png delete mode 100644 img/logo/logoOA.png delete mode 100644 img/logo/logoOA.svg delete mode 100644 img/logo/logoOA_embed.svg delete mode 100644 img/members/casacore.svg delete mode 100644 img/members/gnuastro.svg delete mode 100644 img/members/heliopy.png delete mode 100644 img/members/juliaastro.svg delete mode 100644 img/members/sherpa_logo.gif delete mode 100644 index.md create mode 100644 linkcheck.skip.txt rename {img/logo => logo_source}/logoOA.xcf (100%) delete mode 100644 members.md delete mode 100644 news.md create mode 100644 package-lock.json create mode 100644 package.json rename CNAME => public/CNAME (100%) create mode 100644 public/css/astro-overrides.css rename {img => public/img}/IMG_20160111_094506.jpg (100%) rename img/logo/logoOA_svg.png => public/og/openastronomy-og.png (100%) create mode 100644 scripts/linkcheck.mjs rename {css => src/assets/background}/background_ap.jpg (100%) rename {css => src/assets/background}/background_sp.jpg (100%) rename {img/icons => src/assets}/discourse_icon.png (100%) create mode 100644 src/assets/logoOA.png rename img/logo/logoOA_white_svg.png => src/assets/logoOA_white.png (100%) rename {img => src/assets}/members/astronomy-commons.png (100%) rename {img => src/assets}/members/astropy.png (100%) create mode 100644 src/assets/members/casacore.png rename {img => src/assets}/members/chiantipy.png (100%) rename {img => src/assets}/members/coin.png (100%) rename {img => src/assets}/members/ctlearn.png (100%) rename {img => src/assets}/members/einsteinpy.png (100%) rename {img => src/assets}/members/glue.png (100%) create mode 100644 src/assets/members/gnuastro.png rename {img => src/assets}/members/ims.png (100%) create mode 100644 src/assets/members/juliaastro.png rename {img => src/assets}/members/lincc-frameworks.png (100%) rename {img => src/assets}/members/plasmapy.png (100%) rename {img => src/assets}/members/poliastro.png (100%) rename {img => src/assets}/members/radis_ico.png (100%) rename {img => src/assets}/members/reltrans_logo.png (100%) create mode 100644 src/assets/members/sherpa_logo.png rename {img => src/assets}/members/stingray_logo.png (100%) rename {img => src/assets}/members/sunpy.png (100%) rename {img => src/assets}/members/yt.png (100%) create mode 100644 src/components/Footer.astro create mode 100644 src/components/Head.astro create mode 100644 src/components/Header.astro create mode 100644 src/components/MemberCard.astro create mode 100644 src/content/config.ts create mode 100644 src/content/pages/gsoc/2015/ideas.md rename {gsoc/gsoc2015 => src/content/pages/gsoc/2015}/ideas_astropy.md (68%) rename {gsoc/gsoc2015 => src/content/pages/gsoc/2015}/ideas_astropy_affiliated.md (65%) rename {gsoc/gsoc2015 => src/content/pages/gsoc/2015}/ideas_chiantipy.md (50%) rename {gsoc/gsoc2015 => src/content/pages/gsoc/2015}/ideas_sunpy.md (79%) rename {gsoc/gsoc2015 => src/content/pages/gsoc/2015}/ideas_yt.md (56%) create mode 100644 src/content/pages/gsoc/2016/ideas.md rename {gsoc/gsoc2016 => src/content/pages/gsoc/2016}/ideas_astropy.md (63%) rename {gsoc/gsoc2016 => src/content/pages/gsoc/2016}/ideas_casacore.md (62%) rename {gsoc/gsoc2016 => src/content/pages/gsoc/2016}/ideas_eras.md (69%) rename {gsoc/gsoc2016 => src/content/pages/gsoc/2016}/ideas_juliaastro.md (81%) rename {gsoc/gsoc2016 => src/content/pages/gsoc/2016}/ideas_sunpy.md (87%) rename {gsoc/gsoc2016 => src/content/pages/gsoc/2016}/ideas_yt.md (72%) rename {_projects => src/content/pages/gsoc}/2017/astropy/astroplan-speed.md (84%) rename {_projects => src/content/pages/gsoc}/2017/astropy/astroquery.md (80%) rename {_projects => src/content/pages/gsoc}/2017/astropy/astrowidgets.md (71%) rename {_projects => src/content/pages/gsoc}/2017/astropy/coord-velocities.md (75%) rename {_projects => src/content/pages/gsoc}/2017/astropy/ds9-regions.md (90%) rename {_projects => src/content/pages/gsoc}/2017/astropy/fits-table-wcs.md (73%) rename {_projects => src/content/pages/gsoc}/2017/astropy/hips.md (86%) rename {_projects => src/content/pages/gsoc}/2017/astropy/performance.md (78%) rename {_projects => src/content/pages/gsoc}/2017/astropy/test-helper.md (82%) create mode 100644 src/content/pages/gsoc/2017/casacore/testing.md rename {_projects => src/content/pages/gsoc}/2017/glue/notebook.md (87%) rename {_projects/2018 => src/content/pages/gsoc/2017}/glue/widgets.md (54%) create mode 100644 src/content/pages/gsoc/2017/index.md rename {_projects => src/content/pages/gsoc}/2017/juliaastro/astrolib.md (74%) rename {_projects => src/content/pages/gsoc}/2017/sunpy/drms.md (69%) rename {_projects => src/content/pages/gsoc}/2017/sunpy/iris.md (53%) rename {_projects => src/content/pages/gsoc}/2017/sunpy/mag_field.md (65%) rename {_projects => src/content/pages/gsoc}/2017/sunpy/realtimesun.md (72%) rename {_projects => src/content/pages/gsoc}/2017/sunpy/roi.md (87%) rename {_projects => src/content/pages/gsoc}/2017/sunpy/sunkit-image.md (74%) rename {_projects => src/content/pages/gsoc}/2017/sunpy/theme.md (73%) create mode 100644 src/content/pages/gsoc/2018/astropy/astropy-learn-website.md rename {_projects => src/content/pages/gsoc}/2018/astropy/astroquery.md (80%) rename {_projects => src/content/pages/gsoc}/2018/astropy/astrowidgets.md (73%) rename {_projects => src/content/pages/gsoc}/2018/astropy/casa-regions.md (88%) rename {_projects => src/content/pages/gsoc}/2018/astropy/ccdproc-optimize.md (59%) rename {_projects => src/content/pages/gsoc}/2018/astropy/mcmc.md (65%) create mode 100644 src/content/pages/gsoc/2018/astropy/sphinx-example-index.md create mode 100644 src/content/pages/gsoc/2018/astropy/table-optimize.md rename {_projects => src/content/pages/gsoc}/2018/astropy/tutorials.md (53%) rename {_projects/2017 => src/content/pages/gsoc/2018}/glue/widgets.md (54%) rename {_projects => src/content/pages/gsoc}/2018/heliopy/heliopy-units.md (69%) create mode 100644 src/content/pages/gsoc/2018/index.md rename {_projects => src/content/pages/gsoc}/2018/juliaastro/astronomicaltime.md (83%) rename {_projects => src/content/pages/gsoc}/2018/plasmapy/plasma-object.md (85%) rename {_projects => src/content/pages/gsoc}/2018/poliastro/benchmark-propagators.md (60%) rename {_projects => src/content/pages/gsoc}/2018/poliastro/export-czml.md (56%) rename {_projects => src/content/pages/gsoc}/2018/poliastro/reference-frames.md (64%) rename {_projects => src/content/pages/gsoc}/2018/poliastro/web-app-neos.md (66%) rename {_projects => src/content/pages/gsoc}/2018/sunpy/mag_field.md (65%) rename {_projects => src/content/pages/gsoc}/2018/sunpy/remote_data.md (61%) rename {_projects => src/content/pages/gsoc}/2018/sunpy/roi.md (87%) rename {_projects => src/content/pages/gsoc}/2018/sunpy/sunkit-image.md (62%) rename {_projects => src/content/pages/gsoc}/2018/sunpy/time_refactor.md (68%) rename {_projects => src/content/pages/gsoc}/2018/timelab/XSPEC.md (66%) rename {_projects => src/content/pages/gsoc}/2018/timelab/optimize.md (75%) rename {_projects => src/content/pages/gsoc}/2018/timelab/quasiperiodic.md (61%) rename {_projects => src/content/pages/gsoc}/2019/astropy/astroquery.md (81%) rename {_projects => src/content/pages/gsoc}/2019/astropy/astrowidgets.md (70%) rename {_projects => src/content/pages/gsoc}/2019/astropy/n-waymatch.md (86%) rename {_projects => src/content/pages/gsoc}/2019/astropy/stcs_regions.md (77%) create mode 100644 src/content/pages/gsoc/2019/astropy/table-optimize.md create mode 100644 src/content/pages/gsoc/2019/astropy/telescopy.md rename {_projects => src/content/pages/gsoc}/2019/ctlearn/3d-reconstruction.md (69%) rename {_projects => src/content/pages/gsoc}/2019/ctlearn/hexagonal_convolution.md (62%) rename {_projects => src/content/pages/gsoc}/2019/ctlearn/optimization.md (61%) rename {_projects => src/content/pages/gsoc}/2019/ctlearn/regression.md (62%) rename {_projects => src/content/pages/gsoc}/2019/ctlearn/rootinput.md (63%) create mode 100644 src/content/pages/gsoc/2019/index.md rename {_projects => src/content/pages/gsoc}/2019/juliaastro/astroimages.md (65%) rename {_projects => src/content/pages/gsoc}/2019/poliastro/earth-specific-capabilities.md (54%) rename {_projects => src/content/pages/gsoc}/2019/poliastro/export-czml.md (56%) rename {_projects => src/content/pages/gsoc}/2019/poliastro/poliastro-as-a-service.md (61%) rename {_projects => src/content/pages/gsoc}/2019/poliastro/validation-framework.md (54%) create mode 100644 src/content/pages/gsoc/2019/sunpy/featuresevents.md rename {_projects => src/content/pages/gsoc}/2019/sunpy/helioviewer.md (58%) rename {_projects => src/content/pages/gsoc}/2019/sunpy/irispy_response.md (59%) rename {_projects => src/content/pages/gsoc}/2019/sunpy/mag_field.md (67%) rename {_projects => src/content/pages/gsoc}/2019/sunpy/ndcube_ape14.md (56%) rename {_projects => src/content/pages/gsoc}/2019/sunpy/remote_data.md (62%) rename {_projects => src/content/pages/gsoc}/2019/sunpy/sunkit_image.md (53%) rename {_projects => src/content/pages/gsoc}/2019/sunpy/sunspotter.md (68%) rename {_projects => src/content/pages/gsoc}/2020/astronomy-commons/spark-jupyter-widget.md (67%) rename {_projects => src/content/pages/gsoc}/2020/ctlearn/rootinput.md (63%) create mode 100644 src/content/pages/gsoc/2020/einsteinpy/Null-geodesics-for-Schwarzschild-and-Kerr-Geometries..md rename {_projects => src/content/pages/gsoc}/2020/einsteinpy/Performance-Improvements-in-EinsteinPy.md (60%) create mode 100644 src/content/pages/gsoc/2020/index.md rename {_projects => src/content/pages/gsoc}/2020/juliaastro/ccd_data_reduction.md (71%) rename {_projects => src/content/pages/gsoc}/2020/poliastro/earth-specific-capabilities.md (54%) rename {_projects => src/content/pages/gsoc}/2020/poliastro/poliastro-as-a-service.md (61%) rename {_projects => src/content/pages/gsoc}/2020/poliastro/validation-framework.md (56%) rename {_projects => src/content/pages/gsoc}/2020/radis/accelerate_synthetic_spectra_calculations.md (58%) create mode 100644 src/content/pages/gsoc/2020/radis/radis_atmosphere_calculation_interface.md rename {_projects => src/content/pages/gsoc}/2020/stingray/multitaper.md (71%) rename {_projects => src/content/pages/gsoc}/2020/stingray/optimize.md (71%) rename {_projects => src/content/pages/gsoc}/2020/sunpy/fido.md (83%) rename {_projects => src/content/pages/gsoc}/2020/sunpy/solarglue.md (73%) rename {_projects => src/content/pages/gsoc}/2020/sunpy/sunspotter.md (68%) create mode 100644 src/content/pages/gsoc/2021/astropy/astropyCDS.md rename {_projects => src/content/pages/gsoc}/2021/gnuastro/astrometry.md (59%) rename {_projects => src/content/pages/gsoc}/2021/gnuastro/python-wrapper.md (62%) create mode 100644 src/content/pages/gsoc/2021/index.md rename {_projects => src/content/pages/gsoc}/2021/juliaastro/NOVAS.md (58%) rename {_projects => src/content/pages/gsoc}/2021/radis/atmosphere_interface.md (56%) rename {_projects => src/content/pages/gsoc}/2021/radis/auto_engine.md (56%) rename {_projects => src/content/pages/gsoc}/2021/radis/non_air_diluent.md (62%) rename {_projects => src/content/pages/gsoc}/2021/radis/reduce_memory_usage.md (56%) rename {_projects => src/content/pages/gsoc}/2021/stingray/daveupdate.md (72%) rename {_projects => src/content/pages/gsoc}/2021/stingray/modeling_improvements.md (69%) rename {_projects => src/content/pages/gsoc}/2021/stingray/multitaper.md (71%) rename {_projects => src/content/pages/gsoc}/2021/stingray/typing.md (67%) rename {_projects => src/content/pages/gsoc}/2021/sunpy/3dplotting.md (61%) rename {_projects => src/content/pages/gsoc}/2021/sunpy/ndcube_resampling.md (67%) rename {_projects => src/content/pages/gsoc}/2021/sunpy/scraper.md (63%) rename {_projects => src/content/pages/gsoc}/2021/sunpy/sunraster.md (64%) rename {_projects => src/content/pages/gsoc}/2022/gnuastro/astrometry_distortions.md (57%) rename {_projects => src/content/pages/gsoc}/2022/gnuastro/python_wrappers.md (64%) create mode 100644 src/content/pages/gsoc/2022/index.md rename {_projects => src/content/pages/gsoc}/2022/juliaastro/stingray_porting.md (58%) rename {_projects => src/content/pages/gsoc}/2022/radis/atmosphere_interface.md (56%) rename {_projects => src/content/pages/gsoc}/2022/radis/non_air_diluent.md (62%) create mode 100644 src/content/pages/gsoc/2022/radis/performance_tweaks.md rename {_projects => src/content/pages/gsoc}/2022/radis/radis_app_improvement.md (52%) rename {_projects => src/content/pages/gsoc}/2022/radis/spectrum_fitting.md (53%) rename {_projects => src/content/pages/gsoc}/2022/stingray/bexvar.md (61%) create mode 100644 src/content/pages/gsoc/2022/stingray/type_hints_stingray.md rename {_projects => src/content/pages/gsoc}/2022/sunpy/database.md (77%) rename {_projects => src/content/pages/gsoc}/2022/sunpy/helioviewer.md (69%) rename {_projects => src/content/pages/gsoc}/2022/sunpy/scraper.md (76%) rename {_projects => src/content/pages/gsoc}/2022/sunpy/theme.md (64%) rename {_projects => src/content/pages/gsoc}/2023/gnuastro/python_wrappers.md (69%) create mode 100644 src/content/pages/gsoc/2023/index.md rename {_projects => src/content/pages/gsoc}/2023/radis/common_api.md (63%) rename {_projects => src/content/pages/gsoc}/2023/radis/optimizing_radis_app.md (72%) create mode 100644 src/content/pages/gsoc/2023/radis/out_of_core_calculations.md rename {_projects => src/content/pages/gsoc}/2023/stingray/gaussianprocesses.md (56%) rename {_projects => src/content/pages/gsoc}/2023/stingray/lombscargle.md (58%) rename {_projects => src/content/pages/gsoc}/2023/sunpy/hek.md (76%) rename {_projects => src/content/pages/gsoc}/2023/sunpy/scraper.md (73%) rename {_projects => src/content/pages/gsoc}/2023/sunpy/sunkit_image.md (77%) rename {_projects => src/content/pages/gsoc}/2024/gnuastro/opencl_integration.md (64%) create mode 100644 src/content/pages/gsoc/2024/index.md rename {_projects => src/content/pages/gsoc}/2024/irsa-fornax/astrodata_DL.md (70%) rename {_projects => src/content/pages/gsoc}/2024/irsa-fornax/light_curve_dask.md (80%) rename {_projects => src/content/pages/gsoc}/2024/radis/Kurucz_and_commonAPI.md (66%) rename {_projects => src/content/pages/gsoc}/2024/stingray/dashboard.md (71%) rename {_projects => src/content/pages/gsoc}/2024/sunpy/_3dplotting.md (57%) rename {_projects => src/content/pages/gsoc}/2024/sunpy/eclipse.md (70%) rename {_projects => src/content/pages/gsoc}/2024/sunpy/hek.md (79%) rename {_projects => src/content/pages/gsoc}/2024/sunpy/ndcube_io.md (78%) rename {_projects => src/content/pages/gsoc}/2024/sunpy/sunkit_image.md (79%) rename {_projects => src/content/pages/gsoc}/2024/sunpy/sunpy-soar.md (82%) create mode 100644 src/content/pages/gsoc/2025/index.md rename {_projects => src/content/pages/gsoc}/2025/juliaastro/stingray_porting.md (53%) rename {_projects => src/content/pages/gsoc}/2025/radis/Exomol_electronic_spectra.md (56%) rename {_projects => src/content/pages/gsoc}/2025/radis/Fast_Parsing.md (62%) rename {_projects => src/content/pages/gsoc}/2025/radis/Optimizing_Radis_app.md (84%) rename {_projects => src/content/pages/gsoc}/2025/stingray/interactive_database.md (78%) rename {_projects => src/content/pages/gsoc}/2026/astropy/astropy_core_improvements.md (71%) create mode 100644 src/content/pages/gsoc/2026/index.md rename {_projects => src/content/pages/gsoc}/2026/juliaastro/spectra.md (82%) rename {_projects => src/content/pages/gsoc}/2026/juliaastro/stingray_porting.md (60%) rename {_projects => src/content/pages/gsoc}/2026/lincc-fw/pyarrow4astro.md (72%) rename {_projects => src/content/pages/gsoc}/2026/radis/vaex_alternatives.md (67%) rename {_projects => src/content/pages/gsoc}/2026/reltrans/profiling_reltrans.md (64%) rename {_projects => src/content/pages/gsoc}/2026/reltrans/tutorial_and_unit-testing.md (65%) rename {_projects => src/content/pages/gsoc}/2026/sunpy/radiospectra.md (89%) rename _projects/_template.md => src/content/pages/gsoc/_project_template.md (74%) rename {gsoc => src/content/pages/gsoc}/background.md (50%) create mode 100644 src/content/pages/gsoc/contributor_guidelines.md create mode 100644 src/content/pages/gsoc/index.md create mode 100644 src/content/pages/gsoc/suborg_guidelines.md rename {_posts => src/content/posts}/2016-01-15-Workshop.md (93%) rename {_posts => src/content/posts}/2018-08-14-GSoC.md (91%) rename {_posts => src/content/posts}/2018-09-24-dotastro.md (94%) rename {_posts => src/content/posts}/2019-07-29-pyastro.md (95%) create mode 100644 src/data/gsoc-admins.json create mode 100644 src/data/icons.json create mode 100644 src/data/members.json create mode 100644 src/data/site.json create mode 100644 src/layouts/BaseLayout.astro create mode 100644 src/layouts/PageLayout.astro create mode 100644 src/layouts/PostLayout.astro create mode 100644 src/layouts/ProjectsLayout.astro create mode 100644 src/lib/posts.js create mode 100644 src/lib/relative-paths.js create mode 100644 src/pages/[...slug].astro create mode 100644 src/pages/[year]/[month]/[day]/[slug].astro create mode 100644 src/pages/index.astro create mode 100644 src/pages/members.astro create mode 100644 src/pages/news.astro create mode 100644 tsconfig.json diff --git a/.circleci/config.yml b/.circleci/config.yml index 95869ec9..08f0c403 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,96 +1,22 @@ -# Ruby CircleCI 2.0 configuration file -# -# Check https://circleci.com/docs/2.0/language-ruby/ for more details -# -version: 2 +version: 2.1 jobs: build: docker: - # specify the version you desire here - - image: cimg/ruby:2.5 - environment: - BUNDLE_PATH: ~/vendor/bundle - + - image: cimg/node:lts working_directory: ~/repo - steps: - checkout - run: - name: a merge PR - command: | - if [[ -n "${CIRCLE_PR_NUMBER}" ]]; then - git fetch origin +refs/pull/$CIRCLE_PR_NUMBER/merge:pr/$CIRCLE_PR_NUMBER/merge - git checkout -qf pr/$CIRCLE_PR_NUMBER/merge - fi - - - run: - name: fetch submodules - command: git submodule init && git submodule update - - # Download and cache dependencies - - restore_cache: - keys: - - rubygems-v1-latest - - - run: - name: install dependencies - command: bundle check || bundle install --jobs=4 --retry=3 - - - run: - name: Jekyll build - command: bundle exec jekyll build -d html 2> std.err - - - run: - name: Check Jekyll build - command: | - cat std.err - exit $(wc -l std.err | awk '{print $1}') - - - run: - name: HTMLProofer tests - command: | - bundle exec htmlproofer ./html \ - --allow-hash-href \ - --check-html \ - --disable-external \ - --file-ignore "/.+\/gsoc\/display\/partials.+/" - # Ignores the path for the angular magic - - - run: - name: HTMLProofer with external - command: | - if [ "${CIRCLE_BRANCH}" = "main" ]; then - bundle exec htmlproofer ./html \ - --allow-hash-href \ - --check-html \ - --file-ignore "/.+\/gsoc\/display\/partials.+/","/.+\/gsoc\/gsoc201[5-9].+/","/.+\/html/projects/201[5-9].+/","/.+\/gsoc\/gsoc202[0-2].+/","/.+\/html/projects/202[0-2].+/" \ - --http-status-ignore 302 - # Ignore old ideas pages and ssl certificates that error. - fi - - - - run: - name: Jekyll re-build for local - command: | - echo "url: https://output.circle-artifacts.com" > circle.yml - bundle exec jekyll build -d html -b "/output/job/${CIRCLE_WORKFLOW_JOB_ID}/artifacts/0/html" --config _config.yml,circle.yml - find ./html/ -type f -iname '*html' | xargs -I{} sed -i \ - -e 's|href="\(\.\/.*\/\)"|href="\1index.html"|g' \ - -e '/0\/html/ s|href="\(\/.*\/\)"|href="\1index.html"|g' {} - # Replace pages ending on `/` from our site to direct to index.html - - + name: Install dependencies + command: npm install - run: - name: "Built documentation is available at:" - command: DOCS_URL="${CIRCLE_BUILD_URL}/artifacts/${CIRCLE_NODE_INDEX}/html/index.html"; echo $DOCS_URL - - - - save_cache: - paths: - - ~/vendor/bundle - key: rubygems-v1-latest - - # collect reports + name: Astro build + command: npm run build - store_artifacts: path: ~/repo/html destination: html + +workflows: + build_website: + jobs: + - build diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..24753691 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,76 @@ +name: Lint and Link Checks + +on: + pull_request: + push: + +permissions: + contents: read + +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + quality: + name: Format, lint, and Astro checks + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: npm + - name: Install dependencies + run: npm ci + - name: Run format and autofix steps + run: | + npm run format + npm run lint:fix + npm run lint:md:fix + - name: Ensure formatting and fixes are committed + run: | + if ! git diff --quiet; then + echo "Formatting/lint fixes produced changes. Please run:"; + echo " npm run format"; + echo " npm run lint:fix"; + echo " npm run lint:md:fix"; + echo "and commit the results." + git --no-pager diff --stat + exit 1 + fi + - name: Check formatting + run: npm run format:check + - name: Lint source + run: npm run lint + - name: Lint Markdown + run: npm run lint:md + - name: Astro checks + run: npm run astro:check + + linkcheck: + name: Link check (${{ matrix.mode }}) + runs-on: ubuntu-latest + needs: quality + strategy: + fail-fast: false + matrix: + mode: + - internal + - external + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: npm + - name: Install dependencies + run: npm ci + - name: Build site + run: npm run build + - name: Run link checks + run: npm run linkcheck:${{ matrix.mode }} diff --git a/.gitignore b/.gitignore index b2db9248..13f4b674 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,10 @@ -*~ _site/ -.sass-cache/ -Gemfile.lock -vendor/ +.astro/ .bundle .history +.sass-cache/ +*~ +dist/ +html/ +node_modules/ +vendor/ \ No newline at end of file diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index c4c4ea9c..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "_sass/bootstrap-sass-3.3.7"] - path = _sass/bootstrap-sass-3.3.7 - url = https://github.com/twbs/bootstrap-sass.git diff --git a/.markdownlint-cli2.jsonc b/.markdownlint-cli2.jsonc new file mode 100644 index 00000000..fd81fe83 --- /dev/null +++ b/.markdownlint-cli2.jsonc @@ -0,0 +1,4 @@ +{ + "globs": ["**/*.{md,mdx}"], + "ignores": ["**/node_modules/**", "**/html/**", "**/.history/**"], +} diff --git a/.markdownlint.json b/.markdownlint.json new file mode 100644 index 00000000..6bb69e89 --- /dev/null +++ b/.markdownlint.json @@ -0,0 +1,11 @@ +{ + "MD013": false, + "MD033": false, + "MD041": false, + "MD024": { + "siblings_only": true + }, + "MD025": { + "front_matter_title": "" + } +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..5ccff1a6 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +html/ diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 00000000..db37c613 --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,11 @@ +module.exports = { + plugins: ["prettier-plugin-astro"], + overrides: [ + { + files: "*.astro", + options: { + parser: "astro", + }, + }, + ], +}; diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 1facff24..00000000 --- a/Gemfile +++ /dev/null @@ -1,8 +0,0 @@ -source 'https://rubygems.org' - -require 'json' -require 'open-uri' -versions = JSON.parse(open('https://pages.github.com/versions.json').read) - -gem 'github-pages', group: :jekyll_plugins -gem 'html-proofer' diff --git a/LICENSE b/LICENSE index 391dce8a..5fea4424 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2015, OpenAstronomy +Copyright (c) 2015-206, OpenAstronomy All rights reserved. Redistribution and use in source and binary forms, with or without @@ -21,4 +21,3 @@ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/README.md b/README.md index bed34284..a17eb3ee 100644 --- a/README.md +++ b/README.md @@ -1,62 +1,99 @@ -### About +# openastronomy.github.io -This is the source for the openastronomy.github.io website. +This is the source code for the openastronomy.org website. -### Building +## Building -To build the site locally, you will need [jekyll](https://jekyllrb.com) to be installed. -Clone this repository locally, then inside it, type: +Requirements: + +- [Node.js](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) + +Install dependencies + +```shell +npm install +``` + +Build the website and output to a `html` folder + +```shell +npm run build +``` + +Run the dev server ```shell -gem install bundler -bundler install +npm run dev ``` -Depending on your Ruby setup this may require superuser privileges to install to the default location, so you may want to instead use: + +Preview the production build ```shell +npm run preview +``` + +### Formatting and linting -gem install -i vendor/bundle bundler -bundle config --local path 'vendor/bundle' -bundle install +Format the codebase +```shell +npm run format ``` -to install the dependencies locally at `vendor/bundle`. +Run ESLint -You can then build the website with: +```shell +npm run lint +``` + +Auto-fix Markdown formatting issues (where supported) ```shell -bundle exec jekyll build +npm run lint:md:fix ``` -To view the site locally, you will then need to run: +Run Astro's type/content checks ```shell -bundle exec jekyll serve +npm run astro:check ``` -this will track the changes and rebuild automatically. However, it won't reflect changes on `_config.yaml` +### CI + +- GitHub Actions (`.github/workflows/ci.yml`) runs linting, markdown lint, Astro checks, and link checks. +- CircleCI (`.circleci/config.yml`) is kept for website build artifacts (`html/`) preview. +### Link checks -### Building using a Jekyll container +We can check both internal links + anchors and external links using a script. -```bash -mkdir -p ../vendor/bundle # so it's available for other projects -export JEKYLL_VERSION=3.8 -# only needs to run it once to download the dependencies -docker run --rm -e BUNDLE_APP_CONFIG="/srv/vendor/bundle" -e BUNDLE_HOME="/srv/vendor/bundle" -e BUNDLE_PATH="/srv/vendor/bundle" --volume="$PWD:/srv/jekyll" --volume="$PWD/../vendor:/srv/vendor" -it jekyll/jekyll:$JEKYLL_VERSION bundle install -# build -docker run --rm -e BUNDLE_APP_CONFIG="/srv/vendor/bundle" -e BUNDLE_HOME="/srv/vendor/bundle" -e BUNDLE_PATH="/srv/vendor/bundle" --volume="$PWD:/srv/jekyll" --volume="$PWD/../vendor:/srv/vendor" -it jekyll/jekyll:$JEKYLL_VERSION bundle exec jekyll build -# serve from python -python -m http.server -d _site +However, this first requies the website to be built + +```shell +npm run build ``` -### Submodule +Then for internal links + +```shell +npm run linkcheck:internal +``` -Note that this uses a submodule to complete the build process of the site. So you may need to do: +Then for external links ```shell -git submodule init -git submodule update +npm run linkcheck:external ``` -in a fresh clone, or just the second line to update the submodule. + +If there are sites you need to skip, you can add regex patterns (one per line) in `linkcheck.skip.txt` + +There are also two environmental variables: + +- `LINKCHECK_ROOT=...` to point at a different build folder +- `LINKCHECK_TIMEOUT=...` in ms for external checks + +### Structure + +- `public/` contains static assets (CSS, images, CNAME, etc) +- `src/content/` contains posts and Markdown page content (`pages/`), including GSoC pages and projects +- `src/pages/` contains route handlers/components (Astro files) diff --git a/_config.yml b/_config.yml deleted file mode 100644 index a7050613..00000000 --- a/_config.yml +++ /dev/null @@ -1,49 +0,0 @@ -# Site settings -title: OpenAstronomy -email: openastronomy@googlegroups.com -description: > # this means to ignore newlines until "baseurl:" - Where all about the combined force of different open source projects - in astronomy and astrophysics takes place. -baseurl: "" # the subpath of your site, e.g. /blog/ -url: "https://openastronomy.org" # the base hostname & protocol for your site -#url: "http://localhost:4000" # the base hostname & protocol for your site -twitter_username: Open_Astronomy -github_username: openastronomy -irc_channel: openastronomy -discussiongroup_url: "https://groups.google.com/forum/#!forum/openastronomy" -include: [".well-known"] - -# Extra Nav Links -nav_links: - Contributor Blogs: http://openastronomy.org/Universe_OA - PyAstro Conference: http://openastronomy.org/pyastro - Events Calendar: https://calendar.google.com/calendar/b/1?cid=YmxoZzd0MG9zbjhscm50ZDcwOXFoZzFtaXNAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ - -# Build settings -markdown: kramdown - -kramdown: - hard_wrap: false - input: GFM - -irc_freenode: irc://irc.freenode.net/ - -collections: - projects: - output: true -defaults: - - scope: - path: "" - type: projects - values: - layout: -exclude: - - Gemfile - - Gemfile.lock - - node_modules - - vendor/bundle/ - - vendor/cache/ - - vendor/gems/ - - vendor/ruby/ - - _projects/_template.md - - _projects/README.md diff --git a/_data/icons.yaml b/_data/icons.yaml deleted file mode 100644 index 4c28dc9f..00000000 --- a/_data/icons.yaml +++ /dev/null @@ -1,34 +0,0 @@ -gh_logo: >- - M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 - c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 - c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 - c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 - C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 - c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 - c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 - c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 - c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z - -bb_logo: >- - M29.208,3.519c-0.203-0.285-0.451-0.525-0.729-0.738c-0.61-0.475-1.297-0.814-2.01-1.102c-1.516-0.611-3.097-0.971-4.701-1.229C19.81,0.137,17.836,0.012,15.762,0c-1.854,0.016-3.797,0.133-5.725,0.434C8.668,0.649,7.316,0.94,6.002,1.385c-0.869,0.297-1.71,0.649-2.477,1.164C3.16,2.793,2.824,3.07,2.549,3.418C2.205,3.856,2.058,4.344,2.147,4.897C2.32,5.989,2.48,7.082,2.66,8.169c0.264,1.611,0.537,3.222,0.811,4.828c0.306,1.787,0.62,3.573,0.918,5.36c0.07,0.416,0.246,0.769,0.526,1.07c0.179,0.193,0.37,0.377,0.574,0.543c0.73,0.59,1.562,1.01,2.432,1.354c2.082,0.83,4.259,1.205,6.485,1.328c1.616,0.09,3.23,0.033,4.838-0.187c1.369-0.185,2.709-0.479,4.011-0.948c0.965-0.349,1.891-0.775,2.725-1.382c0.355-0.26,0.683-0.547,0.945-0.901c0.181-0.238,0.305-0.504,0.354-0.805c0.397-2.341,0.809-4.679,1.196-7.021c0.362-2.172,0.701-4.346,1.058-6.518C29.617,4.388,29.502,3.935,29.208,3.519z - M15.82,19.64c-2.4-0.008-4.341-1.971-4.333-4.383c0.006-2.41,1.958-4.347,4.369-4.338c2.425,0.008,4.359,1.961,4.35,4.387C20.195,17.704,18.227,19.648,15.82,19.64z - M24.522,4.394c-0.124,0.139-0.274,0.262-0.436,0.357c-0.45,0.268-0.951,0.409-1.454,0.541c-0.952,0.243-1.923,0.383-2.896,0.485c-1.281,0.136-2.565,0.183-3.791,0.188c-1.49-0.008-2.914-0.068-4.332-0.238c-1.064-0.129-2.124-0.291-3.146-0.633C8.164,4.99,7.869,4.858,7.584,4.713C7.438,4.641,7.309,4.528,7.198,4.409c-0.197-0.215-0.196-0.45,0.005-0.663C7.32,3.621,7.463,3.514,7.61,3.43C8.034,3.184,8.5,3.041,8.969,2.918c0.983-0.256,1.985-0.402,2.994-0.509c1.652-0.17,3.308-0.221,4.967-0.172c1.524,0.045,3.045,0.158,4.55,0.431c0.706,0.127,1.407,0.274,2.075,0.545c0.236,0.096,0.463,0.217,0.683,0.346c0.109,0.064,0.208,0.164,0.288,0.266C24.668,4.007,24.674,4.222,24.522,4.394z - M26.186,22.761c0.009,0.088-0.004,0.183-0.021,0.271c-0.305,1.604-0.614,3.205-0.911,4.811c-0.101,0.539-0.344,0.99-0.724,1.377c-0.422,0.432-0.918,0.752-1.448,1.023c-0.979,0.498-2.018,0.811-3.085,1.031c-1.377,0.286-2.771,0.414-3.563,0.407c-2.41-0.006-4.184-0.198-5.917-0.698c-0.802-0.23-1.577-0.529-2.3-0.953c-0.379-0.222-0.732-0.478-1.042-0.789c-0.388-0.392-0.64-0.846-0.741-1.396c-0.296-1.604-0.609-3.207-0.915-4.81c-0.016-0.081-0.021-0.163-0.019-0.245c0.019-0.394,0.37-0.597,0.724-0.423c0.036,0.021,0.072,0.041,0.105,0.063c1.174,0.853,2.484,1.423,3.858,1.856c1.262,0.4,2.556,0.641,3.873,0.758c1.52,0.138,3.031,0.104,4.54-0.11c2-0.28,3.91-0.851,5.687-1.827c0.354-0.194,0.686-0.43,1.025-0.646c0.056-0.035,0.108-0.076,0.167-0.104C25.819,22.206,26.153,22.395,26.186,22.761z - M18.027,15.284c-0.005,1.203-0.992,2.184-2.197,2.178c-1.205-0.004-2.178-0.987-2.172-2.196c0.004-1.212,0.98-2.181,2.192-2.175C17.059,13.097,18.03,14.073,18.027,15.284z - -sf_logo: >- - m0.10973,10.304c-0.063715-0.064-0.10973-0.3695-0.10973-0.7287,0-0.518,0.028754-0.6339,0.17686-0.7132,0.10645-0.056966,0.97285-0.094654,2.1762-0.094654,1.4331,0,2.0304-0.031075,2.109-0.10973,0.14226-0.14226,0.14226-0.9184,0-1.0607-0.077134-0.077135-0.59397-0.10973-1.7402-0.10973-1.7693,0-2.0378-0.054672-2.4475-0.49821-0.22016-0.2382-0.22973-0.2998-0.25796-1.6592-0.027012-1.3006-0.014301-1.4361,0.16145-1.7204,0.37101-0.6003,0.58673-0.6448,3.2814-0.6767,2.9042-0.034316,2.8498-0.050242,2.8498,0.83519,0,0.32448-0.047689,0.62163-0.10972,0.68366-0.078762,0.078762-0.69147,0.11012-2.1716,0.11112-1.134,0.0007216-2.1155,0.035443-2.1812,0.077064-0.081755,0.051857-0.11052,0.24557-0.091435,0.61579l0.027855,0.54013,1.7373,0.045718c1.9027,0.0502,2.1341,0.1109,2.5506,0.6697,0.1761,0.2362,0.1924,0.3777,0.1924,1.662,0,1.5713-0.052879,1.7306-0.68728,2.0709-0.28534,0.15303-0.55769,0.16929-2.8361,0.16929-1.8385,0-2.5502-0.02969-2.6302-0.10973zm9.1862-1.0489c-0.0335-0.0335-0.0609-1.1033-0.0609-2.3773v-2.3164h-0.66748c-0.39724,0-0.7119-0.044425-0.7772-0.10973-0.061907-0.061907-0.10973-0.35849-0.10973-0.68058,0-0.72446,0.15021-0.85554,0.98042-0.85554h0.57399v-0.8472c0-1.0337,0.14644-1.3641,0.77936-1.7587,0.43617-0.27191,0.45323-0.27457,1.9562-0.30408,0.915-0.017969,1.6159,0.008315,1.7676,0.066314,0.24036,0.091851,0.25145,0.12361,0.25145,0.72011,0,0.36344-0.04582,0.66984-0.10972,0.73375-0.07578,0.075781-0.54252,0.10973-1.5087,0.10973h-1.399v0.64005,0.64005h1.3318c0.7432,0,1.41,0.041832,1.5087,0.094655,0.1481,0.079261,0.17686,0.19524,0.17686,0.7132,0,0.35918-0.04601,0.66455-0.10972,0.72827-0.07578,0.075781-0.54252,0.10973-1.5087,0.10973h-1.399v1.8998c0,2.1681,0.0081,2.1405-0.76082,2.5815-0.457,0.2624-0.7882,0.3393-0.9151,0.2124z - -irc_logo: >- - M30,12V8h-5.004l1-8h-4l-1,8h-7.998l1-8h-4l-1,8H2v4h6.498L7.5,20H2v4h5l-1,8h4l1-8h8l-1.002,8H22l1-8h7v-4h-6.5l0.996-8H30z - M19.5,20h-8l0.998-8h7.998L19.5,20z - -mastodon_logo: >- - M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a3.614 3.614 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522c0-.859.22-1.541.66-2.046.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764.442.505.661 1.187.661 2.046v4.203z - -twitter_logo: >- - M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z - -rss_logo: >- - M14 1a1 1 0 0 1 1 1v12a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2a1 1 0 0 1 1-1h12zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z - M5.5 12a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm-3-8.5a1 1 0 0 1 1-1c5.523 0 10 4.477 10 10a1 1 0 1 1-2 0 8 8 0 0 0-8-8 1 1 0 0 1-1-1zm0 4a1 1 0 0 1 1-1 6 6 0 0 1 6 6 1 1 0 1 1-2 0 4 4 0 0 0-4-4 1 1 0 0 1-1-1z diff --git a/_data/members.yaml b/_data/members.yaml deleted file mode 100644 index 4288665c..00000000 --- a/_data/members.yaml +++ /dev/null @@ -1,365 +0,0 @@ -astropy: - name: Astropy - logo: astropy.png - url: http://www.astropy.org/ - repositories: - github: astropy/astropy - mailinglist: - users: http://mail.python.org/mailman/listinfo/astropy - devs: http://groups.google.com/group/astropy-dev - chat: - slack: http://joinslack.astropy.org/ - microblogging: - twitter: astropy - description: >- - is a community-driven package intended to contain much of the core - functionality and some common tools needed for performing - astronomy and astrophysics with Python. - -astronomy-commons: - name: Astronomy Data Commons - logo: astronomy-commons.png - url: https://dirac.astro.washington.edu/data-engineering/ - repositories: - github: astronomy-commons/ - mailinglist: - devs: https://groups.google.com/forum/#!forum/astronomy-commons - chat: - matrix: https://app.element.io/#/room/#astronomy-commons:matrix.org - description: >- - is an initiative for software infrastructure for science platforms and - scalable astronomy on cloud resources. Astronomy Data Commons is lead by - researchers at the DiRAC Institute at the University of Washington. - -ctlearn: - name: CTLearn - logo: ctlearn.png - url: https://github.com/ctlearn-project - repositories: - github: ctlearn-project/ctlearn - chat: - matrix: https://app.element.io/#/room/#ctlearn:matrix.org - description: >- - is a package under active development that pursues the - application of deep-learning based methods to the analysis of - data from imaging atmospheric Cherenkov telescopes (IACTs). CTLearn includes - modules for loading and manipulating IACT data and for running - machine learning models using pixel-wise camera data as - input. Its high-level interface provides a - configuration-file-based workflow to drive reproducible training - and prediction. - -einsteinpy: - name: EinsteinPy - logo: einsteinpy.png - url: https://einsteinpy.org - repositories: - github: einsteinpy/einsteinpy - mailinglist: - devs: https://groups.io/g/einsteinpy-dev - chat: - matrix: https://app.element.io/#/room/#einsteinpy:matrix.org - microblogging: - twitter: EinsteinPy - description: >- - is a python package for solving problems in general relativity. Computations - can be done for Schwarzschild, Kerr and Kerr-Newman geometries. Visualising - relativistic orbits, advancement of perihelion can be simulated in seconds. - See documentation for more - information. - -glue: - name: Glue - logo: glue.png - url: http://www.glueviz.org/ - repositories: - github: glue-viz/glue - mailinglist: - users: https://groups.google.com/group/glue-viz - devs: https://groups.google.com/group/glue-viz-dev - microblogging: - twitter: glueviz - description: >- - is a data visualization application and library to explore relationships - within and among related datasets. Its main features include linked - statistical graphs, flexible linking across data, and full Python scripting - capability. - -juliaastro: - name: JuliaAstro - logo: juliaastro.svg - url: https://juliaastro.github.io/ - repositories: - github: JuliaAstro - mailinglist: - users: https://discourse.julialang.org/c/domain/astro - chat: - slack: https://app.slack.com/client/T68168MUP/CMXU6SD7V - zulip: https://julialang.zulipchat.com/#narrow/channel/astronomy - description: >- - is an organization that shepherds the development of community astronomy and - astrophysics packages for Julia. These include packages for widely used - functionality such as FITS file I/O, world coordinate systems and - cosmological distance calculations. - -poliastro: - name: poliastro - logo: poliastro.png - url: https://poliastro.readthedocs.io/ - repositories: - github: poliastro/poliastro - mailinglist: - devs: https://groups.io/g/poliastro-dev - chat: - matrix: https://app.element.io/#/room/#poliastro:matrix.org - microblogging: - twitter: poliastro_py - mastodon: "@poliastro@fosstodon.org" - description: >- - is a python package for Astrodynamics and Orbital Mechanics problems, such - as orbital elements conversion, orbital propagation, plotting, planetary - ephemerides computation, and more. - -sunpy: - name: SunPy - logo: sunpy.png - url: http://sunpy.org - repositories: - github: sunpy/sunpy - mailinglist: - users: http://groups.google.com/group/sunpy - devs: http://groups.google.com/group/sunpy-dev - chat: - matrix: https://app.element.io/#/room/#sunpy:openastronomy.org - microblogging: - twitter: SunPyProject - description: >- - is a community-developed free and open-source software package for solar - physics. SunPy is meant to be a free alternative to the - SolarSoft - and its aim is to provide the software tools necessary so that anyone can - analyze solar data. - -stingray: - name: Stingray - logo: stingray_logo.png - url: http://stingray.science - repositories: - github: StingraySoftware - chat: - slack: https://join.slack.com/t/stingraysoftware/shared_invite/zt-49kv4kba-mD1Y~s~rlrOOmvqM7mZugQ - description: >- - : we are a team of astrophysicists and software developers working together - to build a variability analysis software to study black holes and - fundamental physics under extreme conditions. - -casacore: - name: Casacore - logo: casacore.svg - url: https://www.github.com/casacore/casacore/ - repositories: - github: casacore - description: >- - is a suite of C++ libraries for radio astronomy data processing. Casacore - underlies CASA, the Common Astronomy - Software Applications developed by an international consortium of scientists - at various institutes. Python bindings exist in Python-casacore. - Casacore also underlies other radio astronomy software such as WSClean, and LOFAR - tools. Casacore is developed by the radio astro organizations around the - world. It is open source and will happily merge any (good) pull requests. - -chiantipy: - name: ChiantiPy - logo: chiantipy.png - url: http://chiantipy.sourceforge.net/welcome.html - repositories: - github: chianti-atomic/ChiantiPy - mailinglist: - users: https://lists.sourceforge.net/lists/listinfo/chiantipy-users - description: >- - is a Python interface to the CHIANTI atomic database for astrophysical - spectroscopy. CHIANTI consists of a database of atomic data that can be used - to interpret spectral lines and continua emitted from high-temperature, - optically-thin astrophysical sources. - -coin: - name: COIN - logo: coin.png - url: https://cosmostatistics-initiative.org/ - repositories: - github: COINtoolbox - mailinglist: - admin (Rafael S. de Souza): mailto:rafael.2706@gmail.com - description: >- - (COsmostatistics INitiative) is an international working group built under - the auspices of the International Astrostatistics Association (IAA). It - aims to create an interdisciplinary environment where collaborations between - astronomers, statisticians and machine learning experts can flourish. COIN - is designed to promote the development of a new family of tools for data - exploration in astrophysics and cosmology. - -gnuastro: - name: GNU Astronomy Utilities - logo: gnuastro.svg - url: https://www.gnu.org/software/gnuastro/ - repositories: - savannah: https://git.savannah.gnu.org/cgit/gnuastro.git - mailinglist: - users: https://lists.gnu.org/mailman/listinfo/help-gnuastro - devs: https://lists.gnu.org/mailman/listinfo/gnuastro-devel - description: >- - (Gnuastro) is an official GNU package consisting of many - command-line programs and - library functions for the manipulation and analysis of - astronomical data. All the programs share the same basic and familiar (GNU - style) command-line user interface for the comfort of both the users and - developers. Gnuastro is written to comply fully with the GNU coding - standards so it blends nicely with all Unix-like operating systems. This - also enables astronomers to expect a fully familiar experience in the - source code, building, installing and command-line user interaction. - Gnuastro also has a very complete - book/manual, the - tutorials is the best place to start using it. - -ims: - name: The Italian Mars Society - logo: ims.png - url: http://www.marssociety.it/?lang=en - repositories: - bitbucket: italianmarssociety/ - mailinglist: - admin: mailto:gsoc@marssociety.it - microblogging: - twitter: marssociety - description: >- - (IMS) is a non-profit organization, existing from 2004, as Italian branch of - the International Mars Society, created in the USA by Robert Zubrin. IMS is - a member of the Mars Society European network. The foundation scope of the - Italian Mars Society is to promote research projects devoted to Mars - Exploration and the involvement of SMEs and large enterprises in the new - economy related to space exploration.
IMS is currently spearheading - the MARS CITY - project. The project aims to address the major issues that could jeopardize - a crewed mission to Mars and are not adequately being addressed at existing - terrestrial Mars analogs. - -plasmapy: - name: PlasmaPy - logo: plasmapy.png - url: http://www.plasmapy.org - repositories: - github: plasmapy/plasmapy - mailinglist: - users: https://groups.google.com/group/plasmapy - chat: - matrix: https://app.element.io/#/room/#plasmapy:matrix.org - microblogging: - twitter: plasmapy - description: >- - aims to be a collection of functionality commonly used and shared between - plasma physicists and researchers globally, running within and leveraging - the open source scientific Python ecosystem. - -radis: - name: radis - logo: radis_ico.png # name of the logo as saved on img/members - url: https://radis.readthedocs.io/ - repositories: - github: radis/radis - mailinglist: - users: https://groups.google.com/forum/#!forum/radis-radiation - chat: - gitter: https://gitter.im/radis-radiation/community - microblogging: - twitter: radis_radiation - description: >- - A fast line-by-line code for high-resolution infrared molecular spectra. - RADIS can compute spectra of millions of lines within seconds. Also - includes a post-processing tools to compare experimental spectra with - spectra calculated in RADIS or other spectral codes. - -sherpa: - name: Sherpa - logo: sherpa_logo.gif - url: http://cxc.cfa.harvard.edu/contrib/sherpa/ - repositories: - github: sherpa/sherpa/ - description: >- - is a modeling and fitting application for Python. It contains a powerful - language for combining simple models into complex expressions that can be - fit to the data using a variety of statistics and optimization methods. It - is easily extensible to include user models, statistics and optimization - methods. - -yt: - name: yt - logo: yt.png - url: https://yt-project.org/ - repositories: - github: yt-project/yt - mailinglist: - users: https://mail.python.org/archives/list/yt-users@python.org/ - devs: https://mail.python.org/archives/list/yt-dev@python.org/ - chat: - slack: https://yt-project.slack.com/ - microblogging: - twitter: yt_astro - description: >- - is a python package for analyzing and visualizing volumetric, - multi-resolution data from astrophysical simulations, - radio telescopes, and a burgeoning interdisciplinary community. - -lincc-frameworks: - name: LINCC Frameworks - logo: lincc-frameworks.png - url: https://lsstdiscoveryalliance.org/lsst-discovery-alliance-programs/lincc-frameworks/ - repositories: - github: lincc-frameworks - chat: - slack: https://join.slack.com/t/gsoc26arrowforastro/shared_invite/zt-3qpirqhkg-qTHUg4R0iMewhIprewR1eg - description: >- - builds open-source tools scalable data analysis in astronomy, aimed at - enabling scientific discovery with large datasets. - -reltrans: - name: Reltrans - logo: reltrans_logo.png - url: https://reltrans.github.io/reltrans_website/Home.html - repositories: - github: reltrans - chat: - slack: https://join.slack.com/t/reltrans-workspace/shared_invite/zt-3p234fciq-lD12LDPTCCPf0DTT1ZocmQ - description: >- - Reltrans (Relativistic transfer functions) is a publicly available, semi-analytical model for X-ray reverberation mapping of accreting black holes in both AGN and X-ray binaries. It can be used to compute both time-averaged spectra and energy-dependent, Fourier domain cross spectra - -# Are you a new org? copy the fragment below above this line and fill it up -# with your organisation details. Don't forget to add your logo to the img/members -# directory. -# example: -# name: OrgName -# logo: logo.png # name of the logo as saved on img/members -# url: http://url.mainOrgpage.is -# repositories: -# github: org/repo -# bitbucket: org/repo -# somethingelse: http://full.url # In this case it will print the name for the repo -# mailinglist: -# users: http://url.for.group -# devs: http://url.for.group -# otherstuff: http://url.for.group -# chat: -# slack: http://slackurl.com -# matrix: http://riot.url -# irc: http://irc.freenode/#channel -# description: >- -# Multiline description that will start with name org. html links are -# allowed as normal links. diff --git a/_includes/footer.html b/_includes/footer.html deleted file mode 100644 index 8a14c2df..00000000 --- a/_includes/footer.html +++ /dev/null @@ -1,39 +0,0 @@ - diff --git a/_includes/head.html b/_includes/head.html deleted file mode 100644 index ffe6962c..00000000 --- a/_includes/head.html +++ /dev/null @@ -1,71 +0,0 @@ - - - {% if page.title %}{{ page.title }}{% else %}{{ site.title }}{% endif %} - - - - - - - - - - - - - - - - - {% include style.html %} - - - - - - {% if include.project == "true" %} - - - - - - - - - - - - - - - - {% endif %} - - diff --git a/_includes/header.html b/_includes/header.html deleted file mode 100644 index be4ee4fe..00000000 --- a/_includes/header.html +++ /dev/null @@ -1,36 +0,0 @@ - diff --git a/_includes/member.html b/_includes/member.html deleted file mode 100644 index 68b8cbbf..00000000 --- a/_includes/member.html +++ /dev/null @@ -1,88 +0,0 @@ -{% assign details = member[1] %} -
- - {{member[0]}} - -
- {{ details.name }} - {{ details.description }} -
- - {% for repo in details.repositories %} - {% if repo[0] == 'github' %} - {% assign name = repo[1] %} - - - - - - - {% elsif repo[0] == "bitbucket" %} - {% assign name = repo[1] %} - - - - - - - {% elsif repo[0] == "sourceforge" %} - {% assign name = repo[1] %} - - - - - - - {% else %} - {% assign name = member[0] %} - - - Cgit logo - - {% endif %} - {{ name }} - {% endfor %} -
- - {% if details.mailinglist %} - - {% for list in details.mailinglist %} - {{ list[0] }}{% unless forloop.last %},{% endunless %} - {% endfor %} -
- {% endif %} - - {% if details.chat %} - - - - - - {% for chat in details.chat %} - {{ chat[0] }}{% unless forloop.last %},{% endunless %} - {% endfor %} -
- {% endif %} - - {% for mb in details.microblogging %} - {% if mb[0] == 'twitter' %} - {% assign name = '@' | append: mb[1] %} - {% assign url = 'https://twitter.com/' | append: mb[1] %} - {% assign icon = site.data.icons.twitter_logo %} - {% elsif mb[0] == "mastodon" %} - {% assign mastodon_parts = mb[1] | split: "@" %} - {% assign name = mb[1] %} - {% assign url = 'https://' | append: mastodon_parts[2] | append: '/@' | append: mastodon_parts[1] %} - {% assign icon = site.data.icons.mastodon_logo %} - {% endif %} - - - - - - - {{ name }} - {% endfor %} -
-
-
diff --git a/_includes/style.html b/_includes/style.html deleted file mode 100644 index eeca68f8..00000000 --- a/_includes/style.html +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100644 index cae818ed..00000000 --- a/_layouts/default.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - {% include head.html %} - - - - {% include header.html %} - -
-
-
- {{ content }} -
-
-
- - {% include footer.html %} - - - - diff --git a/_layouts/display.html b/_layouts/display.html deleted file mode 100644 index 13e055b4..00000000 --- a/_layouts/display.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - {% include head.html %} - - - - {% include header.html %} - -
-
- {{ content }} -
-
- - {% include footer.html %} - - - - diff --git a/_layouts/mission.html b/_layouts/mission.html deleted file mode 100644 index a2b4e52f..00000000 --- a/_layouts/mission.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: default ---- -
- -
-

{{ page.title }}

- -
- -
- {{ content }} -
- -
diff --git a/_layouts/page.html b/_layouts/page.html deleted file mode 100644 index 74c1a118..00000000 --- a/_layouts/page.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -layout: default ---- -
- -
-

{{ page.title }}

-
- -
- {{ content }} -
- -
diff --git a/_layouts/post.html b/_layouts/post.html deleted file mode 100644 index a2b4e52f..00000000 --- a/_layouts/post.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: default ---- -
- -
-

{{ page.title }}

- -
- -
- {{ content }} -
- -
diff --git a/_layouts/projects.html b/_layouts/projects.html deleted file mode 100644 index 742f7815..00000000 --- a/_layouts/projects.html +++ /dev/null @@ -1,40 +0,0 @@ - - - {% include head.html project="true" %} - - - {% include header.html %} - -
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
- - {% include footer.html %} - - - - - diff --git a/_plugins/shuffle.rb b/_plugins/shuffle.rb deleted file mode 100644 index 26b09966..00000000 --- a/_plugins/shuffle.rb +++ /dev/null @@ -1,9 +0,0 @@ -module Jekyll - module ShuffleFilter - def shuffle(array) - array.shuffle - end - end -end - -Liquid::Template.register_filter(Jekyll::ShuffleFilter) diff --git a/_projects/2017/casacore/testing.md b/_projects/2017/casacore/testing.md deleted file mode 100644 index be30bf4f..00000000 --- a/_projects/2017/casacore/testing.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -name: Casacore testing -desc: Improve the test coverage of the python wrappers around casacore, and possibly add some python functionality -# add a description of your project -requirements: - - Proficiency in Python -difficulty: intermediate -issues: - - https://github.com/casacore/python-casacore/issues/6 - - https://github.com/casacore/python-casacore/issues/60 -mentors: - - tammojan - - gijzelaerr -initiatives: - - GSOC -tags: - - python casacore testing -collaborating_projects: - - casacore ---- -#### Description - -Python-casacore is a set of Python bindings for [casacore] (https://github.com/casacore/casacore), a c++ library used in radio astronomy. This python binding to casacore is now python 3 compatible, contains some unit tests, etc. But some work remains to be done: - - - Remove all compile warnings - - Modernise code, add missing features, maybe more ‘pythonic’. - - Improve test coverage (24% at the moment) - -This is a typical project to learn making good code. - diff --git a/_projects/2018/astropy/astropy-learn-website.md b/_projects/2018/astropy/astropy-learn-website.md deleted file mode 100644 index 78a398d1..00000000 --- a/_projects/2018/astropy/astropy-learn-website.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -name: Astropy Learn Website -desc: Design and Implement landing page for Astropy Learn ecosystem. -# add a short one line description of your project -requirements: -# Student requirements: - - Web development knowledge - - User interface design and user experience - - Knowledge of the Sphinx documentation tool is a plus -difficulty: moderate -issues: -# Related issues (if any) to this project. -mentors: -# First person in contact; mentors may change before project starts. - - kelle - - eblur - - adrn - - eteq -initiatives: - - GSOC -tags: -# Different technologies needed - - Web design - - javascript - - python -collaborating_projects: -# suborganisation(s) to which this project belongs. - - astropy ---- -Design and Implement landing page for Astropy Learn ecosystem. - -#### Description -This project is for the creation of a landing web page for the Astropy Learn ecosystem. The Learn ecosystems includes the Astropy documentation and associated examples, the Astropy tutorials, and guides (e.g., worked out science use cases). Implementing this likely also requires harmonizing the existing tutorials web site with the astropy documentation (which is generated by Sphinx). This project may also include indexing/tagging of the materials and searching for content (this is already possible to some extent, but the current capabilities are inadequate). - -#### Possible Milestones - -##### At start of coding for GSOC 2018 - -* Have a big-picture plan for how the learn landing page, astropy web site, astropy docs, and astropy tutorials link together. -* Have a general sense of what actual web page javascript code and sphinx extension changes might be necessary. - -##### GSOC 2018 Midterm - -* Have a draft design for the new web pages ready to get comment from the community. -* Have Pull Requests open for any changes necessary to the astropy documentation or tutorials page templates. - -##### GSOC 2018 Final - -* Have the completed landing page launched. -* (Stretch goal) Include in the landing page a search that works across all of the learn resources. diff --git a/_projects/2018/astropy/sphinx-example-index.md b/_projects/2018/astropy/sphinx-example-index.md deleted file mode 100644 index d66b1a6b..00000000 --- a/_projects/2018/astropy/sphinx-example-index.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -name: Indexing examples in Astropy Sphinx documentation -desc: Write a Sphinx plugin to identify examples in the Astropy documentation, tag/index them, and build an example gallery from them -# add a short one line description of your project -requirements: -# Student requirements: - - Knowledge of [sphinx](http://www.sphinx-doc.org/en/stable/) - - Interest in user training -difficulty: moderate -issues: -# Related issues (if any) to this project. - - https://github.com/astropy/astropy/issues/6589 - - https://github.com/astropy/astropy-helpers/issues/371 -mentors: -# First person in contact; mentors may change before project starts. - - eteq - - adrn - - bsipocz -initiatives: - - GSOC -tags: -# Different technologies needed - - python - - sphinx -collaborating_projects: -# suborganisation(s) to which this project belongs. - - astropy ---- -Write a Sphinx plugin to identify examples in the Astropy documentation, tag/index them, and build an example gallery from them - -#### Description - -The [current astropy example gallery](http://docs.astropy.org/en/stable/generated/examples/) is problematic because it duplicates content from the astropy documentation and it is not clear which examples are "worthy" of the example gallery. It also overlaps with the [astropy tutorials](http://tutorials.astropy.org). Hence, this project is focused on developing the infrastructure to auto-generate the example gallery from examples *in* the documentation. This will require building a Sphinx plugin to find tagged examples and generating links. It will also require coordinating moving of existing gallery examples to the documentation and tagging them appropriately. - -#### Possible Milestones - -##### At start of coding for GSOC 2018 - -* Identify what labeling technique is best for tagging the examples. -* Solicit authors of gallery examples to determine where they should be moved. Some may belong in the documentations, whil others might be better places as Astropy Tutorials. -* Determine where the plugin will go (either a standalone small package, in the astropy-helpers, or in astropy itself), in consultation with the Astropy documentation maintainers. - -##### GSOC 2018 Midterm - -* Have examples identified and ready to be moved out of the gallery and into their relevant locations in the astropy docs or tutorials. -* Have a first-draft working plugin ready for review by Astropy documentation maintainers. -* Determine how difficult it will be to have an example *gallery* (as opposed to simply an index/list of the examples). - -##### GSOC 2018 Final - -* Release the plugin, with minimum functionality of generating the example list (or have it merged if it ends up as part of another project). -* (Stretch Goal) have the plugin generate an example gallery instead of a list. -* Complete a Pull Request to activate the (finished) plugin in the Astropy repository. -* Have a Pull Request to tag all the relevant examples which sucessfully generates the example *list*. diff --git a/_projects/2018/astropy/table-optimize.md b/_projects/2018/astropy/table-optimize.md deleted file mode 100644 index 2cbcb293..00000000 --- a/_projects/2018/astropy/table-optimize.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -name: Improving astropy Table performance -desc: Improve the speed of common Table operations like slicing -# add a short one line description of your project -requirements: -# Student requirements: - - Familiar with Cython and Python code profiling - - Familiar with Python speed optimization strategies -difficulty: medium -issues: -# Related issues (if any) to this project. -mentors: -# First person in contact; mentors may change before project starts. - - taldcroft -initiatives: - - GSOC -tags: -# Different technologies needed - - python - - Cython -collaborating_projects: -# suborganisation(s) to which this project belongs. - - astropy ---- - -Improving astropy Table performance - -#### Description - -The astropy table sub-package defines a core Table class that is -used to store and manipulate tabular data within astropy. This class -was written with an emphasis on functionality, convenience for astronomers, -and code clarity. With the astropy table package now fairly mature -and with a strong set of regression tests in place, it is time to focus -on performance for basic operations like table creation and slicing. -For a simple operation like slicing, astropy Table is currently about -a factor of 10 slower than Pandas. This project will focus on identifying -performance bottlenecks, writing performance tests for astropy-benchmarks, -and then developing code to improve the performance. It is possible that -some fixes - -#### Milestones (if any) - -##### GSOC 2018 CODING STARTS - -* Perform developer install of `astropy`. -* Install Python profiling tools. -* Study astropy and the table package capabilities. - -##### GSOC 2018 MIDTERM - -* Install and run `asv`. -* Examine existing `asv` benchmarks and identify areas for improved benchmarking. -* Profile key parts of table code and identify performance bottlenecks. -* Identify strategies for improved speed performance. -* Implement initial performance improvements. - -##### GSOC 2018 FINAL - -* Continue and finalize implementation of performance improvements. -* Contine and finalize additional `asv` benchmark tests. diff --git a/_projects/2019/astropy/table-optimize.md b/_projects/2019/astropy/table-optimize.md deleted file mode 100644 index e1dbb183..00000000 --- a/_projects/2019/astropy/table-optimize.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -name: Improving astropy Table performance -desc: Improve the speed of common Table operations like slicing -# add a short one line description of your project -requirements: -# Student requirements: - - Familiar with Cython and Python code profiling - - Familiar with Python speed optimization strategies -difficulty: medium -issues: -# Related issues (if any) to this project. -mentors: -# First person in contact; mentors may change before project starts. - - taldcroft - - mhvk -initiatives: - - GSOC -tags: -# Different technologies needed - - python - - Cython -collaborating_projects: -# suborganisation(s) to which this project belongs. - - astropy ---- - -Improving astropy Table performance - -#### Description - -The astropy table sub-package defines a core Table class that is -used to store and manipulate tabular data within astropy. This class -was written with an emphasis on functionality, convenience for astronomers, -and code clarity. With the astropy table package now fairly mature -and with a strong set of regression tests in place, it is time to focus -on performance for basic operations like table creation and slicing. -For a simple operation like slicing, astropy Table is currently about -a factor of 10 slower than Pandas. This project will focus on identifying -performance bottlenecks, writing performance tests for astropy-benchmarks, -and then developing code to improve the performance. It is possible that -some fixes will require the use of Cython so previous experience is -desirable though not absolutely required. - -#### Milestones (if any) - -##### GSOC 2019 CODING STARTS - -* Perform developer install of `astropy`. -* Install Python profiling tools. -* Study astropy and the table package capabilities. - -##### GSOC 2019 MIDTERM - -* Install and run `asv`. -* Examine existing `asv` benchmarks and identify areas for improved benchmarking. -* Profile key parts of table code and identify performance bottlenecks. -* Identify strategies for improved speed performance. -* Implement initial performance improvements. - -##### GSOC 2019 FINAL - -* Continue and finalize implementation of performance improvements. -* Contine and finalize additional `asv` benchmark tests. diff --git a/_projects/2019/astropy/telescopy.md b/_projects/2019/astropy/telescopy.md deleted file mode 100644 index 720ac513..00000000 --- a/_projects/2019/astropy/telescopy.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -name: telescopy -desc: A generic API for telescope S/N calculations. -requirements: -# Student requirements: - - Observational astronomy -difficulty: medium -mentors: -# First person in contact; mentors may change before project starts. - - bmorris3 - - eteq -initiatives: - - GSOC -tags: -# Different technologies needed - - python -collaborating_projects: -# suborganisation(s) to which this project belongs. - - astropy ---- - -Specify some telescope, filter, imager, and target properties, and estimate the photons or counts you’d measure - -#### Description - -The goal of this project is to create a simple API for performing signal-to-noise calculations -for telescopic observations using astropy. Users will specify an input source spectrum (e.g. a blackbody), -properties of the source (e.g. magnitude in one band, or a distance), properties of the telescope -(e.g. aperture, throughput), and properties of the imager (e.g. quantum efficiency, gain) in order to calculate -the expected photon flux and count rate. If time allows, the applicant will also develop a submodule for -signal-to-noise calculations of spectroscopic observations. - -#### Milestones (if any) - -##### GSOC CODING STARTS - -* Get to know the existing API, design strawman API -* Generalize the input spectrum object for objects other than blackbodies -* Work out scaling of magnitudes from one band to another - -##### GSOC MIDTERM - -* Write tests which will validate predictions against real data -* Write documentation which explains how to construct your own S/N calculations - -##### GSOC FINAL - -* Have _passing_ tests which validate the API for real observations -* Handle spectroscopic observations at arbitrary spectral resolution -* Write extensive documentation with examples for widely-used telescopes diff --git a/_projects/2019/sunpy/featuresevents.md b/_projects/2019/sunpy/featuresevents.md deleted file mode 100644 index 2d56b276..00000000 --- a/_projects/2019/sunpy/featuresevents.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -name: Feature and Event Objects in SunPy -desc: Implements a feature/event object in SunPy. -requirements: - - Familiar with methods for creating classes, objects and subclasses. -difficulty: medium -issues: - - https://github.com/sunpy/sunpy/pull/2759 - - https://github.com/sunpy/sunpy/issues/1792 - - https://github.com/sunpy/sunpy/issues/1398 - - https://github.com/sunpy/sunpy/issues/164 -mentors: - - wafels - - Cadair - - dpshelio -initiatives: - - GSOC -tags: - - Python -collaborating_projects: - - SunPy ---- - -#### Description - -The Sun displays many different features and events (FEs). These are -detected and described either automatically by algorithm, or by visual -inspection by human, or by a combination of both. There are many -different repositories of these FEs online. SunPy provides access to -two large FE repositories, the Heliophysics Event Knowledgebase (HEK) and -the Helio Event Catalogue (HEC). - -The aim of this project is to create a SunPy object that normalizes -input from both the HEK and HEC and creates a SunPy FE object. The -SunPy FE object should take advantage of existing SunPy capabilities -such as SunPy spatial co-ordinates and SunPy time. This will make FE -data much more useful to SunPy users. - -The SunPy FE object should interact intuitively with existing SunPy -objects such as the SunPy maps and timeseries. For example, it should -be simple for a FE with a spatial extent property to be overplotted -on SunPy map; similarly, it should be simple for a FE with a temporal -duration to be overplotted on a SunPy timeseries. - - -#### Milestones - -##### Coding Starts - -* Engaged with the community and understand the motivation and - challenges of the project. - -##### Evaluation 1 - -* Have understood what a FE is in the context of solar physics - research and why their interaction with existing SunPy objects is - important. -* Have evaluated and chosen an approach to the design of a SunPy FE - object. -* Have implemented a basic SunPy FE object. - -##### Evaluation 2 - -* Have worked with your mentors and the community to design a simple - and functional API. -* Have a working prototype of the SunPy FE object that normalizes -input from both the HEK and HEC. -* Have tests for the working prototype. - -##### Final - -* Have finished implementation, testing and documentation. -* Have written examples for the gallery of how to use the functionality. -* Have written developer documentation. -* Have the Pull Request merged after review and feedback. diff --git a/_projects/2020/.gitkeep b/_projects/2020/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2020/einsteinpy/Null-geodesics-for-Schwarzschild-and-Kerr-Geometries..md b/_projects/2020/einsteinpy/Null-geodesics-for-Schwarzschild-and-Kerr-Geometries..md deleted file mode 100644 index f9411a28..00000000 --- a/_projects/2020/einsteinpy/Null-geodesics-for-Schwarzschild-and-Kerr-Geometries..md +++ /dev/null @@ -1,96 +0,0 @@ ---- -name: Null geodesics for Schwarzschild and Kerr Geometries -desc: The project aims at adding functionality of ray-tracing to EinsteinPy -# add a short one line description of your project -requirements: -# Student requirements: - - Knowledge on ODEs, basic mathematics - - Some Familiarity with General Relativity, or the will to read about it. - - Basic knowledge of differential geometry -difficulty: medium -issues: -# Related issues (if any) to this project. - - https://github.com/einsteinpy/einsteinpy/issues/105 - - https://github.com/einsteinpy/einsteinpy/issues/106 - - https://github.com/einsteinpy/einsteinpy/issues/275 - - https://github.com/einsteinpy/einsteinpy/issues/144 - - https://github.com/einsteinpy/einsteinpy/issues/145 -mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - ritzvik - - OVSofia - - rishi-s8 -initiatives: - - GSOC - - SOCIS -tags: -# Different technologies needed - - python - - C++ -collaborating_projects: -# suborganisation(s) to which this project belongs. - - einsteinpy ---- - -#### Description - -Null-geodesics is the path traced by light rays in 4-D space-time. We aim to calculate null geodesics around non-rotating (Schwarzschild) and rotating (Kerr) massive bodies given the initial conditions. - -The project has roughly the following objectives : - - Calculating null trajectories around a rotating/non-rotating black hole. - - Use those trajectories to raytrace a bundle of photon rays, to visualize how space-time gets distorted in presence of black holes. - - Calculate redshifts in photon rays due to space-time curvature. - - Visualization of Keplerian disc/shell in around it. - - In short, we aim to replicate one of the few papers available with proper coding paradigms like OOPs, good documentation and unit tests. - - If required due to performance issues, python wrappers over native C/C++ have to be written. - -This project also aims at fixing the problem of natural units introduced due to the research papers and books and to give native support to MKS units. - -##### Papers we intend to replicate : - - Odyssey: https://arxiv.org/abs/1601.02063 - - YNOGK: https://arxiv.org/abs/1305.1250 - -##### Links to other relevant papers : - - https://www.aanda.org/articles/aa/abs/2004/36/aa0814/aa0814.html - - http://www.math.mcgill.ca/gantumur/math599w17/project-kerr.pdf - - https://iopscience.iop.org/article/10.1088/0004-637X/696/2/1616 - -#### Milestones (if any) - -##### Coding starts - -* Engaged with the community and understand the motivation and challenges of - the project. -* Have set up a development environment and get familiar with einsteinpy dependencies. -* Have read relevant literature/codes required for the project. - - -##### 1st evaluation - -* Null geodesic in Kerr space-time -* Null geodesic in Schwarzschild space-time (It can be implemented by creating a class inheriting from Kerr null geodesics and setting a=0. However, it would lead to unnecessary calculation and therefore, seperate Schwarzschild-Null class is necessary.) -* If possible, basic raytracing using the newly created classes. -* Have all code, tests and documentation in GitHub. - -##### 2nd evaluation - -* Plotting class for both Kerr and Schwarzschild null geodesics. -* Improvement in raytracing, along with simulation of a photon sheet around a black hole. -* Calculation of redshifts along the null trajectory. -* Have all code, tests and documentation in GitHub. - -##### Final - -* Good-enough implementation of any of the relavent papers. -* Complete any chores left out during the 1st and 2nd phase. -* Fix the Natural Units Problem in Kerr-Newman time-like geodesics. -* Fix the Natural Units Problem in Hypersurface Module. -* Have all code, tests and documentation in GitHub. - -#### Secondary goals - -* Fix any bugs that might appear regarding visualization, symbolic module and so forth. -* Review pull requests from other einsteinpy contributors, including the mentor. -* Give a talk about the work at some Python event. -* EinsteinPy is nothing without its community. Therefore, getting integrated deeply within the community and oversee future development of EinsteinPy. diff --git a/_projects/2020/radis/radis_atmosphere_calculation_interface.md b/_projects/2020/radis/radis_atmosphere_calculation_interface.md deleted file mode 100644 index d1235e1c..00000000 --- a/_projects/2020/radis/radis_atmosphere_calculation_interface.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -name: RADIS Atmosphere Calculation Interface -desc: Adapt a spectroscopy open-source code to characterize exoplanet atmospheres. -requirements: - - Basic notions of spectroscopy -difficulty: easy -mentors: -# GitHub handles - - erwanp - - minouHub - - dcmvdbekerom -initiatives: - - GSOC -tags: -# Different technologies needed - - python - - CUDA -collaborating_projects: - - radis -issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis/issues/74 ---- - -#### Description - -The presence and concentration of molecules in exoplanet atmospheres are measured by comparing absorption and emission spectra to synthetic spectra. However, under high-temperature conditions, the synthetic spectra contain dozens of millions of lines, which require long computational times . - -The RADIS code was recently developed for the characterization of plasmas and flames. It uses a new approach to quickly calculate high-temperature infrared spectra. New developments are in progress (see our [other project](https://openastronomy.org/gsoc/gsoc2020/#/projects?project=accelerate_synthetic_spectra_calculations) on further accelerating the code), but it is already one of the fastest spectral codes in the world. This performance would be beneficial for exoplanet characterization, and this is the goal of this project: adapt the RADIS code to the calculation of exoplanet atmospheres! - - -#### Milestones - -##### Coding starts - -* Engage with the community and understand the motivation of spectroscopy users -* Training on emission & absorption spectroscopy -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) -* Get used with RADIS architecture: review the interface change to calculate multiple molecules at the same time ([#74](https://github.com/radis/radis/pull/74#issuecomment-585773087)) - - -##### 1st evaluation - -* Indirect integration of databases from the Exoplanet atmosphere community (ExoMol), using a converter to the HITRAN format supported by RADIS -* 1st calculation of an atmosphere line-of-sight spectrum with Python hardcoded inputs - -##### 2nd evaluation - -* Direct integration of ExoMol, and memory optimization -* Calculation of atmosphere with standard atmosphere input files (mole fractions, temperature profile, pressure profile) - -##### Final - -* Write an iPython notebook to document the atmosphere module on [radis-examples](https://github.com/radis/radis-examples) -* Have all code, tests and documentation in GitHub. - -#### Secondary goals - -* Document architecture and developer guide when facing unclear points that may appear. -* Review pull requests from other RADIS contributors -* Optimized calculation of atmospheres in optically thin configurations (merge results with project [Accelerate Synthetic Spectra Calculations](https://openastronomy.org/gsoc/gsoc2020/#/projects?project=accelerate_synthetic_spectra_calculations) ) - ) \ No newline at end of file diff --git a/_projects/2021/.gitkeep b/_projects/2021/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2021/astropy/astropyCDS.md b/_projects/2021/astropy/astropyCDS.md deleted file mode 100644 index 2b63ce5d..00000000 --- a/_projects/2021/astropy/astropyCDS.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -name: Add a CDS-ASCII writer to astropy -desc: Allow writing an astropy Table to CDS format -requirements: -# Student requirements: - - Python - - Some familiarity with ASCII files is preferred -difficulty: low -issues: -# Related issues (if any) to this project. - - https://github.com/astropy/astropy/issues/11257 - - https://github.com/astropy/astropy/issues/11239 - - https://github.com/astropy/astropy/issues/9291 -mentors: -# GitHub handles - - hamogu - - aaryapatil -initiatives: - - GSOC -tags: -# Different technologies needed - - python - - astropy core -collaborating_projects: -# suborganisation(s) to which this project belongs. - - astropy ---- - -#### Description - -Astropy is a core python package for astronomy that provides several modules for the analysis of observational data. A common problem is storing and retrieving tabular data in standard formats which include metadata to fully describe the contents of a table. One such ASCII format is CDS (http://vizier.u-strasbg.fr/doc/catstd.htx) that is used for publishing catalogues accompanying papers to astronomical databases like Vizier. Astropy has the capability of reading a CDS file to an astropy Table but not writing a Table to CDS. In this project, the student will create a CDS writer in astropy.io.ascii. A python module from CDS (https://github.com/cds-astro/cds.pyreadme/) uses astropy to write CDS files, and the astropy writer can be based on that. - -#### Milestones (if any) - -##### Coding starts - -* Understand the CDS format, and write an example astropy Table to this format using python -* Get familiar with the astropy.io.ascii framework - -##### 1st evaluation - -* Add the writer to astropy.io.ascii (PR open and tests pass) -* Add documentation for the writer - -##### Final - -* Finish testing and documentation -* Fix any bugs (if found or reported) diff --git a/_projects/2022/.gitkeep b/_projects/2022/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2022/astropy/.gitkeep b/_projects/2022/astropy/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2022/gnuastro/.gitkeep b/_projects/2022/gnuastro/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2022/juliaastro/.gitkeep b/_projects/2022/juliaastro/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2022/radis/.gitkeep b/_projects/2022/radis/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2022/radis/performance_tweaks.md b/_projects/2022/radis/performance_tweaks.md deleted file mode 100644 index 3fb7ada3..00000000 --- a/_projects/2022/radis/performance_tweaks.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -name: Performance Tweaks for RADIS -desc: Reduce Memory usage and improve performance in RADIS to be able to compute terabyte-scale databases -# add a short one line description of your project -requirements: -# Student requirements: - - Knowledge of Pandas or other DataFrame libraries - - Prior working knowledge with big data handling databases like Vaex -difficulty: medium -issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis/issues/118 - - https://github.com/radis/radis/issues/176 -mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - gagan-aryan - - anandxkumar - - erwanp -initiatives: - - GSOC -project_size: - - 175 h -tags: -# Different technologies needed - - Python - - Vaex - - Pandas - - Git -collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis ---- - - -#### Description - -The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. - -However, although the algorithm is very CPU/GPU efficient, the RADIS code is still memory-hungry. The first goal of the current project is to reduce the memory usage of current calculations. Then, it is to replace the current core with libraries better suited to process larger-than-memory-data, which would make it possible to compute spectral databases of up to billions of lines (hundred of GB or terabyte-scale). - - -#### Milestones - -##### Coding starts - -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) - -* Training on emission & absorption spectroscopy - -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) - -##### 1st Evaluation - -* Work on the existing [memory bottlenecks](https://github.com/radis/radis/issues/118) - -* Work on [crunching datatypes](https://github.com/radis/radis-benchmark/pull/11) of various columns to optimise dataframe memory usage - -* Setup [memory-performance benchmark](https://github.com/radis/radis-benchmark/tree/master/manual_benchmarks) to track the changes - -* Automatically [cache non equilibrium parameters](https://github.com/radis/radis/issues/176) to line database cache - -* Merge the changes - - -##### Final evaluation - -* Write the Proof-Of-Concept to do out of the core calculations i.e., use Vaex for computations instead of pandas. - -* Merge the idea of the Proof-Of-Concept to the codebase. - -* Add [automatic linestrength cutoff](https://github.com/radis/radis/issues/268) - -* Add [.h5 loading benchmark](https://github.com/radis/radis-benchmark/issues/4) - -* Have all code, tests and documentation in GitHub diff --git a/_projects/2022/stingray/.gitkeep b/_projects/2022/stingray/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2022/stingray/type_hints_stingray.md b/_projects/2022/stingray/type_hints_stingray.md deleted file mode 100644 index ed81337d..00000000 --- a/_projects/2022/stingray/type_hints_stingray.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -name: Type hints in Stingray -desc: Using type hints throughout the Stingray library -# add a short one line description of your project -requirements: -# Student requirements: - - Knowledge of Python -difficulty: easy -issues: -# Related issues (if any) to this project. - - https://github.com/StingraySoftware/stingray/issues/544 -mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - matteobachetti - - dhuppenkothen -initiatives: -# The programme under this project wish to run. - - GSOC -project_size: - - 175 h -tags: -# Different technologies needed - - python -collaborating_projects: -# suborganisation(s) to which this project belongs. - - stingray ---- -Implementing type hints in the Stingray library - -#### Description - -Despite being and remaining a dynamically-typed language, Python has -now a [working infrastructure for type hints](https://www.python.org/dev/peps/pep-0484/). -For a data analysis library, type hinting can be very useful to avoid explicit testing -for data types and to facilitate debugging. - - -#### Milestones (if any) - -##### Coding starts - -* Take confidence with the Stingray infrastructure. -* Start implementing type hints in the core modules of Stingray - -##### 1st evaluation - -* Create tests to enforce type checking in selected methods -* Extend the type hints infrastructure to most of the code base - -##### Final evaluation - -* Finish up, polish, and document properly diff --git a/_projects/2022/sunpy/.gitkeep b/_projects/2022/sunpy/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2023/.gitkeep b/_projects/2023/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2023/radis/out_of_core_calculations.md b/_projects/2023/radis/out_of_core_calculations.md deleted file mode 100644 index d7eb4916..00000000 --- a/_projects/2023/radis/out_of_core_calculations.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -name: Out-of-core calculations to reduce memory usage -desc: The project aims at reducing RADIS memory usage, and make it possible to compute very-large spectral databases of tens of gigabytes that do not fit in RAM memory. - -# add a short one line description of your project -requirements: -# Student requirements: - - Knowledge of Pandas or other DataFrame libraries - - Prior working knowledge with big data handling databases like Vaex -difficulty: medium -issues: - -mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - minouHub - - anandxkumar - - erwanp -initiatives: - - GSOC -project_size: - - 350 h -tags: -# Different technologies needed - - Python - - Vaex - - Pandas - - Git -collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis ---- - - -#### Description - -The RADIS code was developed for the characterization of plasmas, flames and atmospheres. High-temperature spectral calculations require to resolve the shape of tens of millions of lines, which is the usual performance bottleneck. RADIS implements a new algorithm to compute these lineshapes, and is already one of the fastest line-by-line spectral codes available. It can also compute many different types of spectra (absorption / emission / equilibrium / nonequilibrium). - -However, although the algorithm is very CPU/GPU efficient, the RADIS code is still memory-hungry. Databases are currently loaded in RADIS using the VAEX package, but the operations to calculate the spectra are performed using the PANDAS library. VAEX is a similar table management tool than PANDAS but uses memory mapping, a zero memory copy policy, and lazy computations for the best performance. **The main goal of the current project is to refactor RADIS so that dataframes are only manipulated via the VAEX format**. Potentially, this work would make it possible to compute spectral databases of up to billions of lines (hundred of GB or terabyte-scale databases). - - -#### Milestones - -##### Coding starts - -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) - -* Training on emission & absorption spectroscopy - -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) - -* Get familiar with RADIS architecture - -##### 1st Evaluation - -* Create a standalone spectroscopy code working with Out-of-core Vaex calculations (with minimum features: absorption code under equilibrium) - -##### 2nd Evaluation - -* Create a standalone spectroscopy code working with Out-of-core Vaex calculations (with minimum features: absorption code under equilibrium) - -* Implement VAEX out-of-core calculations directly in a single RADIS calculation path (e.g. equilibrium, one lineshape calculation routine), replacing PANDAS - -* Implement tests to verify that the implementation of VAEX will not have different output than the current PANDAS implementation - -##### Final evaluation - -* Implement VAEX out-of-core calculations directly in all othe other RADIS calculation paths (nonequilibrium, all lineshape calculations routine), replacing PANDAS - -* Have all code, tests, and documentation in GitHub. - - -#### Secondary Goals - -* Document architecture and developer guide when facing unclear points that may appear. - -* Review pull requests from other RADIS contributors, especially parallel GSoC mentee - -* List and explore consequences for GPU calculations already implemented in RADIS - - diff --git a/_projects/2023/sunpy/.gitkeep b/_projects/2023/sunpy/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2024/.gitkeep b/_projects/2024/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2024/sunpy/.gitkeep b/_projects/2024/sunpy/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2025/.gitkeep b/_projects/2025/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2025/sunpy/.gitkeep b/_projects/2025/sunpy/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2026/.gitkeep b/_projects/2026/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2026/juliaastro/.gitkeep b/_projects/2026/juliaastro/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2026/radis/.gitkeep b/_projects/2026/radis/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2026/stingray/.gitkeep b/_projects/2026/stingray/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/2026/sunpy/.gitkeep b/_projects/2026/sunpy/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/_projects/README.md b/_projects/README.md deleted file mode 100644 index 63f80639..00000000 --- a/_projects/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# How to add project ideas for OpenAstronomy - -This short tutorial will guide you on how to add a GSoC project idea in the -OpenAstronomy website. - -In case you face any issues with this tutorial do contact your org admins via email, -thorough the [mailing list](https://groups.google.com/forum/#!forum/openastronomy). - -*tl;dr: are you an expert?* Fork the repo and modify -the [template file](./_template.md) according to your idea, save it under -`_projects/YYYY/sub-org/` with a meaningful filename and open a pull-request. - -## What do I need for my project idea? - -Everything you need is a title and description of the project idea, a set of requirements -for potential contributors (_e.g._, proficiency with `astropy.tables` and `astropy.units`), -and a list of potential mentors. In addition, please link any related issues or tickets -to the project idea, if any. Lastly, make sure to indicate the level of difficulty of -the project. - -In case your project idea already has specific milestones, please add them -so as to make contributors aware when they start writing their applications. -If the project milestones are open ended and you would like to hear input from -other members of the community, that is fine too! - -## Required format - -Given that you have the above items, all you need now is to put them in a plain text file following -the [template file](./_template.md) (you may click on `Code` to see how it looks). - -The file is composed in two parts (separated by a `---`). -Change the text in the template keeping special care of the structure of the `yaml` -file and the headings on the markdown part (_e.g._, the top level starts with a 4 level title: `####`). - -## How to include my project idea on the website? - -If you are familiar with git/GitHub: for this repo and add your project idea -to the directory of your sub-organisation. Otherwise, we've got you covered! -Contact us via [email](openastronomy.organization@gmail.com) and attach the above file. diff --git a/_sass/_base.scss b/_sass/_base.scss deleted file mode 100644 index 24ff3dd2..00000000 --- a/_sass/_base.scss +++ /dev/null @@ -1,227 +0,0 @@ -/** - * Reset some basic elements - */ -body, h1, h2, h3, h4, h5, h6, -p, blockquote, pre, hr, -dl, dd, ol, ul, figure { - margin: 0; - padding: 0; -} - - -html { - height:100%; -} - -/** - * Basic styling - */ -body { - font-family: $base-font-family; - font-size: $base-font-size; - font-weight: 400; - color: $text-color; - background-color: $background-color; - -webkit-text-size-adjust: 100%; - height:100%; - - @include media-query($on-laptop) { - background-size: 200%; - } - - @include media-query($on-palm) { - background-size: 300%; - } -} - - - -/** - * Set `margin-bottom` to maintain vertical rhythm - */ -h1, h2, h3, h4, h5, h6, -p, blockquote, pre, -ul, ol, dl, figure, -%vertical-rhythm { - margin-bottom: $spacing-unit / 2; -} - - - -/** - * Images - */ -img { - max-width: 100%; - vertical-align: middle; -} - - - -/** - * Figures - */ -figure > img { - display: block; -} - -figcaption { - font-size: $small-font-size; -} - - - -/** - * Lists - */ -ul, ol { - margin-left: $spacing-unit; -} - -li { - > ul, - > ol { - margin-bottom: 0; - } -} - - - -/** - * Headings - */ -h1, h2, h3, h4, h5, h6 { - font-weight: 300; -} - - - -/** - * Links - */ -a { - color: $brand-color; - text-decoration: none; - - &:visited { - color: darken($brand-color, 15%); - } - - &:hover { - color: $text-color; - text-decoration: underline; - } -} - - - -/** - * Blockquotes - */ -blockquote { - color: $grey-color; - border-left: 4px solid $grey-color-light; - padding-left: $spacing-unit / 2; - font-size: 18px; - letter-spacing: -1px; - font-style: italic; - - > :last-child { - margin-bottom: 0; - } -} - - - -/** - * Code formatting - */ -pre, -code { - font-size: 15px; - border: 1px solid $grey-color-light; - border-radius: 3px; - background-color: #eef; -} - -code { - padding: 1px 5px; -} - -pre { - padding: 8px 12px; - overflow-x: scroll; - - > code { - border: 0; - padding-right: 0; - padding-left: 0; - } -} - - - -/** - * Wrapper - */ -.wrapper { - height: 100%; - max-width: -webkit-calc(1100px - (#{$spacing-unit} * 2)); - max-width: calc(1100px - (#{$spacing-unit} * 2)); - margin-right: auto; - margin-left: auto; - padding-right: $spacing-unit; - padding-left: $spacing-unit; - @extend %clearfix; - - @include media-query($on-laptop) { - max-width: -webkit-calc(1100px - (#{$spacing-unit})); - max-width: calc(1100px - (#{$spacing-unit})); - padding-right: $spacing-unit / 2; - padding-left: $spacing-unit / 2; - } -} - -.page-content > .wrapper { - padding-top: 10px; -} - - - -/** - * Clearfix - */ -%clearfix { - - &:after { - content: ""; - display: table; - clear: both; - } -} - - - -/** - * Icons - */ -.icon { - - > svg { - display: inline-block; - width: 16px; - height: 16px; - vertical-align: middle; - - path { - fill: $grey-color; - } - } -} - - -iframe { - height: 100%; - width: 100%; - border: none; -} diff --git a/_sass/_layout.scss b/_sass/_layout.scss deleted file mode 100644 index 684b8cde..00000000 --- a/_sass/_layout.scss +++ /dev/null @@ -1,343 +0,0 @@ -/** - * Site header - */ -.site-header { - min-height: 80px; - height: 80px; - - // Positioning context for the mobile navigation icon - position: relative; - z-index: 100; -} - -.site-title { - font-size: 26px; - line-height: 36px; - letter-spacing: -1px; - margin-bottom: -1px; - float: left; - - &, - &:visited { - color: $grey-color-dark; - } -} - -.site-nav { - float: right; - line-height: 56px; - - .menu-icon { - display: none; - } - - .page-link { - color: $text-color; - line-height: $base-line-height; - - // Gaps between nav items, but not on the first one - &:not(:first-child) { - margin-left: 20px; - } - } - - @include media-query($on-desktop) { - position: absolute; - top: 20px; - right: 30px; - background-color: $menu-color; - border: 1px solid $grey-color-light; - border-radius: 5px; - text-align: right; - - .menu-icon { - display: block; - float: right; - width: 36px; - height: 26px; - line-height: 0; - padding-top: 10px; - text-align: center; - - > svg { - width: 18px; - height: 15px; - - path { - fill: white; - } - } - } - - .trigger { - clear: both; - display: none; - } - - &:hover .trigger { - display: block; - padding-bottom: 5px; - } - - .page-link { - display: block; - padding: 5px 10px; - } - } -} - - - -/** - * Site footer - */ -.site-footer { - border-top: 1px solid $grey-color-light; - padding: $spacing-unit / 2 0; - - @include media-query($on-palm) { - .wrapper { - display: block; /* Ensure all elements stack properly */ - } - - .footer-col { - float: none; - width: 100%; /* Ensure columns stack on mobile */ - } - } -} - -.footer-heading { - font-size: 18px; - margin-bottom: $spacing-unit / 2; -} - -.contact-list, -.social-media-list { - list-style: none; - margin-left: 0; -} - -.footer-col-wrapper { - font-size: 15px; - color: $grey-color; - margin-left: -$spacing-unit / 2; - @extend %clearfix; -} - -.footer-col { - float: left; - margin-bottom: $spacing-unit / 2; - padding-left: $spacing-unit / 2; -} - -.footer-col-1 { - width: -webkit-calc(35% - (#{$spacing-unit} / 2)); - width: calc(35% - (#{$spacing-unit} / 2)); -} - -.footer-col-2 { - width: -webkit-calc(20% - (#{$spacing-unit} / 2)); - width: calc(20% - (#{$spacing-unit} / 2)); -} - -.footer-col-3 { - width: -webkit-calc(45% - (#{$spacing-unit} / 2)); - width: calc(45% - (#{$spacing-unit} / 2)); -} - -@include media-query($on-laptop) { - .footer-col-1, - .footer-col-2 { - width: -webkit-calc(50% - (#{$spacing-unit} / 2)); - width: calc(50% - (#{$spacing-unit} / 2)); - } - - .footer-col-3 { - width: -webkit-calc(100% - (#{$spacing-unit} / 2)); - width: calc(100% - (#{$spacing-unit} / 2)); - } -} - -@include media-query($on-palm) { - .footer-col { - float: none; - width: -webkit-calc(100% - (#{$spacing-unit} / 2)); - width: calc(100% - (#{$spacing-unit} / 2)); - } -} - - -.fixed-wrap { - position: static; - top: auto; - left: auto; - bottom: auto; - width: 100%; -} - -/** - * Page content - */ -.page-content { - height: 100%; - overflow-y:auto; -} - -.page-heading { - font-size: 20px; -} - -.post-list { - margin-left: 0; - list-style: none; - - > li { - margin-bottom: $spacing-unit; - } -} - -.post-meta { - font-size: $small-font-size; - color: $grey-color; -} - -.post-link { - display: block; - font-size: 24px; -} - - - -/** - * Posts - */ -.post-header { - margin-bottom: $spacing-unit; -} - -.post-title { - font-size: 42px; - letter-spacing: -1px; - line-height: 1; - - @include media-query($on-laptop) { - font-size: 36px; - } -} - -.post-content { - margin-bottom: 75px; - - h2 { - font-size: 32px; - - @include media-query($on-laptop) { - font-size: 28px; - } - } - - h3 { - font-size: 26px; - - @include media-query($on-laptop) { - font-size: 22px; - } - } - - h4 { - font-size: 20px; - - @include media-query($on-laptop) { - font-size: 18px; - } - } -} - -// materialize modal stuff - so it works outside #projects (because modal put it out!) -.modal { - @extend .z-depth-4; - - display: none; - position: fixed; - left: 0; - right: 0; - background-color: #fafafa; - padding: 0; - max-height: 70%; - width: 55%; - margin: auto; - overflow-y: auto; - - border-radius: 2px; - will-change: top, opacity; - - h1,h2,h3,h4 { - margin-top: 0; - } - - .modal-content { - padding: 24px; - } - .modal-close { - cursor: pointer; - } - - .modal-footer { - border-radius: 0 0 2px 2px; - background-color: #fafafa; - padding: 4px 6px; - height: 56px; - width: 100%; - text-align: right; - - .btn, .btn-flat { - margin: 6px 0; - } - } -} -.modal-overlay { - position: fixed; - z-index: 999; - top: -25%; - left: 0; - bottom: 0; - right: 0; - height: 125%; - width: 100%; - background: #000; - display: none; - - will-change: opacity; -} - -// Modal with fixed action footer -.modal.modal-fixed-footer { - padding: 0; - height: 70%; - - .modal-content { - position: absolute; - height: calc(100% - 56px); - max-height: 100%; - width: 100%; - overflow-y: auto; - } - - .modal-footer { - border-top: 1px solid rgba(0,0,0,.1); - position: absolute; - bottom: 0; - } -} - -// Modal Bottom Sheet Style -.modal.bottom-sheet { - top: auto; - bottom: -100%; - margin: 0; - width: 100%; - max-height: 45%; - border-radius: 0; - will-change: bottom, opacity; -} diff --git a/_sass/_syntax-highlighting.scss b/_sass/_syntax-highlighting.scss deleted file mode 100644 index e36627da..00000000 --- a/_sass/_syntax-highlighting.scss +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Syntax highlighting styles - */ -.highlight { - background: #fff; - @extend %vertical-rhythm; - - .c { color: #998; font-style: italic } // Comment - .err { color: #a61717; background-color: #e3d2d2 } // Error - .k { font-weight: bold } // Keyword - .o { font-weight: bold } // Operator - .cm { color: #998; font-style: italic } // Comment.Multiline - .cp { color: #999; font-weight: bold } // Comment.Preproc - .c1 { color: #998; font-style: italic } // Comment.Single - .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special - .gd { color: #000; background-color: #fdd } // Generic.Deleted - .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific - .ge { font-style: italic } // Generic.Emph - .gr { color: #a00 } // Generic.Error - .gh { color: #999 } // Generic.Heading - .gi { color: #000; background-color: #dfd } // Generic.Inserted - .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific - .go { color: #888 } // Generic.Output - .gp { color: #555 } // Generic.Prompt - .gs { font-weight: bold } // Generic.Strong - .gu { color: #aaa } // Generic.Subheading - .gt { color: #a00 } // Generic.Traceback - .kc { font-weight: bold } // Keyword.Constant - .kd { font-weight: bold } // Keyword.Declaration - .kp { font-weight: bold } // Keyword.Pseudo - .kr { font-weight: bold } // Keyword.Reserved - .kt { color: #458; font-weight: bold } // Keyword.Type - .m { color: #099 } // Literal.Number - .s { color: #d14 } // Literal.String - .na { color: #008080 } // Name.Attribute - .nb { color: #0086B3 } // Name.Builtin - .nc { color: #458; font-weight: bold } // Name.Class - .no { color: #008080 } // Name.Constant - .ni { color: #800080 } // Name.Entity - .ne { color: #900; font-weight: bold } // Name.Exception - .nf { color: #900; font-weight: bold } // Name.Function - .nn { color: #555 } // Name.Namespace - .nt { color: #000080 } // Name.Tag - .nv { color: #008080 } // Name.Variable - .ow { font-weight: bold } // Operator.Word - .w { color: #bbb } // Text.Whitespace - .mf { color: #099 } // Literal.Number.Float - .mh { color: #099 } // Literal.Number.Hex - .mi { color: #099 } // Literal.Number.Integer - .mo { color: #099 } // Literal.Number.Oct - .sb { color: #d14 } // Literal.String.Backtick - .sc { color: #d14 } // Literal.String.Char - .sd { color: #d14 } // Literal.String.Doc - .s2 { color: #d14 } // Literal.String.Double - .se { color: #d14 } // Literal.String.Escape - .sh { color: #d14 } // Literal.String.Heredoc - .si { color: #d14 } // Literal.String.Interpol - .sx { color: #d14 } // Literal.String.Other - .sr { color: #009926 } // Literal.String.Regex - .s1 { color: #d14 } // Literal.String.Single - .ss { color: #990073 } // Literal.String.Symbol - .bp { color: #999 } // Name.Builtin.Pseudo - .vc { color: #008080 } // Name.Variable.Class - .vg { color: #008080 } // Name.Variable.Global - .vi { color: #008080 } // Name.Variable.Instance - .il { color: #099 } // Literal.Number.Integer.Long -} diff --git a/_sass/bootstrap-sass-3.3.7 b/_sass/bootstrap-sass-3.3.7 deleted file mode 160000 index 5d6b2ebb..00000000 --- a/_sass/bootstrap-sass-3.3.7 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5d6b2ebba0c2a5885ce2f0e01e9218db3d3b5e47 diff --git a/_sass/materialize-src/LICENSE b/_sass/materialize-src/LICENSE deleted file mode 100644 index 30b9ff6d..00000000 --- a/_sass/materialize-src/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2017 Materialize - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/_sass/materialize-src/README.md b/_sass/materialize-src/README.md deleted file mode 100644 index b1e31c80..00000000 --- a/_sass/materialize-src/README.md +++ /dev/null @@ -1,90 +0,0 @@ -

- - - - -

MaterializeCSS

- -

- Materialize, a CSS Framework based on material design. -
- -- Browse the docs -- -
-
- - Travis CI badge - - - npm version badge - - - CDNJS version badge - - - dependencies Status badge - - - devDependency Status badge - - - Gitter badge - -

- -## Table of Contents -- [Quickstart](#quickstart) -- [Documentation](#documentation) -- [Supported Browsers](#supported-browsers) -- [Changelog](#changelog) -- [Testing](#testing) -- [Contributing](#contributing) -- [Copyright and license](#copyright-and-license) - -## Quickstart: -Read the [getting started guide](http://materializecss.com/getting-started.html) for more information on how to use materialize. - -- [Download the latest release](https://github.com/Dogfalo/materialize/releases/latest) of materialize directly from GitHub. -- Clone the repo: `git clone https://github.com/Dogfalo/materialize.git` -- Include the files via [cdnjs](https://cdnjs.com/libraries/materialize). More [here](http://materializecss.com/getting-started.html). -- Install with [npm](https://www.npmjs.com): `npm install materialize-css` -- Install with [Bower](https://bower.io): `bower install materialize` -- Install with [Atmosphere](https://atmospherejs.com): `meteor add materialize:materialize` - -## Documentation -The documentation can be found at . To run the documentation locally on your machine, you need [Node.js](https://nodejs.org/en/) installed on your computer. - -### Running documentation locally -Run these commands to set up the documentation: - -```bash -git clone https://github.com/Dogfalo/materialize -cd materialize -npm install -``` - -Then run `grunt monitor` to compile the documentation. When it finishes, open a new browser window and navigate to `localhost:8000`. We use [BrowserSync](https://www.browsersync.io/) to display the documentation. - -### Documentation for previous releases -Previous releases and their documentation are available for [download](https://github.com/Dogfalo/materialize/releases). - -## Supported Browsers: -Materialize is compatible with: - -- Chrome 35+ -- Firefox 31+ -- Safari 7+ -- Opera -- Edge -- IE 10+ - -## Changelog -For changelogs, check out [the Releases section of materialize](https://github.com/Dogfalo/materialize/releases) or the [CHANGELOG.md](CHANGELOG.md). - -## Testing -We use Jasmine as our testing framework and we're trying to write a robust test suite for our components. If you want to help, [here's a starting guide on how to write tests in Jasmine](CONTRIBUTING.md#jasmine-testing-guide). - -## Contributing -Check out the [CONTRIBUTING document](CONTRIBUTING.md) in the root of the repository to learn how you can contribute. You can also browse the [help-wanted](https://github.com/Dogfalo/materialize/labels/help-wanted) tag in our issue tracker to find things to do. - -## Copyright and license -Code copyright 2017 Materialize. Code released under the MIT license. diff --git a/_sass/materialize-src/sass/components/_badges.scss b/_sass/materialize-src/sass/components/_badges.scss deleted file mode 100644 index ed8f1857..00000000 --- a/_sass/materialize-src/sass/components/_badges.scss +++ /dev/null @@ -1,47 +0,0 @@ -// Badges -span.badge { - min-width: 3rem; - padding: 0 6px; - margin-left: 14px; - text-align: center; - font-size: 1rem; - line-height: $badge-height; - height: $badge-height; - color: color('grey', 'darken-1'); - float: right; - box-sizing: border-box; - - &.new { - font-weight: 300; - font-size: 0.8rem; - color: #fff; - background-color: $badge-bg-color; - border-radius: 2px; - } - &.new:after { - content: " new"; - } - - &[data-badge-caption]::after { - content: " " attr(data-badge-caption); - } -} -nav ul a span.badge { - display: inline-block; - float: none; - margin-left: 4px; - line-height: $badge-height; - height: $badge-height; - -webkit-font-smoothing: auto; -} - -// Line height centering -.collection-item span.badge { - margin-top: calc(#{$collection-line-height / 2} - #{$badge-height / 2}); -} -.collapsible span.badge { - margin-left: auto; -} -.side-nav span.badge { - margin-top: calc(#{$sidenav-line-height / 2} - #{$badge-height / 2}); -} diff --git a/_sass/materialize-src/sass/components/_buttons.scss b/_sass/materialize-src/sass/components/_buttons.scss deleted file mode 100644 index 42730dd8..00000000 --- a/_sass/materialize-src/sass/components/_buttons.scss +++ /dev/null @@ -1,291 +0,0 @@ -// shared styles -.btn, -.btn-flat { - border: $button-border; - border-radius: $button-radius; - display: inline-block; - height: $button-height; - line-height: $button-height; - padding: $button-padding; - text-transform: uppercase; - vertical-align: middle; - // Gets rid of tap active state - -webkit-tap-highlight-color: transparent; -} - -// Disabled shared style -.btn.disabled, -.btn-floating.disabled, -.btn-large.disabled, -.btn-flat.disabled, -.btn:disabled, -.btn-floating:disabled, -.btn-large:disabled, -.btn-flat:disabled, -.btn[disabled], -.btn-floating[disabled], -.btn-large[disabled], -.btn-flat[disabled] { - pointer-events: none; - background-color: $button-disabled-background !important; - box-shadow: none; - color: $button-disabled-color !important; - cursor: default; - - &:hover { - background-color: $button-disabled-background !important; - color: $button-disabled-color !important; - } -} - -// Shared icon styles -.btn, -.btn-floating, -.btn-large, -.btn-flat { - font-size: $button-font-size; - outline: 0; - - i { - font-size: $button-icon-font-size; - line-height: inherit; - } -} - -// Shared focus button style -.btn, -.btn-floating { - &:focus { - background-color: darken($button-raised-background, 10%); - } -} - -// Raised Button -.btn { - text-decoration: none; - color: $button-raised-color; - background-color: $button-raised-background; - text-align: center; - letter-spacing: .5px; - @extend .z-depth-1; - transition: .2s ease-out; - cursor: pointer; - - &:hover { - background-color: $button-raised-background-hover; - @extend .z-depth-1-half; - } -} - -// Floating button -.btn-floating { - &:hover { - background-color: $button-floating-background-hover; - @extend .z-depth-1-half; - } - - &:before { - border-radius: 0; - } - - &.btn-large { - &.halfway-fab { - bottom: -$button-floating-large-size / 2; - } - - width: $button-floating-large-size; - height: $button-floating-large-size; - i { - line-height: $button-floating-large-size; - } - } - - &.halfway-fab { - &.left { - right: auto; - left: 24px; - } - - position: absolute; - right: 24px; - bottom: -$button-floating-size / 2; - } - - display: inline-block; - color: $button-floating-color; - position: relative; - overflow: hidden; - z-index: 1; - width: $button-floating-size; - height: $button-floating-size; - line-height: $button-floating-size; - padding: 0; - background-color: $button-floating-background; - border-radius: $button-floating-radius; - @extend .z-depth-1; - transition: .3s; - cursor: pointer; - vertical-align: middle; - - i { - width: inherit; - display: inline-block; - text-align: center; - color: $button-floating-color; - font-size: $button-large-icon-font-size; - line-height: $button-floating-size; - } -} - -// button fix -button.btn-floating { - border: $button-border; -} - -// Fixed Action Button -.fixed-action-btn { - &.active { - ul { - visibility: visible; - } - } - - &.horizontal { - padding: 0 0 0 15px; - - ul { - text-align: right; - right: 64px; - top: 50%; - transform: translateY(-50%); - height: 100%; - left: auto; - width: 500px; /*width 100% only goes to width of button container */ - - li { - display: inline-block; - margin: 15px 15px 0 0; - } - } - } - - &.toolbar { - &.active { - & > a i { - opacity: 0; - } - } - - padding: 0; - height: $button-floating-large-size; - - ul { - display: flex; - top: 0; - bottom: 0; - z-index: 1; - - li { - flex: 1; - display: inline-block; - margin: 0; - height: 100%; - transition: none; - - a { - display: block; - overflow: hidden; - position: relative; - width: 100%; - height: 100%; - background-color: transparent; - box-shadow: none; - color: #fff; - line-height: $button-floating-large-size; - z-index: 1; - - i { - line-height: inherit; - } - } - } - } - } - - position: fixed; - right: 23px; - bottom: 23px; - padding-top: 15px; - margin-bottom: 0; - z-index: 997; - - ul { - left: 0; - right: 0; - text-align: center; - position: absolute; - bottom: 64px; - margin: 0; - visibility: hidden; - - li { - margin-bottom: 15px; - } - - a.btn-floating { - opacity: 0; - } - } - - .fab-backdrop { - position: absolute; - top: 0; - left: 0; - z-index: -1; - width: $button-floating-size; - height: $button-floating-size; - background-color: $button-floating-background; - border-radius: $button-floating-radius; - transform: scale(0); - } -} - -// Flat button -.btn-flat { - box-shadow: none; - background-color: transparent; - color: $button-flat-color; - cursor: pointer; - transition: background-color .2s; - - &:focus, - &:hover { - box-shadow: none; - } - - &:focus { - background-color: rgba(0,0,0,.1); - } - - &.disabled { - background-color: transparent !important; - color: $button-flat-disabled-color !important; - cursor: default; - } -} - -// Large button -.btn-large { - @extend .btn; - height: $button-large-height; - line-height: $button-large-height; - - i { - font-size: $button-large-icon-font-size; - } -} - -// Block button -.btn-block { - display: block; -} diff --git a/_sass/materialize-src/sass/components/_cards.scss b/_sass/materialize-src/sass/components/_cards.scss deleted file mode 100644 index c9b02163..00000000 --- a/_sass/materialize-src/sass/components/_cards.scss +++ /dev/null @@ -1,196 +0,0 @@ - - -.card-panel { - transition: box-shadow .25s; - padding: $card-padding; - margin: $element-top-margin 0 $element-bottom-margin 0; - border-radius: 2px; - @extend .z-depth-1; - background-color: $card-bg-color; -} - -.card { - position: relative; - margin: $element-top-margin 0 $element-bottom-margin 0; - background-color: $card-bg-color; - transition: box-shadow .25s; - border-radius: 2px; - @extend .z-depth-1; - - - .card-title { - font-size: 24px; - font-weight: 300; - &.activator { - cursor: pointer; - } - } - - // Card Sizes - &.small, &.medium, &.large { - position: relative; - - .card-image { - max-height: 60%; - overflow: hidden; - } - .card-image + .card-content { - max-height: 40%; - } - .card-content { - max-height: 100%; - overflow: hidden; - } - .card-action { - position: absolute; - bottom: 0; - left: 0; - right: 0; - } - } - - &.small { - height: 300px; - } - - &.medium { - height: 400px; - } - - &.large { - height: 500px; - } - - // Horizontal Cards - &.horizontal { - &.small, &.medium, &.large { - .card-image { - height: 100%; - max-height: none; - overflow: visible; - - img { - height: 100%; - } - } - } - - display: flex; - - .card-image { - max-width: 50%; - img { - border-radius: 2px 0 0 2px; - max-width: 100%; - width: auto; - } - } - - .card-stacked { - display: flex; - flex-direction: column; - flex: 1; - position: relative; - - .card-content { - flex-grow: 1; - } - } - } - - // Sticky Action Section - &.sticky-action { - .card-action { - z-index: 2; - } - - .card-reveal { - z-index: 1; - padding-bottom: 64px; - } - } - - - - - .card-image { - position: relative; - - // Image background for content - img { - display: block; - border-radius: 2px 2px 0 0; - position: relative; - left: 0; - right: 0; - top: 0; - bottom: 0; - width: 100%; - } - - .card-title { - color: $card-bg-color; - position: absolute; - bottom: 0; - left: 0; - max-width: 100%; - padding: $card-padding; - } - } - - .card-content { - padding: $card-padding; - border-radius: 0 0 2px 2px; - - p { - margin: 0; - color: inherit; - } - .card-title { - display: block; - line-height: 32px; - margin-bottom: 8px; - - i { - line-height: 32px; - } - } - } - - .card-action { - &:last-child { - border-radius: 0 0 2px 2px; - } - position: relative; - background-color: inherit; - border-top: 1px solid rgba(160,160,160,.2); - padding: 16px $card-padding; - - a:not(.btn):not(.btn-large):not(.btn-floating) { - color: $card-link-color; - margin-right: $card-padding; - transition: color .3s ease; - text-transform: uppercase; - - &:hover { color: $card-link-color-light; } - } - } - - .card-reveal { - padding: $card-padding; - position: absolute; - background-color: $card-bg-color; - width: 100%; - overflow-y: auto; - left: 0; - top: 100%; - height: 100%; - z-index: 3; - display: none; - - .card-title { - cursor: pointer; - display: block; - } - } -} diff --git a/_sass/materialize-src/sass/components/_carousel.scss b/_sass/materialize-src/sass/components/_carousel.scss deleted file mode 100644 index fccdc826..00000000 --- a/_sass/materialize-src/sass/components/_carousel.scss +++ /dev/null @@ -1,90 +0,0 @@ -.carousel { - &.carousel-slider { - top: 0; - left: 0; - - .carousel-fixed-item { - &.with-indicators { - bottom: 68px; - } - - position: absolute; - left: 0; - right: 0; - bottom: 20px; - z-index: 1; - } - - .carousel-item { - width: 100%; - height: 100%; - min-height: $carousel-height; - position: absolute; - top: 0; - left: 0; - - h2 { - font-size: 24px; - font-weight: 500; - line-height: 32px; - } - - p { - font-size: 15px; - } - } - } - - overflow: hidden; - position: relative; - width: 100%; - height: $carousel-height; - perspective: 500px; - transform-style: preserve-3d; - transform-origin: 0% 50%; - - .carousel-item { - display: none; - width: $carousel-item-width; - height: $carousel-item-height; - position: absolute; - top: 0; - left: 0; - - & > img { - width: 100%; - } - } - - .indicators { - position: absolute; - text-align: center; - left: 0; - right: 0; - bottom: 0; - margin: 0; - - .indicator-item { - &.active { - background-color: #fff; - } - - display: inline-block; - position: relative; - cursor: pointer; - height: 8px; - width: 8px; - margin: 24px 4px; - background-color: rgba(255,255,255,.5); - - transition: background-color .3s; - border-radius: 50%; - } - } - - // Materialbox compatibility - &.scrolling .carousel-item .materialboxed, - .carousel-item:not(.active) .materialboxed { - pointer-events: none; - } -} diff --git a/_sass/materialize-src/sass/components/_chips.scss b/_sass/materialize-src/sass/components/_chips.scss deleted file mode 100644 index c291578d..00000000 --- a/_sass/materialize-src/sass/components/_chips.scss +++ /dev/null @@ -1,89 +0,0 @@ -.chip { - display: inline-block; - height: 32px; - font-size: 13px; - font-weight: 500; - color: rgba(0,0,0,.6); - line-height: 32px; - padding: 0 12px; - border-radius: 16px; - background-color: $chip-bg-color; - margin-bottom: $chip-margin; - margin-right: $chip-margin; - - > img { - float: left; - margin: 0 8px 0 -12px; - height: 32px; - width: 32px; - border-radius: 50%; - } - - .close { - cursor: pointer; - float: right; - font-size: 16px; - line-height: 32px; - padding-left: 8px; - } -} - -.chips { - border: none; - border-bottom: 1px solid $chip-border-color; - box-shadow: none; - margin: $input-margin; - min-height: 45px; - outline: none; - transition: all .3s; - - &.focus { - border-bottom: 1px solid $chip-selected-color; - box-shadow: 0 1px 0 0 $chip-selected-color; - } - - &:hover { - cursor: text; - } - - .chip.selected { - background-color: $chip-selected-color; - color: #fff; - } - - .input { - background: none; - border: 0; - color: rgba(0,0,0,.6); - display: inline-block; - font-size: $input-font-size; - height: $input-height; - line-height: 32px; - outline: 0; - margin: 0; - padding: 0 !important; - width: 120px !important; - } - - .input:focus { - border: 0 !important; - box-shadow: none !important; - } - - // Autocomplete - .autocomplete-content { - margin-top: 0; - margin-bottom: 0; - } -} - -// Form prefix -.prefix ~ .chips { - margin-left: 3rem; - width: 92%; - width: calc(100% - 3rem); -} -.chips:empty ~ label { - font-size: 0.8rem; - transform: translateY(-140%); -} diff --git a/_sass/materialize-src/sass/components/_collapsible.scss b/_sass/materialize-src/sass/components/_collapsible.scss deleted file mode 100644 index ef59d968..00000000 --- a/_sass/materialize-src/sass/components/_collapsible.scss +++ /dev/null @@ -1,84 +0,0 @@ -.collapsible { - border-top: 1px solid $collapsible-border-color; - border-right: 1px solid $collapsible-border-color; - border-left: 1px solid $collapsible-border-color; - margin: $element-top-margin 0 $element-bottom-margin 0; - @extend .z-depth-1; -} - -.collapsible-header { - display: flex; - cursor: pointer; - -webkit-tap-highlight-color: transparent; - line-height: 1.5; - padding: 1rem; - background-color: $collapsible-header-color; - border-bottom: 1px solid $collapsible-border-color; - - i { - width: 2rem; - font-size: 1.6rem; - display: inline-block; - text-align: center; - margin-right: 1rem; - } -} - -.collapsible-body { - display: none; - border-bottom: 1px solid $collapsible-border-color; - box-sizing: border-box; - padding: 2rem; -} - -// sideNav collapsible styling -.side-nav, -.side-nav.fixed { - - .collapsible { - border: none; - box-shadow: none; - - li { padding: 0; } - } - - .collapsible-header { - background-color: transparent; - border: none; - line-height: inherit; - height: inherit; - padding: 0 $sidenav-padding; - - &:hover { background-color: rgba(0,0,0,.05); } - i { line-height: inherit; } - } - - .collapsible-body { - border: 0; - background-color: $collapsible-header-color; - - li a { - padding: 0 (7.5px + $sidenav-padding) - 0 (15px + $sidenav-padding); - } - } - -} - -// Popout Collapsible - -.collapsible.popout { - border: none; - box-shadow: none; - > li { - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); - // transform: scaleX(.92); - margin: 0 24px; - transition: margin .35s cubic-bezier(0.250, 0.460, 0.450, 0.940); - } - > li.active { - box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); - margin: 16px 0; - // transform: scaleX(1); - } -} diff --git a/_sass/materialize-src/sass/components/_color.scss b/_sass/materialize-src/sass/components/_color.scss deleted file mode 100644 index bf4b1237..00000000 --- a/_sass/materialize-src/sass/components/_color.scss +++ /dev/null @@ -1,412 +0,0 @@ -// Utility Color Classes - -//.success { -// -//} - -// Google Color Palette defined: http://www.google.com/design/spec/style/color.html - - -$materialize-red: ( - "base": #e51c23, - "lighten-5": #fdeaeb, - "lighten-4": #f8c1c3, - "lighten-3": #f3989b, - "lighten-2": #ee6e73, - "lighten-1": #ea454b, - "darken-1": #d0181e, - "darken-2": #b9151b, - "darken-3": #a21318, - "darken-4": #8b1014, -); - -$red: ( - "base": #F44336, - "lighten-5": #FFEBEE, - "lighten-4": #FFCDD2, - "lighten-3": #EF9A9A, - "lighten-2": #E57373, - "lighten-1": #EF5350, - "darken-1": #E53935, - "darken-2": #D32F2F, - "darken-3": #C62828, - "darken-4": #B71C1C, - "accent-1": #FF8A80, - "accent-2": #FF5252, - "accent-3": #FF1744, - "accent-4": #D50000 -); - -$pink: ( - "base": #e91e63, - "lighten-5": #fce4ec, - "lighten-4": #f8bbd0, - "lighten-3": #f48fb1, - "lighten-2": #f06292, - "lighten-1": #ec407a, - "darken-1": #d81b60, - "darken-2": #c2185b, - "darken-3": #ad1457, - "darken-4": #880e4f, - "accent-1": #ff80ab, - "accent-2": #ff4081, - "accent-3": #f50057, - "accent-4": #c51162 -); - -$purple: ( - "base": #9c27b0, - "lighten-5": #f3e5f5, - "lighten-4": #e1bee7, - "lighten-3": #ce93d8, - "lighten-2": #ba68c8, - "lighten-1": #ab47bc, - "darken-1": #8e24aa, - "darken-2": #7b1fa2, - "darken-3": #6a1b9a, - "darken-4": #4a148c, - "accent-1": #ea80fc, - "accent-2": #e040fb, - "accent-3": #d500f9, - "accent-4": #aa00ff -); - -$deep-purple: ( - "base": #673ab7, - "lighten-5": #ede7f6, - "lighten-4": #d1c4e9, - "lighten-3": #b39ddb, - "lighten-2": #9575cd, - "lighten-1": #7e57c2, - "darken-1": #5e35b1, - "darken-2": #512da8, - "darken-3": #4527a0, - "darken-4": #311b92, - "accent-1": #b388ff, - "accent-2": #7c4dff, - "accent-3": #651fff, - "accent-4": #6200ea -); - -$indigo: ( - "base": #3f51b5, - "lighten-5": #e8eaf6, - "lighten-4": #c5cae9, - "lighten-3": #9fa8da, - "lighten-2": #7986cb, - "lighten-1": #5c6bc0, - "darken-1": #3949ab, - "darken-2": #303f9f, - "darken-3": #283593, - "darken-4": #1a237e, - "accent-1": #8c9eff, - "accent-2": #536dfe, - "accent-3": #3d5afe, - "accent-4": #304ffe -); - -$blue: ( - "base": #2196F3, - "lighten-5": #E3F2FD, - "lighten-4": #BBDEFB, - "lighten-3": #90CAF9, - "lighten-2": #64B5F6, - "lighten-1": #42A5F5, - "darken-1": #1E88E5, - "darken-2": #1976D2, - "darken-3": #1565C0, - "darken-4": #0D47A1, - "accent-1": #82B1FF, - "accent-2": #448AFF, - "accent-3": #2979FF, - "accent-4": #2962FF -); - -$light-blue: ( - "base": #03a9f4, - "lighten-5": #e1f5fe, - "lighten-4": #b3e5fc, - "lighten-3": #81d4fa, - "lighten-2": #4fc3f7, - "lighten-1": #29b6f6, - "darken-1": #039be5, - "darken-2": #0288d1, - "darken-3": #0277bd, - "darken-4": #01579b, - "accent-1": #80d8ff, - "accent-2": #40c4ff, - "accent-3": #00b0ff, - "accent-4": #0091ea -); - -$cyan: ( - "base": #00bcd4, - "lighten-5": #e0f7fa, - "lighten-4": #b2ebf2, - "lighten-3": #80deea, - "lighten-2": #4dd0e1, - "lighten-1": #26c6da, - "darken-1": #00acc1, - "darken-2": #0097a7, - "darken-3": #00838f, - "darken-4": #006064, - "accent-1": #84ffff, - "accent-2": #18ffff, - "accent-3": #00e5ff, - "accent-4": #00b8d4 -); - -$teal: ( - "base": #009688, - "lighten-5": #e0f2f1, - "lighten-4": #b2dfdb, - "lighten-3": #80cbc4, - "lighten-2": #4db6ac, - "lighten-1": #26a69a, - "darken-1": #00897b, - "darken-2": #00796b, - "darken-3": #00695c, - "darken-4": #004d40, - "accent-1": #a7ffeb, - "accent-2": #64ffda, - "accent-3": #1de9b6, - "accent-4": #00bfa5 -); - -$green: ( - "base": #4CAF50, - "lighten-5": #E8F5E9, - "lighten-4": #C8E6C9, - "lighten-3": #A5D6A7, - "lighten-2": #81C784, - "lighten-1": #66BB6A, - "darken-1": #43A047, - "darken-2": #388E3C, - "darken-3": #2E7D32, - "darken-4": #1B5E20, - "accent-1": #B9F6CA, - "accent-2": #69F0AE, - "accent-3": #00E676, - "accent-4": #00C853 -); - -$light-green: ( - "base": #8bc34a, - "lighten-5": #f1f8e9, - "lighten-4": #dcedc8, - "lighten-3": #c5e1a5, - "lighten-2": #aed581, - "lighten-1": #9ccc65, - "darken-1": #7cb342, - "darken-2": #689f38, - "darken-3": #558b2f, - "darken-4": #33691e, - "accent-1": #ccff90, - "accent-2": #b2ff59, - "accent-3": #76ff03, - "accent-4": #64dd17 -); - -$lime: ( - "base": #cddc39, - "lighten-5": #f9fbe7, - "lighten-4": #f0f4c3, - "lighten-3": #e6ee9c, - "lighten-2": #dce775, - "lighten-1": #d4e157, - "darken-1": #c0ca33, - "darken-2": #afb42b, - "darken-3": #9e9d24, - "darken-4": #827717, - "accent-1": #f4ff81, - "accent-2": #eeff41, - "accent-3": #c6ff00, - "accent-4": #aeea00 -); - -$yellow: ( - "base": #ffeb3b, - "lighten-5": #fffde7, - "lighten-4": #fff9c4, - "lighten-3": #fff59d, - "lighten-2": #fff176, - "lighten-1": #ffee58, - "darken-1": #fdd835, - "darken-2": #fbc02d, - "darken-3": #f9a825, - "darken-4": #f57f17, - "accent-1": #ffff8d, - "accent-2": #ffff00, - "accent-3": #ffea00, - "accent-4": #ffd600 -); - -$amber: ( - "base": #ffc107, - "lighten-5": #fff8e1, - "lighten-4": #ffecb3, - "lighten-3": #ffe082, - "lighten-2": #ffd54f, - "lighten-1": #ffca28, - "darken-1": #ffb300, - "darken-2": #ffa000, - "darken-3": #ff8f00, - "darken-4": #ff6f00, - "accent-1": #ffe57f, - "accent-2": #ffd740, - "accent-3": #ffc400, - "accent-4": #ffab00 -); - -$orange: ( - "base": #ff9800, - "lighten-5": #fff3e0, - "lighten-4": #ffe0b2, - "lighten-3": #ffcc80, - "lighten-2": #ffb74d, - "lighten-1": #ffa726, - "darken-1": #fb8c00, - "darken-2": #f57c00, - "darken-3": #ef6c00, - "darken-4": #e65100, - "accent-1": #ffd180, - "accent-2": #ffab40, - "accent-3": #ff9100, - "accent-4": #ff6d00 -); - -$deep-orange: ( - "base": #ff5722, - "lighten-5": #fbe9e7, - "lighten-4": #ffccbc, - "lighten-3": #ffab91, - "lighten-2": #ff8a65, - "lighten-1": #ff7043, - "darken-1": #f4511e, - "darken-2": #e64a19, - "darken-3": #d84315, - "darken-4": #bf360c, - "accent-1": #ff9e80, - "accent-2": #ff6e40, - "accent-3": #ff3d00, - "accent-4": #dd2c00 -); - -$brown: ( - "base": #795548, - "lighten-5": #efebe9, - "lighten-4": #d7ccc8, - "lighten-3": #bcaaa4, - "lighten-2": #a1887f, - "lighten-1": #8d6e63, - "darken-1": #6d4c41, - "darken-2": #5d4037, - "darken-3": #4e342e, - "darken-4": #3e2723 -); - -$blue-grey: ( - "base": #607d8b, - "lighten-5": #eceff1, - "lighten-4": #cfd8dc, - "lighten-3": #b0bec5, - "lighten-2": #90a4ae, - "lighten-1": #78909c, - "darken-1": #546e7a, - "darken-2": #455a64, - "darken-3": #37474f, - "darken-4": #263238 -); - -$grey: ( - "base": #9e9e9e, - "lighten-5": #fafafa, - "lighten-4": #f5f5f5, - "lighten-3": #eeeeee, - "lighten-2": #e0e0e0, - "lighten-1": #bdbdbd, - "darken-1": #757575, - "darken-2": #616161, - "darken-3": #424242, - "darken-4": #212121 -); - -$shades: ( - "black": #000000, - "white": #FFFFFF, - "transparent": transparent -); - -$colors: ( - "materialize-red": $materialize-red, - "red": $red, - "pink": $pink, - "purple": $purple, - "deep-purple": $deep-purple, - "indigo": $indigo, - "blue": $blue, - "light-blue": $light-blue, - "cyan": $cyan, - "teal": $teal, - "green": $green, - "light-green": $light-green, - "lime": $lime, - "yellow": $yellow, - "amber": $amber, - "orange": $orange, - "deep-orange": $deep-orange, - "brown": $brown, - "blue-grey": $blue-grey, - "grey": $grey, - "shades": $shades -) !default; - - -// Color Classes - -@each $color_name, $color in $colors { - @each $color_type, $color_value in $color { - @if $color_type == "base" { - .#{$color_name} { - background-color: $color_value !important; - } - .#{$color_name}-text { - color: $color_value !important; - } - } - @else if $color_name != "shades" { - .#{$color_name}.#{$color_type} { - background-color: $color_value !important; - } - .#{$color_name}-text.text-#{$color_type} { - color: $color_value !important; - } - } - } -} - -// Shade classes -@each $color, $color_value in $shades { - .#{$color} { - background-color: $color_value !important; - } - .#{$color}-text { - color: $color_value !important; - } -} - - -// usage: color("name_of_color", "type_of_color") -// to avoid to repeating map-get($colors, ...) - -@function color($color, $type) { - @if map-has-key($colors, $color) { - $curr_color: map-get($colors, $color); - @if map-has-key($curr_color, $type) { - @return map-get($curr_color, $type); - } - } - @warn "Unknown `#{$color}` - `#{$type}` in $colors."; - @return null; -} - diff --git a/_sass/materialize-src/sass/components/_dropdown.scss b/_sass/materialize-src/sass/components/_dropdown.scss deleted file mode 100644 index 27131b5f..00000000 --- a/_sass/materialize-src/sass/components/_dropdown.scss +++ /dev/null @@ -1,68 +0,0 @@ -.dropdown-content { - @extend .z-depth-1; - background-color: $dropdown-bg-color; - margin: 0; - display: none; - min-width: 100px; - max-height: 650px; - overflow-y: auto; - opacity: 0; - position: absolute; - z-index: 999; - will-change: width, height; - - li { - clear: both; - color: $off-black; - cursor: pointer; - min-height: $dropdown-item-height; - line-height: 1.5rem; - width: 100%; - text-align: left; - text-transform: none; - - &:hover, &.active, &.selected { - background-color: $dropdown-hover-bg-color; - } - - &.active.selected { - background-color: darken($dropdown-hover-bg-color, 5%); - } - - &.divider { - min-height: 0; - height: 1px; - } - - & > a, & > span { - font-size: 16px; - color: $dropdown-color; - display: block; - line-height: 22px; - padding: (($dropdown-item-height - 22) / 2) 16px; - } - - & > span > label { - top: 1px; - left: 0; - height: 18px; - } - - // Icon alignment override - & > a > i { - height: inherit; - line-height: inherit; - float: left; - margin: 0 24px 0 0; - width: 24px; - } - } -} - -// Input field specificity bugfix -.input-field.col .dropdown-content [type="checkbox"] + label { - top: 1px; - left: 0; - height: 18px; -} - diff --git a/_sass/materialize-src/sass/components/_global.scss b/_sass/materialize-src/sass/components/_global.scss deleted file mode 100644 index 5a7709f7..00000000 --- a/_sass/materialize-src/sass/components/_global.scss +++ /dev/null @@ -1,734 +0,0 @@ -//Default styles - -html { - box-sizing: border-box; -} -*, *:before, *:after { - box-sizing: inherit; -} - -body { - // display: flex; - // min-height: 100vh; - // flex-direction: column; -} - -main { - // flex: 1 0 auto; -} - -ul { - &:not(.browser-default) { - padding-left: 0; - list-style-type: none; - - & > li { - list-style-type: none; - } - } -} - -a { - color: $link-color; - text-decoration: none; - - // Gets rid of tap active state - -webkit-tap-highlight-color: transparent; -} - - -// Positioning -.valign-wrapper { - display: flex; - align-items: center; -} - - -// classic clearfix -.clearfix { - clear: both; -} - - -// Z-levels -.z-depth-0 { - box-shadow: none !important; -} -.z-depth-1 { - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); -} -.z-depth-1-half { - box-shadow: 0 3px 3px 0 rgba(0, 0, 0, 0.14), 0 1px 7px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -1px rgba(0, 0, 0, 0.2); -} -.z-depth-2 { - box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3); -} -.z-depth-3 { - box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.3); -} -.z-depth-4 { - box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.3); -} -.z-depth-5 { - box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.3); -} - -.hoverable { - transition: box-shadow .25s; - - &:hover { - box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); - } -} - -// Dividers - -.divider { - height: 1px; - overflow: hidden; - background-color: color("grey", "lighten-2"); -} - - -// Blockquote - -blockquote { - margin: 20px 0; - padding-left: 1.5rem; - border-left: 5px solid $primary-color; -} - -// Icon Styles - -i { - line-height: inherit; - - &.left { - float: left; - margin-right: 15px; - } - &.right { - float: right; - margin-left: 15px; - } - &.tiny { - font-size: 1rem; - } - &.small { - font-size: 2rem; - } - &.medium { - font-size: 4rem; - } - &.large { - font-size: 6rem; - } -} - -// Images -img.responsive-img, -video.responsive-video { - max-width: 100%; - height: auto; -} - - -// Pagination - -.pagination { - - li { - display: inline-block; - border-radius: 2px; - text-align: center; - vertical-align: top; - height: 30px; - - a { - color: #444; - display: inline-block; - font-size: 1.2rem; - padding: 0 10px; - line-height: 30px; - } - - &.active a { color: #fff; } - - &.active { background-color: $primary-color; } - - &.disabled a { - cursor: default; - color: #999; - } - - i { - font-size: 2rem; - } - } - - - li.pages ul li { - display: inline-block; - float: none; - } -} -@media #{$medium-and-down} { - .pagination { - width: 100%; - - li.prev, - li.next { - width: 10%; - } - - li.pages { - width: 80%; - overflow: hidden; - white-space: nowrap; - } - } -} - -// Breadcrumbs -.breadcrumb { - font-size: 18px; - color: rgba(255,255,255, .7); - - i, - [class^="mdi-"], [class*="mdi-"], - i.material-icons { - display: inline-block; - float: left; - font-size: 24px; - } - - &:before { - content: '\E5CC'; - color: rgba(255,255,255, .7); - vertical-align: top; - display: inline-block; - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 25px; - margin: 0 10px 0 8px; - -webkit-font-smoothing: antialiased; - } - - &:first-child:before { - display: none; - } - - &:last-child { - color: #fff; - } -} - -// Parallax -.parallax-container { - position: relative; - overflow: hidden; - height: 500px; - - .parallax { - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: -1; - - img { - display: none; - position: absolute; - left: 50%; - bottom: 0; - min-width: 100%; - min-height: 100%; - transform: translate3d(0,0,0); - transform: translateX(-50%); - } - } -} - -// Pushpin -.pin-top, .pin-bottom { - position: relative; -} -.pinned { - position: fixed !important; -} - -/********************* - Transition Classes -**********************/ - -ul.staggered-list li { - opacity: 0; -} - -.fade-in { - opacity: 0; - transform-origin: 0 50%; -} - - -/********************* - Media Query Classes -**********************/ -.hide-on-small-only, .hide-on-small-and-down { - @media #{$small-and-down} { - display: none !important; - } -} -.hide-on-med-and-down { - @media #{$medium-and-down} { - display: none !important; - } -} -.hide-on-med-and-up { - @media #{$medium-and-up} { - display: none !important; - } -} -.hide-on-med-only { - @media only screen and (min-width: $small-screen) and (max-width: $medium-screen) { - display: none !important; - } -} -.hide-on-large-only { - @media #{$large-and-up} { - display: none !important; - } -} -.show-on-large { - @media #{$large-and-up} { - display: block !important; - } -} -.show-on-medium { - @media only screen and (min-width: $small-screen) and (max-width: $medium-screen) { - display: block !important; - } -} -.show-on-small { - @media #{$small-and-down} { - display: block !important; - } -} -.show-on-medium-and-up { - @media #{$medium-and-up} { - display: block !important; - } -} -.show-on-medium-and-down { - @media #{$medium-and-down} { - display: block !important; - } -} - - -// Center text on mobile -.center-on-small-only { - @media #{$small-and-down} { - text-align: center; - } -} - -// Footer -.page-footer { - padding-top: 20px; - color: $footer-font-color; - background-color: $footer-bg-color; - - .footer-copyright { - overflow: hidden; - min-height: 50px; - display: flex; - align-items: center; - padding: 10px 0px; - color: $footer-copyright-font-color; - background-color: $footer-copyright-bg-color; - @extend .light; - } -} - -// Tables -table, th, td { - border: none; -} - -table { - width:100%; - display: table; - - &.bordered > thead > tr, - &.bordered > tbody > tr { - border-bottom: 1px solid $table-border-color; - } - - &.striped > tbody { - > tr:nth-child(odd) { - background-color: $table-striped-color; - } - - > tr > td { - border-radius: 0; - } - } - - &.highlight > tbody > tr { - transition: background-color .25s ease; - &:hover { - background-color: $table-striped-color; - } - } - - &.centered { - thead tr th, tbody tr td { - text-align: center; - } - } - -} - -thead { - border-bottom: 1px solid $table-border-color; -} - -td, th{ - padding: 15px 5px; - display: table-cell; - text-align: left; - vertical-align: middle; - border-radius: 2px; -} - -// Responsive Table -@media #{$medium-and-down} { - - table.responsive-table { - width: 100%; - border-collapse: collapse; - border-spacing: 0; - display: block; - position: relative; - - td:empty:before { - content: '\00a0'; - } - - th, - td { - margin: 0; - vertical-align: top; - } - - th { text-align: left; } - thead { - display: block; - float: left; - - tr { - display: block; - padding: 0 10px 0 0; - - th::before { - content: "\00a0"; - } - } - } - tbody { - display: block; - width: auto; - position: relative; - overflow-x: auto; - white-space: nowrap; - - tr { - display: inline-block; - vertical-align: top; - } - } - th { - display: block; - text-align: right; - } - td { - display: block; - min-height: 1.25em; - text-align: left; - } - tr { padding: 0 10px; } - - /* sort out borders */ - thead { - border: 0; - border-right: 1px solid $table-border-color; - } - - &.bordered { - th { border-bottom: 0; border-left: 0; } - td { border-left: 0; border-right: 0; border-bottom: 0; } - tr { border: 0; } - tbody tr { border-right: 1px solid $table-border-color; } - } - - } - -} - - -// Collections -.collection { - margin: $element-top-margin 0 $element-bottom-margin 0; - border: 1px solid $collection-border-color; - border-radius: 2px; - overflow: hidden; - position: relative; - - .collection-item { - background-color: $collection-bg-color; - line-height: $collection-line-height; - padding: 10px 20px; - margin: 0; - border-bottom: 1px solid $collection-border-color; - - // Avatar Collection - &.avatar { - min-height: 84px; - padding-left: 72px; - position: relative; - - // Don't style circles inside preloader classes. - &:not(.circle-clipper) > .circle, - :not(.circle-clipper) > .circle { - position: absolute; - width: 42px; - height: 42px; - overflow: hidden; - left: 15px; - display: inline-block; - vertical-align: middle; - } - i.circle { - font-size: 18px; - line-height: 42px; - color: #fff; - background-color: #999; - text-align: center; - } - - - .title { - font-size: 16px; - } - - p { - margin: 0; - } - - .secondary-content { - position: absolute; - top: 16px; - right: 16px; - } - - } - - - &:last-child { - border-bottom: none; - } - - &.active { - background-color: $collection-active-bg-color; - color: $collection-active-color; - - .secondary-content { - color: #fff; - } - } - } - a.collection-item{ - display: block; - transition: .25s; - color: $collection-link-color; - &:not(.active) { - &:hover { - background-color: $collection-hover-bg-color; - } - } - } - - &.with-header { - .collection-header { - background-color: $collection-bg-color; - border-bottom: 1px solid $collection-border-color; - padding: 10px 20px; - } - .collection-item { - padding-left: 30px; - } - .collection-item.avatar { - padding-left: 72px; - } - } - -} -// Made less specific to allow easier overriding -.secondary-content { - float: right; - color: $secondary-color; -} -.collapsible .collection { - margin: 0; - border: none; -} - - - -// Responsive Videos -.video-container { - position: relative; - padding-bottom: 56.25%; - height: 0; - overflow: hidden; - - iframe, object, embed { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - } -} - -// Progress Bar -.progress { - position: relative; - height: 4px; - display: block; - width: 100%; - background-color: lighten($progress-bar-color, 40%); - border-radius: 2px; - margin: $element-top-margin 0 $element-bottom-margin 0; - overflow: hidden; - .determinate { - position: absolute; - top: 0; - left: 0; - bottom: 0; - background-color: $progress-bar-color; - transition: width .3s linear; - } - .indeterminate { - background-color: $progress-bar-color; - &:before { - content: ''; - position: absolute; - background-color: inherit; - top: 0; - left:0; - bottom: 0; - will-change: left, right; - // Custom bezier - animation: indeterminate 2.1s cubic-bezier(0.650, 0.815, 0.735, 0.395) infinite; - - } - &:after { - content: ''; - position: absolute; - background-color: inherit; - top: 0; - left:0; - bottom: 0; - will-change: left, right; - // Custom bezier - animation: indeterminate-short 2.1s cubic-bezier(0.165, 0.840, 0.440, 1.000) infinite; - animation-delay: 1.15s; - } - } -} -@keyframes indeterminate { - 0% { - left: -35%; - right:100%; - } - 60% { - left: 100%; - right: -90%; - } - 100% { - left: 100%; - right: -90%; - } -} - -@keyframes indeterminate-short { - 0% { - left: -200%; - right: 100%; - } - 60% { - left: 107%; - right: -8%; - } - 100% { - left: 107%; - right: -8%; - } -} - - -/******************* - Utility Classes -*******************/ - -.hide { - display: none !important; -} - -// Text Align -.left-align { - text-align: left; -} -.right-align { - text-align: right -} -.center, .center-align { - text-align: center; -} - -.left { - float: left !important; -} -.right { - float: right !important; -} - -// No Text Select -.no-select { - user-select: none; -} - -.circle { - border-radius: 50%; -} - -.center-block { - display: block; - margin-left: auto; - margin-right: auto; -} - -.truncate { - display: block; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.no-padding { - padding: 0 !important; -} diff --git a/_sass/materialize-src/sass/components/_grid.scss b/_sass/materialize-src/sass/components/_grid.scss deleted file mode 100644 index 7aa9e8fd..00000000 --- a/_sass/materialize-src/sass/components/_grid.scss +++ /dev/null @@ -1,156 +0,0 @@ -.container { - margin: 0 auto; - max-width: 1280px; - width: 90%; -} -@media #{$medium-and-up} { - .container { - width: 85%; - } -} -@media #{$large-and-up} { - .container { - width: 70%; - } -} -.container .row { - margin-left: (-1 * $gutter-width / 2); - margin-right: (-1 * $gutter-width / 2); -} - -.section { - padding-top: 1rem; - padding-bottom: 1rem; - - &.no-pad { - padding: 0; - } - &.no-pad-bot { - padding-bottom: 0; - } - &.no-pad-top { - padding-top: 0; - } -} - - -// Mixins to eliminate code repitition -@mixin reset-offset { - margin-left: auto; - left: auto; - right: auto; -} -@mixin grid-classes($size, $i, $perc) { - &.offset-#{$size}#{$i} { - margin-left: $perc; - } - &.pull-#{$size}#{$i} { - right: $perc; - } - &.push-#{$size}#{$i} { - left: $perc; - } -} - - -.row { - margin-left: auto; - margin-right: auto; - margin-bottom: 20px; - - // Clear floating children - &:after { - content: ""; - display: table; - clear: both; - } - - .col { - float: left; - box-sizing: border-box; - padding: 0 $gutter-width / 2; - min-height: 1px; - - &[class*="push-"], - &[class*="pull-"] { - position: relative; - } - - $i: 1; - @while $i <= $num-cols { - $perc: unquote((100 / ($num-cols / $i)) + "%"); - &.s#{$i} { - width: $perc; - @include reset-offset; - } - $i: $i + 1; - } - - $i: 1; - @while $i <= $num-cols { - $perc: unquote((100 / ($num-cols / $i)) + "%"); - @include grid-classes("s", $i, $perc); - $i: $i + 1; - } - - @media #{$medium-and-up} { - - $i: 1; - @while $i <= $num-cols { - $perc: unquote((100 / ($num-cols / $i)) + "%"); - &.m#{$i} { - width: $perc; - @include reset-offset; - } - $i: $i + 1 - } - - $i: 1; - @while $i <= $num-cols { - $perc: unquote((100 / ($num-cols / $i)) + "%"); - @include grid-classes("m", $i, $perc); - $i: $i + 1; - } - } - - @media #{$large-and-up} { - - $i: 1; - @while $i <= $num-cols { - $perc: unquote((100 / ($num-cols / $i)) + "%"); - &.l#{$i} { - width: $perc; - @include reset-offset; - } - $i: $i + 1; - } - - $i: 1; - @while $i <= $num-cols { - $perc: unquote((100 / ($num-cols / $i)) + "%"); - @include grid-classes("l", $i, $perc); - $i: $i + 1; - } - } - - @media #{$extra-large-and-up} { - - $i: 1; - @while $i <= $num-cols { - $perc: unquote((100 / ($num-cols / $i)) + "%"); - &.xl#{$i} { - width: $perc; - @include reset-offset; - } - $i: $i + 1; - } - - $i: 1; - @while $i <= $num-cols { - $perc: unquote((100 / ($num-cols / $i)) + "%"); - @include grid-classes("xl", $i, $perc); - $i: $i + 1; - } - } - } -} diff --git a/_sass/materialize-src/sass/components/_icons-material-design.scss b/_sass/materialize-src/sass/components/_icons-material-design.scss deleted file mode 100644 index 2aa6a4ae..00000000 --- a/_sass/materialize-src/sass/components/_icons-material-design.scss +++ /dev/null @@ -1,5 +0,0 @@ -/* This is needed for some mobile phones to display the Google Icon font properly */ -.material-icons { - text-rendering: optimizeLegibility; - font-feature-settings: 'liga'; -} diff --git a/_sass/materialize-src/sass/components/_materialbox.scss b/_sass/materialize-src/sass/components/_materialbox.scss deleted file mode 100644 index 30276672..00000000 --- a/_sass/materialize-src/sass/components/_materialbox.scss +++ /dev/null @@ -1,43 +0,0 @@ -.materialboxed { - &:hover { - &:not(.active) { - opacity: .8; - } - } - - display: block; - cursor: zoom-in; - position: relative; - transition: opacity .4s; - -webkit-backface-visibility: hidden; - - &.active { - cursor: zoom-out; - } -} - -#materialbox-overlay { - position:fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-color: #292929; - z-index: 1000; - will-change: opacity; -} - -.materialbox-caption { - position: fixed; - display: none; - color: #fff; - line-height: 50px; - bottom: 0; - left: 0; - width: 100%; - text-align: center; - padding: 0% 15%; - height: 50px; - z-index: 1000; - -webkit-font-smoothing: antialiased; -} \ No newline at end of file diff --git a/_sass/materialize-src/sass/components/_modal.scss b/_sass/materialize-src/sass/components/_modal.scss deleted file mode 100644 index 82445b40..00000000 --- a/_sass/materialize-src/sass/components/_modal.scss +++ /dev/null @@ -1,90 +0,0 @@ -.modal { - @extend .z-depth-4; - - display: none; - position: fixed; - left: 0; - right: 0; - background-color: #fafafa; - padding: 0; - max-height: 70%; - width: 55%; - margin: auto; - overflow-y: auto; - - border-radius: 2px; - will-change: top, opacity; - - @media #{$medium-and-down} { - width: 80%; - } - - h1,h2,h3,h4 { - margin-top: 0; - } - - .modal-content { - padding: 24px; - } - .modal-close { - cursor: pointer; - } - - .modal-footer { - border-radius: 0 0 2px 2px; - background-color: #fafafa; - padding: 4px 6px; - height: 56px; - width: 100%; - text-align: right; - - .btn, .btn-flat { - margin: 6px 0; - } - } -} -.modal-overlay { - position: fixed; - z-index: 999; - top: -25%; - left: 0; - bottom: 0; - right: 0; - height: 125%; - width: 100%; - background: #000; - display: none; - - will-change: opacity; -} - -// Modal with fixed action footer -.modal.modal-fixed-footer { - padding: 0; - height: 70%; - - .modal-content { - position: absolute; - height: calc(100% - 56px); - max-height: 100%; - width: 100%; - overflow-y: auto; - } - - .modal-footer { - border-top: 1px solid rgba(0,0,0,.1); - position: absolute; - bottom: 0; - } -} - -// Modal Bottom Sheet Style -.modal.bottom-sheet { - top: auto; - bottom: -100%; - margin: 0; - width: 100%; - max-height: 45%; - border-radius: 0; - will-change: bottom, opacity; -} diff --git a/_sass/materialize-src/sass/components/_navbar.scss b/_sass/materialize-src/sass/components/_navbar.scss deleted file mode 100644 index d6fb2f11..00000000 --- a/_sass/materialize-src/sass/components/_navbar.scss +++ /dev/null @@ -1,208 +0,0 @@ -nav { - &.nav-extended { - height: auto; - - .nav-wrapper { - min-height: $navbar-height-mobile; - height: auto; - } - - .nav-content { - position: relative; - line-height: normal; - } - } - - color: $navbar-font-color; - @extend .z-depth-1; - background-color: $primary-color; - width: 100%; - height: $navbar-height-mobile; - line-height: $navbar-line-height-mobile; - - a { color: $navbar-font-color; } - - i, - [class^="mdi-"], [class*="mdi-"], - i.material-icons { - display: block; - font-size: 24px; - height: $navbar-height-mobile; - line-height: $navbar-line-height-mobile; - } - - .nav-wrapper { - position: relative; - height: 100%; - } - - @media #{$large-and-up} { - a.button-collapse { display: none; } - } - - - // Collapse button - .button-collapse { - float: left; - position: relative; - z-index: 1; - height: $navbar-height-mobile; - margin: 0 18px; - - i { - height: $navbar-height-mobile; - line-height: $navbar-line-height-mobile; - } - } - - - // Logo - .brand-logo { - position: absolute; - color: $navbar-font-color; - display: inline-block; - font-size: $navbar-brand-font-size; - padding: 0; - - &.center { - left: 50%; - transform: translateX(-50%); - } - - @media #{$medium-and-down} { - left: 50%; - transform: translateX(-50%); - - &.left, &.right { - padding: 0; - transform: none; - } - - &.left { left: 0.5rem; } - &.right { - right: 0.5rem; - left: auto; - } - } - - &.right { - right: 0.5rem; - padding: 0; - } - - i, - [class^="mdi-"], [class*="mdi-"], - i.material-icons { - float: left; - margin-right: 15px; - } - } - - - // Title - .nav-title { - display: inline-block; - font-size: 32px; - padding: 28px 0; - } - - - // Navbar Links - ul { - margin: 0; - - li { - transition: background-color .3s; - float: left; - padding: 0; - - &.active { - background-color: rgba(0,0,0,.1); - } - } - a { - transition: background-color .3s; - font-size: $navbar-font-size; - color: $navbar-font-color; - display: block; - padding: 0 15px; - cursor: pointer; - - &.btn, &.btn-large, &.btn-flat, &.btn-floating { - margin-top: -2px; - margin-left: 15px; - margin-right: 15px; - - & > .material-icons { - height: inherit; - line-height: inherit; - } - } - - &:hover { - background-color: rgba(0,0,0,.1); - } - } - - &.left { - float: left; - } - } - - // Navbar Search Form - form { - height: 100%; - } - - .input-field { - margin: 0; - height: 100%; - - input { - height: 100%; - font-size: 1.2rem; - border: none; - padding-left: 2rem; - - &:focus, &[type=text]:valid, &[type=password]:valid, - &[type=email]:valid, &[type=url]:valid, &[type=date]:valid { - border: none; - box-shadow: none; - } - } - - label { - top: 0; - left: 0; - - i { - color: rgba(255,255,255,.7); - transition: color .3s; - } - &.active i { color: $navbar-font-color; } - } - } -} - -// Fixed Navbar -.navbar-fixed { - position: relative; - height: $navbar-height-mobile; - z-index: 997; - - nav { - position: fixed; - } -} -@media #{$medium-and-up} { - nav.nav-extended .nav-wrapper { - min-height: $navbar-height; - } - nav, nav .nav-wrapper i, nav a.button-collapse, nav a.button-collapse i { - height: $navbar-height; - line-height: $navbar-line-height; - } - .navbar-fixed { - height: $navbar-height; - } -} diff --git a/_sass/materialize-src/sass/components/_normalize.scss b/_sass/materialize-src/sass/components/_normalize.scss deleted file mode 100644 index d6d3c198..00000000 --- a/_sass/materialize-src/sass/components/_normalize.scss +++ /dev/null @@ -1,424 +0,0 @@ -/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS and IE text size adjust after device orientation change, - * without disabling user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined for any HTML5 element in IE 8/9. - * Correct `block` display not defined for `details` or `summary` in IE 10/11 - * and Firefox. - * Correct `block` display not defined for `main` in IE 11. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -menu, -nav, -section, -summary { - display: block; -} - -/** - * 1. Correct `inline-block` display not defined in IE 8/9. - * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. - */ - -audio, -canvas, -progress, -video { - display: inline-block; /* 1 */ - vertical-align: baseline; /* 2 */ -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9/10. - * Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background-color: transparent; -} - -/** - * Improve readability of focused elements when they are also in an - * active/hover state. - */ - -a:active, -a:hover { - outline: 0; -} - -/* Text-level semantics - ========================================================================== */ - -/** - * Address styling not present in IE 8/9/10/11, Safari, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9/10. - */ - -img { - border: 0; -} - -/** - * Correct overflow not hidden in IE 9/10/11. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* Grouping content - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari. - */ - -figure { - margin: 1em 40px; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - box-sizing: content-box; - height: 0; -} - -/** - * Contain overflow in all browsers. - */ - -pre { - overflow: auto; -} - -/** - * Address odd `em`-unit font size rendering in all browsers. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -/* Forms - ========================================================================== */ - -/** - * Known limitation: by default, Chrome and Safari on OS X allow very limited - * styling of `select`, unless a `border` property is set. - */ - -/** - * 1. Correct color not being inherited. - * Known issue: affects color of disabled elements. - * 2. Correct font properties not being inherited. - * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. - */ - -button, -input, -optgroup, -select, -textarea { - color: inherit; /* 1 */ - font: inherit; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address `overflow` set to `hidden` in IE 8/9/10/11. - */ - -button { - overflow: visible; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. - * Correct `select` style inheritance in Firefox. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -input { - line-height: normal; -} - -/** - * It's recommended that you don't attempt to style these elements. - * Firefox's implementation doesn't respect box-sizing, padding, or width. - * - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Fix the cursor style for Chrome's increment/decrement buttons. For certain - * `font-size` values of the `input`, it causes the cursor style of the - * decrement button to change from `default` to `text`. - */ - -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari and Chrome. - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - box-sizing: content-box; /* 2 */ -} - -/** - * Remove inner padding and search cancel button in Safari and Chrome on OS X. - * Safari (but not Chrome) clips the cancel button when the search input has - * padding (and `textfield` appearance). - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9/10/11. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * Remove default vertical scrollbar in IE 8/9/10/11. - */ - -textarea { - overflow: auto; -} - -/** - * Don't inherit the `font-weight` (applied by a rule above). - * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. - */ - -optgroup { - font-weight: bold; -} - -/* Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -td, -th { - padding: 0; -} diff --git a/_sass/materialize-src/sass/components/_preloader.scss b/_sass/materialize-src/sass/components/_preloader.scss deleted file mode 100644 index cfe29939..00000000 --- a/_sass/materialize-src/sass/components/_preloader.scss +++ /dev/null @@ -1,334 +0,0 @@ -/* - @license - Copyright (c) 2014 The Polymer Project Authors. All rights reserved. - This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt - The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt - The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt - Code distributed by Google as part of the polymer project is also - subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt - */ - -/**************************/ -/* STYLES FOR THE SPINNER */ -/**************************/ - -/* - * Constants: - * STROKEWIDTH = 3px - * ARCSIZE = 270 degrees (amount of circle the arc takes up) - * ARCTIME = 1333ms (time it takes to expand and contract arc) - * ARCSTARTROT = 216 degrees (how much the start location of the arc - * should rotate each time, 216 gives us a - * 5 pointed star shape (it's 360/5 * 3). - * For a 7 pointed star, we might do - * 360/7 * 3 = 154.286) - * CONTAINERWIDTH = 28px - * SHRINK_TIME = 400ms - */ - - -.preloader-wrapper { - display: inline-block; - position: relative; - width: 50px; - height: 50px; - - &.small { - width: 36px; - height: 36px; - } - - &.big { - width: 64px; - height: 64px; - } - - &.active { - /* duration: 360 * ARCTIME / (ARCSTARTROT + (360-ARCSIZE)) */ - -webkit-animation: container-rotate 1568ms linear infinite; - animation: container-rotate 1568ms linear infinite; - } -} - -@-webkit-keyframes container-rotate { - to { -webkit-transform: rotate(360deg) } -} - -@keyframes container-rotate { - to { transform: rotate(360deg) } -} - -.spinner-layer { - position: absolute; - width: 100%; - height: 100%; - opacity: 0; - border-color: $spinner-default-color; -} - -.spinner-blue, -.spinner-blue-only { - border-color: #4285f4; -} - -.spinner-red, -.spinner-red-only { - border-color: #db4437; -} - -.spinner-yellow, -.spinner-yellow-only { - border-color: #f4b400; -} - -.spinner-green, -.spinner-green-only { - border-color: #0f9d58; -} - -/** - * IMPORTANT NOTE ABOUT CSS ANIMATION PROPERTIES (keanulee): - * - * iOS Safari (tested on iOS 8.1) does not handle animation-delay very well - it doesn't - * guarantee that the animation will start _exactly_ after that value. So we avoid using - * animation-delay and instead set custom keyframes for each color (as redundant as it - * seems). - * - * We write out each animation in full (instead of separating animation-name, - * animation-duration, etc.) because under the polyfill, Safari does not recognize those - * specific properties properly, treats them as -webkit-animation, and overrides the - * other animation rules. See https://github.com/Polymer/platform/issues/53. - */ -.active .spinner-layer.spinner-blue { - /* durations: 4 * ARCTIME */ - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, blue-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; -} - -.active .spinner-layer.spinner-red { - /* durations: 4 * ARCTIME */ - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, red-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; -} - -.active .spinner-layer.spinner-yellow { - /* durations: 4 * ARCTIME */ - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, yellow-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; -} - -.active .spinner-layer.spinner-green { - /* durations: 4 * ARCTIME */ - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both, green-fade-in-out 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; -} - -.active .spinner-layer, -.active .spinner-layer.spinner-blue-only, -.active .spinner-layer.spinner-red-only, -.active .spinner-layer.spinner-yellow-only, -.active .spinner-layer.spinner-green-only { - /* durations: 4 * ARCTIME */ - opacity: 1; - -webkit-animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; - animation: fill-unfill-rotate 5332ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; -} - -@-webkit-keyframes fill-unfill-rotate { - 12.5% { -webkit-transform: rotate(135deg); } /* 0.5 * ARCSIZE */ - 25% { -webkit-transform: rotate(270deg); } /* 1 * ARCSIZE */ - 37.5% { -webkit-transform: rotate(405deg); } /* 1.5 * ARCSIZE */ - 50% { -webkit-transform: rotate(540deg); } /* 2 * ARCSIZE */ - 62.5% { -webkit-transform: rotate(675deg); } /* 2.5 * ARCSIZE */ - 75% { -webkit-transform: rotate(810deg); } /* 3 * ARCSIZE */ - 87.5% { -webkit-transform: rotate(945deg); } /* 3.5 * ARCSIZE */ - to { -webkit-transform: rotate(1080deg); } /* 4 * ARCSIZE */ -} - -@keyframes fill-unfill-rotate { - 12.5% { transform: rotate(135deg); } /* 0.5 * ARCSIZE */ - 25% { transform: rotate(270deg); } /* 1 * ARCSIZE */ - 37.5% { transform: rotate(405deg); } /* 1.5 * ARCSIZE */ - 50% { transform: rotate(540deg); } /* 2 * ARCSIZE */ - 62.5% { transform: rotate(675deg); } /* 2.5 * ARCSIZE */ - 75% { transform: rotate(810deg); } /* 3 * ARCSIZE */ - 87.5% { transform: rotate(945deg); } /* 3.5 * ARCSIZE */ - to { transform: rotate(1080deg); } /* 4 * ARCSIZE */ -} - -@-webkit-keyframes blue-fade-in-out { - from { opacity: 1; } - 25% { opacity: 1; } - 26% { opacity: 0; } - 89% { opacity: 0; } - 90% { opacity: 1; } - 100% { opacity: 1; } -} - -@keyframes blue-fade-in-out { - from { opacity: 1; } - 25% { opacity: 1; } - 26% { opacity: 0; } - 89% { opacity: 0; } - 90% { opacity: 1; } - 100% { opacity: 1; } -} - -@-webkit-keyframes red-fade-in-out { - from { opacity: 0; } - 15% { opacity: 0; } - 25% { opacity: 1; } - 50% { opacity: 1; } - 51% { opacity: 0; } -} - -@keyframes red-fade-in-out { - from { opacity: 0; } - 15% { opacity: 0; } - 25% { opacity: 1; } - 50% { opacity: 1; } - 51% { opacity: 0; } -} - -@-webkit-keyframes yellow-fade-in-out { - from { opacity: 0; } - 40% { opacity: 0; } - 50% { opacity: 1; } - 75% { opacity: 1; } - 76% { opacity: 0; } -} - -@keyframes yellow-fade-in-out { - from { opacity: 0; } - 40% { opacity: 0; } - 50% { opacity: 1; } - 75% { opacity: 1; } - 76% { opacity: 0; } -} - -@-webkit-keyframes green-fade-in-out { - from { opacity: 0; } - 65% { opacity: 0; } - 75% { opacity: 1; } - 90% { opacity: 1; } - 100% { opacity: 0; } -} - -@keyframes green-fade-in-out { - from { opacity: 0; } - 65% { opacity: 0; } - 75% { opacity: 1; } - 90% { opacity: 1; } - 100% { opacity: 0; } -} - -/** - * Patch the gap that appear between the two adjacent div.circle-clipper while the - * spinner is rotating (appears on Chrome 38, Safari 7.1, and IE 11). - */ -.gap-patch { - position: absolute; - top: 0; - left: 45%; - width: 10%; - height: 100%; - overflow: hidden; - border-color: inherit; -} - -.gap-patch .circle { - width: 1000%; - left: -450%; -} - -.circle-clipper { - display: inline-block; - position: relative; - width: 50%; - height: 100%; - overflow: hidden; - border-color: inherit; - - .circle { - width: 200%; - height: 100%; - border-width: 3px; /* STROKEWIDTH */ - border-style: solid; - border-color: inherit; - border-bottom-color: transparent !important; - border-radius: 50%; - -webkit-animation: none; - animation: none; - position: absolute; - top: 0; - right: 0; - bottom: 0; - } - - &.left .circle { - left: 0; - border-right-color: transparent !important; - -webkit-transform: rotate(129deg); - transform: rotate(129deg); - } - &.right .circle { - left: -100%; - border-left-color: transparent !important; - -webkit-transform: rotate(-129deg); - transform: rotate(-129deg); - } -} - - - -.active .circle-clipper.left .circle { - /* duration: ARCTIME */ - -webkit-animation: left-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; - animation: left-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; -} - -.active .circle-clipper.right .circle { - /* duration: ARCTIME */ - -webkit-animation: right-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; - animation: right-spin 1333ms cubic-bezier(0.4, 0.0, 0.2, 1) infinite both; -} - -@-webkit-keyframes left-spin { - from { -webkit-transform: rotate(130deg); } - 50% { -webkit-transform: rotate(-5deg); } - to { -webkit-transform: rotate(130deg); } -} - -@keyframes left-spin { - from { transform: rotate(130deg); } - 50% { transform: rotate(-5deg); } - to { transform: rotate(130deg); } -} - -@-webkit-keyframes right-spin { - from { -webkit-transform: rotate(-130deg); } - 50% { -webkit-transform: rotate(5deg); } - to { -webkit-transform: rotate(-130deg); } -} - -@keyframes right-spin { - from { transform: rotate(-130deg); } - 50% { transform: rotate(5deg); } - to { transform: rotate(-130deg); } -} - -#spinnerContainer.cooldown { - /* duration: SHRINK_TIME */ - -webkit-animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0.0, 0.2, 1); - animation: container-rotate 1568ms linear infinite, fade-out 400ms cubic-bezier(0.4, 0.0, 0.2, 1); -} - -@-webkit-keyframes fade-out { - from { opacity: 1; } - to { opacity: 0; } -} - -@keyframes fade-out { - from { opacity: 1; } - to { opacity: 0; } -} diff --git a/_sass/materialize-src/sass/components/_pulse.scss b/_sass/materialize-src/sass/components/_pulse.scss deleted file mode 100644 index a3b7d9f2..00000000 --- a/_sass/materialize-src/sass/components/_pulse.scss +++ /dev/null @@ -1,34 +0,0 @@ -.pulse { - &::before { - content: ''; - display: block; - position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; - background-color: inherit; - border-radius: inherit; - transition: opacity .3s, transform .3s; - animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; - z-index: -1; - } - - overflow: initial; - position: relative; -} - -@keyframes pulse-animation { - 0% { - opacity: 1; - transform: scale(1); - } - 50% { - opacity: 0; - transform: scale(1.5); - } - 100% { - opacity: 0; - transform: scale(1.5); - } -} diff --git a/_sass/materialize-src/sass/components/_roboto.scss b/_sass/materialize-src/sass/components/_roboto.scss deleted file mode 100644 index a4ec3cb9..00000000 --- a/_sass/materialize-src/sass/components/_roboto.scss +++ /dev/null @@ -1,39 +0,0 @@ -@font-face { - font-family: "Roboto"; - src: local(Roboto Thin), - url("#{$roboto-font-path}Roboto-Thin.woff2") format("woff2"), - url("#{$roboto-font-path}Roboto-Thin.woff") format("woff"); - - font-weight: 100; -} -@font-face { - font-family: "Roboto"; - src: local(Roboto Light), - url("#{$roboto-font-path}Roboto-Light.woff2") format("woff2"), - url("#{$roboto-font-path}Roboto-Light.woff") format("woff"); - font-weight: 300; -} - -@font-face { - font-family: "Roboto"; - src: local(Roboto Regular), - url("#{$roboto-font-path}Roboto-Regular.woff2") format("woff2"), - url("#{$roboto-font-path}Roboto-Regular.woff") format("woff"); - font-weight: 400; -} - -@font-face { - font-family: "Roboto"; - src: local(Roboto Medium), - url("#{$roboto-font-path}Roboto-Medium.woff2") format("woff2"), - url("#{$roboto-font-path}Roboto-Medium.woff") format("woff"); - font-weight: 500; -} - -@font-face { - font-family: "Roboto"; - src: local(Roboto Bold), - url("#{$roboto-font-path}Roboto-Bold.woff2") format("woff2"), - url("#{$roboto-font-path}Roboto-Bold.woff") format("woff"); - font-weight: 700; -} diff --git a/_sass/materialize-src/sass/components/_sideNav.scss b/_sass/materialize-src/sass/components/_sideNav.scss deleted file mode 100644 index 051e1f37..00000000 --- a/_sass/materialize-src/sass/components/_sideNav.scss +++ /dev/null @@ -1,214 +0,0 @@ -.side-nav { - position: fixed; - width: 300px; - left: 0; - top: 0; - margin: 0; - transform: translateX(-100%); - height: 100%; - height: calc(100% + 60px); - height: -moz-calc(100%); //Temporary Firefox Fix - padding-bottom: 60px; - background-color: $sidenav-bg-color; - z-index: 999; - overflow-y: auto; - will-change: transform; - backface-visibility: hidden; - transform: translateX(-105%); - - @extend .z-depth-1; - - // Right Align - &.right-aligned { - right: 0; - transform: translateX(105%); - left: auto; - transform: translateX(100%); - } - - .collapsible { - margin: 0; - } - - - li { - float: none; - line-height: $sidenav-line-height; - - &.active { background-color: rgba(0,0,0,.05); } - } - - li > a { - color: $sidenav-font-color; - display: block; - font-size: $sidenav-font-size; - font-weight: 500; - height: $sidenav-item-height; - line-height: $sidenav-line-height; - padding: 0 ($sidenav-padding * 2); - - &:hover { background-color: rgba(0,0,0,.05);} - - &.btn, &.btn-large, &.btn-flat, &.btn-floating { - margin: 10px 15px; - } - - &.btn, - &.btn-large, - &.btn-floating { color: $button-raised-color; } - &.btn-flat { color: $button-flat-color; } - - &.btn:hover, - &.btn-large:hover { background-color: lighten($button-raised-background, 5%); } - &.btn-floating:hover { background-color: $button-raised-background; } - - & > i, - & > [class^="mdi-"], li > a > [class*="mdi-"], - & > i.material-icons { - float: left; - height: $sidenav-item-height; - line-height: $sidenav-line-height; - margin: 0 ($sidenav-padding * 2) 0 0; - width: $sidenav-item-height / 2; - color: rgba(0,0,0,.54); - } - } - - - .divider { - margin: ($sidenav-padding / 2) 0 0 0; - } - - .subheader { - &:hover { - background-color: transparent; - } - - cursor: initial; - pointer-events: none; - color: rgba(0,0,0,.54); - font-size: $sidenav-font-size; - font-weight: 500; - line-height: $sidenav-line-height; - } - - .user-view, - .userView { - position: relative; - padding: ($sidenav-padding * 2) ($sidenav-padding * 2) 0; - margin-bottom: $sidenav-padding / 2; - - & > a { - &:hover { background-color: transparent; } - height: auto; - padding: 0; - } - - .background { - overflow: hidden; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: -1; - } - - .circle, .name, .email { - display: block; - } - - .circle { - height: 64px; - width: 64px; - } - - .name, - .email { - font-size: $sidenav-font-size; - line-height: $sidenav-line-height / 2; - } - - .name { - margin-top: 16px; - font-weight: 500; - } - - .email { - padding-bottom: 16px; - font-weight: 400; - } - } -} - - -// Touch interaction -.drag-target { - height: 100%; - width: 10px; - position: fixed; - top: 0; - z-index: 998; -} - - -// Fixed side-nav shown -.side-nav.fixed { - left: 0; - transform: translateX(0); - position: fixed; - - // Right Align - &.right-aligned { - right: 0; - left: auto; - } -} - -// Fixed sideNav hide on smaller -@media #{$medium-and-down} { - .side-nav { - &.fixed { - transform: translateX(-105%); - - &.right-aligned { - transform: translateX(105%); - } - } - - a { - padding: 0 $sidenav-padding; - } - - .user-view, - .userView { - padding: $sidenav-padding $sidenav-padding 0; - } - } -} - - -.side-nav .collapsible-body > ul:not(.collapsible) > li.active, -.side-nav.fixed .collapsible-body > ul:not(.collapsible) > li.active { - background-color: $primary-color; - a { - color: $sidenav-bg-color; - } -} -.side-nav .collapsible-body { - padding: 0; -} - - -#sidenav-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - - height: 120vh; - background-color: rgba(0,0,0,.5); - z-index: 997; - - will-change: opacity; -} diff --git a/_sass/materialize-src/sass/components/_slider.scss b/_sass/materialize-src/sass/components/_slider.scss deleted file mode 100644 index 5d7c27ed..00000000 --- a/_sass/materialize-src/sass/components/_slider.scss +++ /dev/null @@ -1,92 +0,0 @@ -.slider { - position: relative; - height: 400px; - width: 100%; - - // Fullscreen slider - &.fullscreen { - height: 100%; - width: 100%; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - - ul.slides { - height: 100%; - } - - ul.indicators { - z-index: 2; - bottom: 30px; - } - } - - .slides { - background-color: $slider-bg-color; - margin: 0; - height: 400px; - - li { - opacity: 0; - position: absolute; - top: 0; - left: 0; - z-index: 1; - width: 100%; - height: inherit; - overflow: hidden; - - img { - height: 100%; - width: 100%; - background-size: cover; - background-position: center; - } - - .caption { - color: #fff; - position: absolute; - top: 15%; - left: 15%; - width: 70%; - opacity: 0; - - p { color: $slider-bg-color-light; } - } - - &.active { - z-index: 2; - } - } - } - - - .indicators { - position: absolute; - text-align: center; - left: 0; - right: 0; - bottom: 0; - margin: 0; - - .indicator-item { - display: inline-block; - position: relative; - cursor: pointer; - height: 16px; - width: 16px; - margin: 0 12px; - background-color: $slider-bg-color-light; - - transition: background-color .3s; - border-radius: 50%; - - &.active { - background-color: $slider-indicator-color; - } - } - } - -} \ No newline at end of file diff --git a/_sass/materialize-src/sass/components/_table_of_contents.scss b/_sass/materialize-src/sass/components/_table_of_contents.scss deleted file mode 100644 index dde6090b..00000000 --- a/_sass/materialize-src/sass/components/_table_of_contents.scss +++ /dev/null @@ -1,33 +0,0 @@ -/*************** - Nav List -***************/ -.table-of-contents { - &.fixed { - position: fixed; - } - - li { - padding: 2px 0; - } - a { - display: inline-block; - font-weight: 300; - color: #757575; - padding-left: 20px; - height: 1.5rem; - line-height: 1.5rem; - letter-spacing: .4; - display: inline-block; - - &:hover { - color: lighten(#757575, 20%); - padding-left: 19px; - border-left: 1px solid $primary-color; - } - &.active { - font-weight: 500; - padding-left: 18px; - border-left: 2px solid $primary-color; - } - } -} diff --git a/_sass/materialize-src/sass/components/_tabs.scss b/_sass/materialize-src/sass/components/_tabs.scss deleted file mode 100644 index 5a1a459a..00000000 --- a/_sass/materialize-src/sass/components/_tabs.scss +++ /dev/null @@ -1,93 +0,0 @@ -.tabs { - &.tabs-transparent { - background-color: transparent; - - .tab a, - .tab.disabled a, - .tab.disabled a:hover { - color: rgba(255,255,255,0.7); - } - - .tab a:hover, - .tab a.active { - color: #fff; - } - - .indicator { - background-color: #fff; - } - } - - &.tabs-fixed-width { - display: flex; - - .tab { - flex-grow: 1; - } - } - - position: relative; - overflow-x: auto; - overflow-y: hidden; - height: 48px; - width: 100%; - background-color: $tabs-bg-color; - margin: 0 auto; - white-space: nowrap; - - .tab { - display: inline-block; - text-align: center; - line-height: 48px; - height: 48px; - padding: 0; - margin: 0; - text-transform: uppercase; - - a { - &:hover, - &.active { - background-color: transparent; - color: $tabs-text-color; - } - - color: rgba($tabs-text-color, .7); - display: block; - width: 100%; - height: 100%; - padding: 0 24px; - font-size: 14px; - text-overflow: ellipsis; - overflow: hidden; - transition: color .28s ease; - } - - &.disabled a, - &.disabled a:hover { - color: rgba($tabs-text-color, .7); - cursor: default; - } - } - .indicator { - position: absolute; - bottom: 0; - height: 2px; - background-color: $tabs-underline-color; - will-change: left, right; - } -} - -// Fixed sideNav hide on smaller -@media #{$medium-and-down} { - .tabs { - display: flex; - - .tab { - flex-grow: 1; - - a { - padding: 0 12px; - } - } - } -} diff --git a/_sass/materialize-src/sass/components/_tapTarget.scss b/_sass/materialize-src/sass/components/_tapTarget.scss deleted file mode 100644 index 49aecd56..00000000 --- a/_sass/materialize-src/sass/components/_tapTarget.scss +++ /dev/null @@ -1,103 +0,0 @@ -.tap-target-wrapper { - width: 800px; - height: 800px; - position: fixed; - z-index: 1000; - visibility: hidden; - transition: visibility 0s .3s; -} - -.tap-target-wrapper.open { - visibility: visible; - transition: visibility 0s; - - .tap-target { - transform: scale(1); - opacity: .95; - transition: - transform .3s cubic-bezier(.42,0,.58,1), - opacity .3s cubic-bezier(.42,0,.58,1); - } - - .tap-target-wave::before { - transform: scale(1); - } - .tap-target-wave::after { - visibility: visible; - animation: pulse-animation 1s cubic-bezier(0.24, 0, 0.38, 1) infinite; - transition: - opacity .3s, - transform .3s, - visibility 0s 1s; - } -} - -.tap-target { - position: absolute; - font-size: 1rem; - border-radius: 50%; - background-color: $primary-color; - box-shadow: 0 20px 20px 0 rgba(0,0,0,0.14), 0 10px 50px 0 rgba(0,0,0,0.12), 0 30px 10px -20px rgba(0,0,0,0.2); - width: 100%; - height: 100%; - opacity: 0; - transform: scale(0); - transition: - transform .3s cubic-bezier(.42,0,.58,1), - opacity .3s cubic-bezier(.42,0,.58,1); -} - -.tap-target-content { - position: relative; - display: table-cell; -} - -.tap-target-wave { - &::before, - &::after { - content: ''; - display: block; - position: absolute; - width: 100%; - height: 100%; - border-radius: 50%; - background-color: #ffffff; - } - &::before { - transform: scale(0); - transition: transform .3s; - } - &::after { - visibility: hidden; - transition: - opacity .3s, - transform .3s, - visibility 0s; - z-index: -1; - } - - position: absolute; - border-radius: 50%; - z-index: 10001; -} - -.tap-target-origin { - &:not(.btn), - &:not(.btn):hover { - background: none; - } - - top: 50%; - left: 50%; - transform: translate(-50%,-50%); - - z-index: 10002; - position: absolute !important; -} - -@media only screen and (max-width: 600px) { - .tap-target, .tap-target-wrapper { - width: 600px; - height: 600px; - } -} diff --git a/_sass/materialize-src/sass/components/_toast.scss b/_sass/materialize-src/sass/components/_toast.scss deleted file mode 100644 index 3772d442..00000000 --- a/_sass/materialize-src/sass/components/_toast.scss +++ /dev/null @@ -1,59 +0,0 @@ -#toast-container { - display:block; - position: fixed; - z-index: 10000; - - @media #{$small-and-down} { - min-width: 100%; - bottom: 0%; - } - @media #{$medium-only} { - left: 5%; - bottom: 7%; - max-width: 90%; - } - @media #{$large-and-up} { - top: 10%; - right: 7%; - max-width: 86%; - } -} - -.toast { - @extend .z-depth-1; - border-radius: 2px; - top: 35px; - width: auto; - margin-top: 10px; - position: relative; - max-width:100%; - height: auto; - min-height: $toast-height; - line-height: 1.5em; - word-break: break-all; - background-color: $toast-color; - padding: 10px 25px; - font-size: 1.1rem; - font-weight: 300; - color: $toast-text-color; - display: flex; - align-items: center; - justify-content: space-between; - cursor: default; - - .toast-action { - color: $toast-action-color; - font-weight: 500; - margin-right: -25px; - margin-left: 3rem; - } - - &.rounded{ - border-radius: 24px; - } - - @media #{$small-and-down} { - width: 100%; - border-radius: 0; - } -} diff --git a/_sass/materialize-src/sass/components/_tooltip.scss b/_sass/materialize-src/sass/components/_tooltip.scss deleted file mode 100644 index 21ea6a75..00000000 --- a/_sass/materialize-src/sass/components/_tooltip.scss +++ /dev/null @@ -1,31 +0,0 @@ -.material-tooltip { - padding: 10px 8px; - font-size: 1rem; - z-index: 2000; - background-color: transparent; - border-radius: 2px; - color: #fff; - min-height: 36px; - line-height: 120%; - opacity: 0; - position: absolute; - text-align: center; - max-width: calc(100% - 4px); - overflow: hidden; - left: 0; - top: 0; - pointer-events: none; - visibility: hidden; -} - -.backdrop { - position: absolute; - opacity: 0; - height: 7px; - width: 14px; - border-radius: 0 0 50% 50%; - background-color: #323232; - z-index: -1; - transform-origin: 50% 0%; - visibility: hidden; -} diff --git a/_sass/materialize-src/sass/components/_transitions.scss b/_sass/materialize-src/sass/components/_transitions.scss deleted file mode 100644 index cb9f60db..00000000 --- a/_sass/materialize-src/sass/components/_transitions.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Scale transition -.scale-transition { - &.scale-out { - transform: scale(0); - transition: transform .2s !important; - } - - &.scale-in { - transform: scale(1); - } - - transition: transform .3s cubic-bezier(0.53, 0.01, 0.36, 1.63) !important; -} \ No newline at end of file diff --git a/_sass/materialize-src/sass/components/_typography.scss b/_sass/materialize-src/sass/components/_typography.scss deleted file mode 100644 index a773afd4..00000000 --- a/_sass/materialize-src/sass/components/_typography.scss +++ /dev/null @@ -1,61 +0,0 @@ - -a { - text-decoration: none; -} - -html{ - line-height: 1.5; - - @media only screen and (min-width: 0) { - font-size: 14px; - } - - @media only screen and (min-width: $medium-screen) { - font-size: 14.5px; - } - - @media only screen and (min-width: $large-screen) { - font-size: 15px; - } - - font-family: "Roboto", sans-serif; - font-weight: normal; - color: $off-black; -} -h1, h2, h3, h4, h5, h6 { - font-weight: 400; - line-height: 1.1; -} - -// Header Styles -h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; } -h1 { font-size: $h1-fontsize; line-height: 110%; margin: ($h1-fontsize / 2) 0 ($h1-fontsize / 2.5) 0;} -h2 { font-size: $h2-fontsize; line-height: 110%; margin: ($h2-fontsize / 2) 0 ($h2-fontsize / 2.5) 0;} -h3 { font-size: $h3-fontsize; line-height: 110%; margin: ($h3-fontsize / 2) 0 ($h3-fontsize / 2.5) 0;} -h4 { font-size: $h4-fontsize; line-height: 110%; margin: ($h4-fontsize / 2) 0 ($h4-fontsize / 2.5) 0;} -h5 { font-size: $h5-fontsize; line-height: 110%; margin: ($h5-fontsize / 2) 0 ($h5-fontsize / 2.5) 0;} -h6 { font-size: $h6-fontsize; line-height: 110%; margin: ($h6-fontsize / 2) 0 ($h6-fontsize / 2.5) 0;} - -// Text Styles -em { font-style: italic; } -strong { font-weight: 500; } -small { font-size: 75%; } -.light { font-weight: 300; } -.thin { font-weight: 200; } - - -.flow-text{ - font-weight: 300; - $i: 0; - @while $i <= $intervals { - @media only screen and (min-width : 360 + ($i * $interval-size)) { - font-size: 1.2rem * (1 + (.02 * $i)); - } - $i: $i + 1; - } - - // Handle below 360px screen - @media only screen and (max-width: 360px) { - font-size: 1.2rem; - } -} \ No newline at end of file diff --git a/_sass/materialize-src/sass/components/_variables.scss b/_sass/materialize-src/sass/components/_variables.scss deleted file mode 100644 index acfc6c3b..00000000 --- a/_sass/materialize-src/sass/components/_variables.scss +++ /dev/null @@ -1,343 +0,0 @@ -// ========================================================================== -// Materialize variables -// ========================================================================== -// -// Table of Contents: -// -// 1. Colors -// 2. Badges -// 3. Buttons -// 4. Cards -// 5. Carousel -// 6. Collapsible -// 7. Chips -// 8. Date + Time Picker -// 9. Dropdown -// 10. Fonts -// 11. Forms -// 12. Global -// 13. Grid -// 14. Navigation Bar -// 15. Side Navigation -// 16. Photo Slider -// 17. Spinners | Loaders -// 18. Tabs -// 19. Tables -// 20. Toasts -// 21. Typography -// 22. Footer -// 23. Flow Text -// 24. Collections -// 25. Progress Bar - - - -// 1. Colors -// ========================================================================== - -$primary-color: color("materialize-red", "lighten-2") !default; -$primary-color-light: lighten($primary-color, 15%) !default; -$primary-color-dark: darken($primary-color, 15%) !default; - -$secondary-color: color("teal", "lighten-1") !default; -$success-color: color("green", "base") !default; -$error-color: color("red", "base") !default; -$link-color: color("light-blue", "darken-1") !default; - - -// 2. Badges -// ========================================================================== - -$badge-bg-color: $secondary-color !default; -$badge-height: 22px !default; - - -// 3. Buttons -// ========================================================================== - -// Shared styles -$button-border: none !default; -$button-background-focus: lighten($secondary-color, 4%) !default; -$button-font-size: 1rem !default; -$button-icon-font-size: 1.3rem !default; -$button-height: 36px !default; -$button-padding: 0 2rem !default; -$button-radius: 2px !default; - -// Disabled styles -$button-disabled-background: #DFDFDF !default; -$button-disabled-color: #9F9F9F !default; - -// Raised buttons -$button-raised-background: $secondary-color !default; -$button-raised-background-hover: lighten($button-raised-background, 5%) !default; -$button-raised-color: #fff !default; - -// Large buttons -$button-large-icon-font-size: 1.6rem !default; -$button-large-height: $button-height * 1.5 !default; - -// Flat buttons -$button-flat-color: #343434 !default; -$button-flat-disabled-color: lighten(#999, 10%) !default; - -// Floating buttons -$button-floating-background: $secondary-color !default; -$button-floating-background-hover: $button-floating-background !default; -$button-floating-color: #fff !default; -$button-floating-size: 40px !default; -$button-floating-large-size: 56px !default; -$button-floating-radius: 50% !default; - - -// 4. Cards -// ========================================================================== - -$card-padding: 24px !default; -$card-bg-color: #fff !default; -$card-link-color: color("orange", "accent-2") !default; -$card-link-color-light: lighten($card-link-color, 20%) !default; - - -// 5. Carousel -// ========================================================================== - -$carousel-height: 400px !default; -$carousel-item-height: $carousel-height / 2 !default; -$carousel-item-width: $carousel-item-height !default; - - -// 6. Collapsible -// ========================================================================== - -$collapsible-height: 3rem !default; -$collapsible-line-height: $collapsible-height !default; -$collapsible-header-color: #fff !default; -$collapsible-border-color: #ddd !default; - - -// 7. Chips -// ========================================================================== - -$chip-bg-color: #e4e4e4 !default; -$chip-border-color: #9e9e9e !default; -$chip-selected-color: #26a69a !default; -$chip-margin: 5px !default; - - -// 8. Date + Time Picker -// ========================================================================== - -$datepicker-display-font-size: 2.8rem; -$datepicker-weekday-color: rgba(0, 0, 0, .87) !default; -$datepicker-weekday-bg: darken($secondary-color, 7%) !default; -$datepicker-date-bg: $secondary-color !default; -$datepicker-year: rgba(255, 255, 255, .7) !default; -$datepicker-focus: rgba(0,0,0, .05) !default; -$datepicker-selected: $secondary-color !default; -$datepicker-selected-outfocus: desaturate(lighten($secondary-color, 35%), 15%) !default; - -$timepicker-clock-color: rgba(0, 0, 0, .87) !default; -$timepicker-clock-plate-bg: #eee; - - -// 9. Dropdown -// ========================================================================== - -$dropdown-bg-color: #fff !default; -$dropdown-hover-bg-color: #eee !default; -$dropdown-color: $secondary-color !default; -$dropdown-item-height: 50px !default; - - -// 10. Fonts -// ========================================================================== - -$roboto-font-path: "../fonts/roboto/" !default; - - -// 11. Forms -// ========================================================================== - -// Text Inputs + Textarea -$input-height: 3rem !default; -$input-border-color: color("grey", "base") !default; -$input-border: 1px solid $input-border-color !default; -$input-background: #fff !default; -$input-error-color: $error-color !default; -$input-success-color: $success-color !default; -$input-focus-color: $secondary-color !default; -$input-font-size: 1rem !default; -$input-margin-bottom: 20px; -$input-margin: 0 0 $input-margin-bottom 0 !default; -$input-padding: 0 !default; -$input-transition: all .3s !default; -$label-font-size: .8rem !default; -$input-disabled-color: rgba(0,0,0, .42) !default; -$input-disabled-solid-color: #949494 !default; -$input-disabled-border: 1px dotted $input-disabled-color !default; -$input-invalid-border: 1px solid $input-error-color !default; -$placeholder-text-color: lighten($input-border-color, 20%) !default; - -// Radio Buttons -$radio-fill-color: $secondary-color !default; -$radio-empty-color: #5a5a5a !default; -$radio-border: 2px solid $radio-fill-color !default; - -// Range -$range-height: 14px !default; -$range-width: 14px !default; -$track-height: 3px !default; - -// Select -$select-border: 1px solid #f2f2f2 !default; -$select-background: rgba(255, 255, 255, 0.90) !default; -$select-focus: 1px solid lighten($secondary-color, 47%) !default; -$select-option-hover: rgba(0,0,0,.06) !default; -$select-option-focus: rgba(0,0,0,.03) !default; -$select-padding: 5px !default; -$select-radius: 2px !default; -$select-disabled-color: rgba(0,0,0,.3) !default; - -// Switches -$switch-bg-color: $secondary-color !default; -$switch-checked-lever-bg: desaturate(lighten($switch-bg-color, 25%), 25%) !default; -$switch-unchecked-bg: #F1F1F1 !default; -$switch-unchecked-lever-bg: rgba(0,0,0,.38) !default; -$switch-radius: 15px !default; - - -// 12. Global -// ========================================================================== - -// Media Query Ranges -$small-screen-up: 601px !default; -$medium-screen-up: 993px !default; -$large-screen-up: 1201px !default; -$small-screen: 600px !default; -$medium-screen: 992px !default; -$large-screen: 1200px !default; - -$medium-and-up: "only screen and (min-width : #{$small-screen-up})" !default; -$large-and-up: "only screen and (min-width : #{$medium-screen-up})" !default; -$extra-large-and-up: "only screen and (min-width : #{$large-screen-up})" !default; -$small-and-down: "only screen and (max-width : #{$small-screen})" !default; -$medium-and-down: "only screen and (max-width : #{$medium-screen})" !default; -$medium-only: "only screen and (min-width : #{$small-screen-up}) and (max-width : #{$medium-screen})" !default; - - -// 13. Grid -// ========================================================================== - -$num-cols: 12 !default; -$gutter-width: 1.5rem !default; -$element-top-margin: $gutter-width/3 !default; -$element-bottom-margin: ($gutter-width*2)/3 !default; - - -// 14. Navigation Bar -// ========================================================================== - -$navbar-height: 64px !default; -$navbar-line-height: $navbar-height !default; -$navbar-height-mobile: 56px !default; -$navbar-line-height-mobile: $navbar-height-mobile !default; -$navbar-font-size: 1rem !default; -$navbar-font-color: #fff !default; -$navbar-brand-font-size: 2.1rem !default; - -// 15. Side Navigation -// ========================================================================== - -$sidenav-font-size: 14px !default; -$sidenav-font-color: rgba(0,0,0,.87) !default; -$sidenav-bg-color: #fff !default; -$sidenav-padding: 16px !default; -$sidenav-item-height: 48px !default; -$sidenav-line-height: $sidenav-item-height !default; - - -// 16. Photo Slider -// ========================================================================== - -$slider-bg-color: color('grey', 'base') !default; -$slider-bg-color-light: color('grey', 'lighten-2') !default; -$slider-indicator-color: color('green', 'base') !default; - - -// 17. Spinners | Loaders -// ========================================================================== - -$spinner-default-color: $secondary-color !default; - - -// 18. Tabs -// ========================================================================== - -$tabs-underline-color: $primary-color-light !default; -$tabs-text-color: $primary-color !default; -$tabs-bg-color: #fff !default; - - -// 19. Tables -// ========================================================================== - -$table-border-color: #d0d0d0 !default; -$table-striped-color: #f2f2f2 !default; - - -// 20. Toasts -// ========================================================================== - -$toast-height: 48px !default; -$toast-color: #323232 !default; -$toast-text-color: #fff !default; -$toast-action-color: #eeff41; - - -// 21. Typography -// ========================================================================== - -$off-black: rgba(0, 0, 0, 0.87) !default; -// Header Styles -$h1-fontsize: 4.2rem !default; -$h2-fontsize: 3.56rem !default; -$h3-fontsize: 2.92rem !default; -$h4-fontsize: 2.28rem !default; -$h5-fontsize: 1.64rem !default; -$h6-fontsize: 1rem !default; - - -// 22. Footer -// ========================================================================== - -$footer-font-color: #fff !default; -$footer-bg-color: $primary-color !default; -$footer-copyright-font-color: rgba(255,255,255,.8) !default; -$footer-copyright-bg-color: rgba(51,51,51,.08) !default; - - -// 23. Flow Text -// ========================================================================== - -$range : $large-screen - $small-screen !default; -$intervals: 20 !default; -$interval-size: $range / $intervals !default; - - -// 24. Collections -// ========================================================================== - -$collection-border-color: #e0e0e0 !default; -$collection-bg-color: #fff !default; -$collection-active-bg-color: $secondary-color !default; -$collection-active-color: lighten($secondary-color, 55%) !default; -$collection-hover-bg-color: #ddd !default; -$collection-link-color: $secondary-color !default; -$collection-line-height: 1.5rem !default; - - -// 25. Progress Bar -// ========================================================================== - -$progress-bar-color: $secondary-color !default; diff --git a/_sass/materialize-src/sass/components/_waves.scss b/_sass/materialize-src/sass/components/_waves.scss deleted file mode 100644 index b36c7181..00000000 --- a/_sass/materialize-src/sass/components/_waves.scss +++ /dev/null @@ -1,114 +0,0 @@ - -/*! - * Waves v0.6.0 - * http://fian.my.id/Waves - * - * Copyright 2014 Alfiana E. Sibuea and other contributors - * Released under the MIT license - * https://github.com/fians/Waves/blob/master/LICENSE - */ - - -.waves-effect { - position: relative; - cursor: pointer; - display: inline-block; - overflow: hidden; - user-select: none; - -webkit-tap-highlight-color: transparent; - vertical-align: middle; - z-index: 1; - transition: .3s ease-out; - - .waves-ripple { - position: absolute; - border-radius: 50%; - width: 20px; - height: 20px; - margin-top:-10px; - margin-left:-10px; - opacity: 0; - - background: rgba(0,0,0,0.2); - transition: all 0.7s ease-out; - transition-property: transform, opacity; - transform: scale(0); - pointer-events: none; - } - - // Waves Colors - &.waves-light .waves-ripple { - background-color: rgba(255, 255, 255, 0.45); - } - &.waves-red .waves-ripple { - background-color: rgba(244, 67, 54, .70); - } - &.waves-yellow .waves-ripple { - background-color: rgba(255, 235, 59, .70); - } - &.waves-orange .waves-ripple { - background-color: rgba(255, 152, 0, .70); - } - &.waves-purple .waves-ripple { - background-color: rgba(156, 39, 176, 0.70); - } - &.waves-green .waves-ripple { - background-color: rgba(76, 175, 80, 0.70); - } - &.waves-teal .waves-ripple { - background-color: rgba(0, 150, 136, 0.70); - } - - // Style input button bug. - input[type="button"], input[type="reset"], input[type="submit"] { - border: 0; - font-style: normal; - font-size: inherit; - text-transform: inherit; - background: none; - } - - img { - position: relative; - z-index: -1; - } -} - -.waves-notransition { - transition: none #{"!important"}; -} - -.waves-circle { - transform: translateZ(0); - -webkit-mask-image: -webkit-radial-gradient(circle, white 100%, black 100%); -} - -.waves-input-wrapper { - border-radius: 0.2em; - vertical-align: bottom; - - .waves-button-input { - position: relative; - top: 0; - left: 0; - z-index: 1; - } -} - -.waves-circle { - text-align: center; - width: 2.5em; - height: 2.5em; - line-height: 2.5em; - border-radius: 50%; - -webkit-mask-image: none; -} - -.waves-block { - display: block; -} - -/* Firefox Bug: link not triggered */ -.waves-effect .waves-ripple { - z-index: -1; -} \ No newline at end of file diff --git a/_sass/materialize-src/sass/components/date_picker/_default.date.scss b/_sass/materialize-src/sass/components/date_picker/_default.date.scss deleted file mode 100644 index 39ca1f2d..00000000 --- a/_sass/materialize-src/sass/components/date_picker/_default.date.scss +++ /dev/null @@ -1,456 +0,0 @@ -/* ========================================================================== - $BASE-DATE-PICKER - ========================================================================== */ -/** - * The picker box. - */ -.picker__box { - padding: 0; - border-radius: 2px; - overflow: hidden; -} -/** - * The header containing the month and year stuff. - */ -.picker__header { - text-align: center; - position: relative; - margin-top: .75em; -} -/** - * The month and year labels. - */ -.picker__month, -.picker__year { -// font-weight: 500; - display: inline-block; - margin-left: .25em; - margin-right: .25em; -} -/** - * The month and year selectors. - */ -.picker__select--month, -.picker__select--year { - - height: 2em; - padding: 0; - margin-left: .25em; - margin-right: .25em; -} - -// Modified -.picker__select--month.browser-default { - display: inline; - background-color: #FFFFFF; - width: 40%; -} -.picker__select--year.browser-default { - display: inline; - background-color: #FFFFFF; - width: 26%; -} -.picker__select--month:focus, -.picker__select--year:focus { - border-color: $datepicker-focus; -} -/** - * The month navigation buttons. - */ -.picker__nav--prev, -.picker__nav--next { - position: absolute; - padding: .5em 1.25em; - width: 1em; - height: 1em; - box-sizing: content-box; - top: -0.25em; -} -//@media (min-width: 24.5em) { -// .picker__nav--prev, -// .picker__nav--next { -// top: -0.33em; -// } -//} -.picker__nav--prev { - left: -1em; - padding-right: 1.25em; -} -//@media (min-width: 24.5em) { -// .picker__nav--prev { -// padding-right: 1.5em; -// } -//} -.picker__nav--next { - right: -1em; - padding-left: 1.25em; -} -//@media (min-width: 24.5em) { -// .picker__nav--next { -// padding-left: 1.5em; -// } -//} - -.picker__nav--disabled, -.picker__nav--disabled:hover, -.picker__nav--disabled:before, -.picker__nav--disabled:before:hover { - cursor: default; - background: none; - border-right-color: #f5f5f5; - border-left-color: #f5f5f5; -} -/** - * The calendar table of dates - */ -.picker__table { - text-align: center; - border-collapse: collapse; - border-spacing: 0; - table-layout: fixed; - font-size: 1rem; - width: 100%; - margin-top: .75em; - margin-bottom: .5em; -} - - - -.picker__table th, .picker__table td { - text-align: center; -} - - - - - - -.picker__table td { - margin: 0; - padding: 0; -} -/** - * The weekday labels - */ -.picker__weekday { - width: 14.285714286%; - font-size: .75em; - padding-bottom: .25em; - color: #999999; - font-weight: 500; - /* Increase the spacing a tad */ -} -@media (min-height: 33.875em) { - .picker__weekday { - padding-bottom: .5em; - } -} -/** - * The days on the calendar - */ - -.picker__day--today { - position: relative; - color: #595959; - letter-spacing: -.3; - padding: .75rem 0; - font-weight: 400; - border: 1px solid transparent; - -} - -//.picker__day--today:before { -// content: " "; -// position: absolute; -// top: 2px; -// right: 2px; -// width: 0; -// height: 0; -// border-top: 0.5em solid #0059bc; -// border-left: .5em solid transparent; -//} -.picker__day--disabled:before { - border-top-color: #aaaaaa; -} - - -.picker__day--infocus:hover{ - cursor: pointer; - color: #000; - font-weight: 500; -} - -.picker__day--outfocus { - display: none; - padding: .75rem 0; - color: #fff; - -} -.picker__day--outfocus:hover { - cursor: pointer; - color: #dddddd; -// background: #b1dcfb; - font-weight: 500; -} - - -.picker__day--highlighted { -// border-color: #0089ec; -} -.picker__day--highlighted:hover, -.picker--focused .picker__day--highlighted { - cursor: pointer; -// color: #000000; -// background: #b1dcfb; -// font-weight: 500; -} -.picker__day--selected, -.picker__day--selected:hover, -.picker--focused .picker__day--selected { - - -// Circle background - border-radius: 50%; - transform: scale(.75); - background: #0089ec; - color: #ffffff; -} -.picker__day--disabled, -.picker__day--disabled:hover, -.picker--focused .picker__day--disabled { - background: #f5f5f5; - border-color: #f5f5f5; - color: #dddddd; - cursor: default; -} -.picker__day--highlighted.picker__day--disabled, -.picker__day--highlighted.picker__day--disabled:hover { - background: #bbbbbb; -} -/** - * The footer containing the "today", "clear", and "close" buttons. - */ -.picker__footer { - text-align: right; -} -.picker__button--today, -.picker__button--clear, -.picker__button--close { - border: 1px solid #ffffff; - background: #ffffff; - font-size: .8em; - padding: .66em 0; - font-weight: bold; - width: 33%; - display: inline-block; - vertical-align: bottom; -} -.picker__button--today:hover, -.picker__button--clear:hover, -.picker__button--close:hover { - cursor: pointer; - color: #000000; - background: #b1dcfb; - border-bottom-color: #b1dcfb; -} -.picker__button--today:focus, -.picker__button--clear:focus, -.picker__button--close:focus { - background: #b1dcfb; - border-color: $datepicker-focus; - outline: none; -} -.picker__button--today:before, -.picker__button--clear:before, -.picker__button--close:before { - position: relative; - display: inline-block; - height: 0; -} -.picker__button--today:before, -.picker__button--clear:before { - content: " "; - margin-right: .45em; -} -.picker__button--today:before { - top: -0.05em; - width: 0; - border-top: 0.66em solid #0059bc; - border-left: .66em solid transparent; -} -.picker__button--clear:before { - top: -0.25em; - width: .66em; - border-top: 3px solid #ee2200; -} -.picker__button--close:before { - content: "\D7"; - top: -0.1em; - vertical-align: top; - font-size: 1.1em; - margin-right: .35em; - color: #777777; -} -.picker__button--today[disabled], -.picker__button--today[disabled]:hover { - background: #f5f5f5; - border-color: #f5f5f5; - color: #dddddd; - cursor: default; -} -.picker__button--today[disabled]:before { - border-top-color: #aaaaaa; -} - -/* ========================================================================== - CUSTOM MATERIALIZE STYLES - ========================================================================== */ -/*.picker__box { - border-radius: 2px; - overflow: hidden; -}*/ - -.picker__date-display { - text-align: left; - background-color: $datepicker-date-bg; - color: #fff; - padding: 18px; - font-weight: 300; -} - -@media only screen and (min-width: 601px) { - .picker__date-display { - flex:1; - } - .picker__weekday-display { - display:block; - } - .picker__container__wrapper { - flex:2 - } -} - -.picker__nav--prev:hover, -.picker__nav--next:hover { - cursor: pointer; - color: #000000; - background: $datepicker-selected-outfocus; -} - -.picker__weekday-display { - font-weight: 500; - font-size: $datepicker-display-font-size; - margin-right: 5px; - margin-top: 4px; -} - -.picker__month-display { - //text-transform: uppercase; - font-size: $datepicker-display-font-size; - font-weight: 500; -} -.picker__day-display { - font-size: $datepicker-display-font-size; - font-weight: 500; - margin-right: 5px; -} -.picker__year-display { - font-size: 1.5rem; - font-weight: 500; - color: $datepicker-year; -} - -/*.picker__box { - padding: 0; -}*/ -.picker__calendar-container { - padding: 0 1rem; - - thead { - border: none; - } -} - -// Calendar -.picker__table { - margin-top: 0; - margin-bottom: .5em; -} - -.picker__day--infocus { - color: $datepicker-weekday-color; - letter-spacing: -.3px; - padding: 0.75rem 0; - font-weight: 400; - border: 1px solid transparent; -} -@media only screen and (min-width: 601px) { - .picker__day--infocus { - padding: 1.1rem 0; - } -} - - -//Today style -.picker__day.picker__day--today { - color: $datepicker-selected; -} - -.picker__day.picker__day--today.picker__day--selected { - color: #fff; -} - -// Table Header -.picker__weekday { - font-size: .9rem; -} - - -.picker__day--selected, -.picker__day--selected:hover, -.picker--focused .picker__day--selected { - // Circle background - border-radius: 50%; - transform: scale(.9); - background-color: $datepicker-selected; - &.picker__day--outfocus { - background-color: $datepicker-selected-outfocus; - } - color: #ffffff; -} - -.picker__footer { - text-align: right; - padding: 5px 10px; -} - -// Materialize modified -.picker__close, .picker__today, .picker__clear { - font-size: 1.1rem; - padding: 0 1rem; - color: $datepicker-selected; -} -.picker__clear { - color:#f44336; - float:left; -} - -//month nav buttons -.picker__nav--prev:before, -.picker__nav--next:before { - content: " "; - border-top: .5em solid transparent; - border-bottom: .5em solid transparent; - border-right: 0.75em solid #676767; - width: 0; - height: 0; - display: block; - margin: 0 auto; -} -.picker__nav--next:before { - border-right: 0; - border-left: 0.75em solid #676767; -} -button.picker__today:focus, button.picker__clear:focus, button.picker__close:focus { - background-color: $datepicker-selected-outfocus; -} diff --git a/_sass/materialize-src/sass/components/date_picker/_default.scss b/_sass/materialize-src/sass/components/date_picker/_default.scss deleted file mode 100644 index b091e55d..00000000 --- a/_sass/materialize-src/sass/components/date_picker/_default.scss +++ /dev/null @@ -1,212 +0,0 @@ -/* ========================================================================== - $BASE-PICKER - ========================================================================== */ -/** - * Note: the root picker element should *NOT* be styled more than what's here. - */ -.picker { - font-size: 16px; - text-align: left; - line-height: 1.2; - color: #000000; - position: absolute; - z-index: 10000; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - outline: none; -} -/** - * The picker input element. - */ -.picker__input { - cursor: default; -} -/** - * When the picker is opened, the input element is "activated". - */ -.picker__input.picker__input--active { - border-color: #0089ec; -} -/** - * The holder is the only "scrollable" top-level container element. - */ -.picker__holder { - width: 100%; - overflow-y: auto; - -webkit-overflow-scrolling: touch; -} - -/*! - * Default mobile-first, responsive styling for pickadate.js - * Demo: http://amsul.github.io/pickadate.js - */ -/** - * Note: the root picker element should *NOT* be styled more than what's here. - */ -/** - * Make the holder and frame fullscreen. - */ -.picker__holder, -.picker__frame { - bottom: 0; - left: 0; - right: 0; - top: 100%; -} -/** - * The holder should overlay the entire screen. - */ -.picker__holder { - position: fixed; - -webkit-transition: background 0.15s ease-out, top 0s 0.15s; - -moz-transition: background 0.15s ease-out, top 0s 0.15s; - transition: background 0.15s ease-out, top 0s 0.15s; - -webkit-backface-visibility: hidden; -} -/** - * The frame that bounds the box contents of the picker. - */ -.picker__frame { - position: absolute; - margin: 0 auto; - min-width: 256px; - -// picker width - width: 300px; - max-height: 350px; - - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: alpha(opacity=0); - -moz-opacity: 0; - opacity: 0; - -webkit-transition: all 0.15s ease-out; - -moz-transition: all 0.15s ease-out; - transition: all 0.15s ease-out; -} -@media (min-height: 28.875em) { - .picker__frame { - overflow: visible; - top: auto; - bottom: -100%; - max-height: 80%; - } -} -@media (min-height: 40.125em) { - .picker__frame { - margin-bottom: 7.5%; - } -} -/** - * The wrapper sets the stage to vertically align the box contents. - */ -.picker__wrap { - display: table; - width: 100%; - height: 100%; -} -@media (min-height: 28.875em) { - .picker__wrap { - display: block; - } -} -/** - * The box contains all the picker contents. - */ -.picker__box { - background: #ffffff; - display: table-cell; - vertical-align: middle; -} -//@media (min-height: 26.5em) { -// .picker__box { -//// font-size: 1.25em; -// } -//} -@media (min-height: 28.875em) { - .picker__box { - display: block; - -// picker header font-size -// font-size: 1rem; - - border: 1px solid #777777; - border-top-color: #898989; - border-bottom-width: 0; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; - -webkit-box-shadow: 0 12px 36px 16px rgba(0, 0, 0, 0.24); - -moz-box-shadow: 0 12px 36px 16px rgba(0, 0, 0, 0.24); - box-shadow: 0 12px 36px 16px rgba(0, 0, 0, 0.24); - } -} -//@media (min-height: 40.125em) { -// .picker__box { -// font-size: 1.1rem; -// border-bottom-width: 1px; -// -webkit-border-radius: 5px; -// -moz-border-radius: 5px; -// border-radius: 5px; -// } -//} -/** - * When the picker opens... - */ -.picker--opened .picker__holder { - top: 0; - background: transparent; - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)"; - zoom: 1; - background: rgba(0, 0, 0, 0.32); - -webkit-transition: background 0.15s ease-out; - -moz-transition: background 0.15s ease-out; - transition: background 0.15s ease-out; -} -.picker--opened .picker__frame { - top: 0; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; - filter: alpha(opacity=100); - -moz-opacity: 1; - opacity: 1; -} -@media (min-height: 35.875em) { - .picker--opened .picker__frame { - top: 10%; - bottom: auto; - } -} -/** - * For `large` screens, transform into an inline picker. - */ - -/* ========================================================================== - CUSTOM MATERIALIZE STYLES - ========================================================================== */ - -.picker__input.picker__input--active { - border-color: color("blue", "lighten-5"); -} - -.picker__frame { - margin: 0 auto; - max-width: 325px; -} - -@media (min-height: 38.875em) { - .picker--opened .picker__frame { - top: 10%; - bottom: auto; - } -} - -@media only screen and (min-width: 601px) { - .picker__box { - display:flex; - } - .picker__frame { - width: 80%; - max-width:600px; - } -} diff --git a/_sass/materialize-src/sass/components/date_picker/_default.time.scss b/_sass/materialize-src/sass/components/date_picker/_default.time.scss deleted file mode 100644 index ae0b778f..00000000 --- a/_sass/materialize-src/sass/components/date_picker/_default.time.scss +++ /dev/null @@ -1,267 +0,0 @@ -/* ========================================================================== - $BASE-TIME-PICKER - ========================================================================== */ -/** - * The list of times. - */ -.picker__list { - list-style: none; - padding: 0.75em 0 4.2em; - margin: 0; -} -/** - * The times on the clock. - */ -.picker__list-item { - border-bottom: 1px solid #ddd; - border-top: 1px solid #ddd; - margin-bottom: -1px; - position: relative; - background: #fff; - padding: .75em 1.25em; -} -@media (min-height: 46.75em) { - .picker__list-item { - padding: .5em 1em; - } -} -/* Hovered time */ -.picker__list-item:hover { - cursor: pointer; - color: #000; - background: #b1dcfb; - border-color: #0089ec; - z-index: 10; -} -/* Highlighted and hovered/focused time */ -.picker__list-item--highlighted { - border-color: #0089ec; - z-index: 10; -} -.picker__list-item--highlighted:hover, -.picker--focused .picker__list-item--highlighted { - cursor: pointer; - color: #000; - background: #b1dcfb; -} -/* Selected and hovered/focused time */ -.picker__list-item--selected, -.picker__list-item--selected:hover, -.picker--focused .picker__list-item--selected { - background: #0089ec; - color: #fff; - z-index: 10; -} -/* Disabled time */ -.picker__list-item--disabled, -.picker__list-item--disabled:hover, -.picker--focused .picker__list-item--disabled { - background: #f5f5f5; - border-color: #f5f5f5; - color: #ddd; - cursor: default; - border-color: #ddd; - z-index: auto; -} -/** - * The clear button - */ -.picker--time .picker__button--clear { - display: block; - width: 80%; - margin: 1em auto 0; - padding: 1em 1.25em; - background: none; - border: 0; - font-weight: 500; - font-size: .67em; - text-align: center; - text-transform: uppercase; - color: $timepicker-clock-color; -} -.picker--time .picker__button--clear:hover, -.picker--time .picker__button--clear:focus { - color: #000; - background: #b1dcfb; - background: #ee2200; - border-color: #ee2200; - cursor: pointer; - color: #fff; - outline: none; -} -.picker--time .picker__button--clear:before { - top: -0.25em; - color: $timepicker-clock-color; - font-size: 1.25em; - font-weight: bold; -} -.picker--time .picker__button--clear:hover:before, -.picker--time .picker__button--clear:focus:before { - color: #fff; -} - -/* ========================================================================== - $DEFAULT-TIME-PICKER - ========================================================================== */ -/** - * The frame the bounds the time picker. - */ -.picker--time .picker__frame { - min-width: 256px; - max-width: 320px; -} -/** - * The picker box. - */ -.picker--time .picker__box { - font-size: 1em; - background: #f2f2f2; - padding: 0; -} -@media (min-height: 40.125em) { - .picker--time .picker__box { - margin-bottom: 5em; - } -} - -/* ========================================================================== - $DEFAULT-TIME-PICKER - ========================================================================== */ -.clockpicker-display { - font-size: 4rem; - font-weight: bold; - text-align: center; - color: rgba(255, 255, 255, 0.6); - font-weight: 400; - clear: both; - position: relative; -} - -.clockpicker-span-am-pm { - font-size: 1.3rem; - position: absolute; - right: 1rem; - bottom: 0.3rem; - line-height: 2rem; - font-weight: 500; -} -@media only screen and (min-width: 601px) { - .clockpicker-display { - top: 32%; - } - .clockpicker-span-am-pm { - position: relative; - right: auto; - bottom: auto; - text-align: center; - margin-top: 1.2rem; - } -} - - -.text-primary{ - color: rgba(255, 255, 255, 1) -} -.clockpicker-span-hours { - margin-right: 3px; -} -.clockpicker-span-minutes { - margin-left: 3px; -} - -.clockpicker-span-hours, -.clockpicker-span-minutes, -.clockpicker-span-am-pm div { - cursor: pointer; -} -.clockpicker-moving { - cursor: move; -} -.clockpicker-plate { - background-color: $timepicker-clock-plate-bg; - border-radius: 50%; - width: 270px; - height: 270px; - overflow: visible; - position: relative; - margin: auto; - margin-top: 25px; - margin-bottom: 5px; - user-select: none; -} -.clockpicker-canvas, -.clockpicker-dial { - width: 270px; - height: 270px; - position: absolute; - left: -1px; - top: -1px; -} -.clockpicker-minutes { - visibility: hidden; -} -.clockpicker-tick { - border-radius: 50%; - color: $timepicker-clock-color; - line-height: 40px; - text-align: center; - width: 40px; - height: 40px; - position: absolute; - cursor: pointer; -} -.clockpicker-tick.active, -.clockpicker-tick:hover { - background-color: transparentize($secondary-color, .75); -} -.clockpicker-dial { - -webkit-transition: -webkit-transform 350ms, opacity 350ms; - -moz-transition: -moz-transform 350ms, opacity 350ms; - -ms-transition: -ms-transform 350ms, opacity 350ms; - -o-transition: -o-transform 350ms, opacity 350ms; - transition: transform 350ms, opacity 350ms; -} -.clockpicker-dial-out { - opacity: 0; -} -.clockpicker-hours.clockpicker-dial-out { - -webkit-transform: scale(1.2, 1.2); - -moz-transform: scale(1.2, 1.2); - -ms-transform: scale(1.2, 1.2); - -o-transform: scale(1.2, 1.2); - transform: scale(1.2, 1.2); -} -.clockpicker-minutes.clockpicker-dial-out { - -webkit-transform: scale(.8, .8); - -moz-transform: scale(.8, .8); - -ms-transform: scale(.8, .8); - -o-transform: scale(.8, .8); - transform: scale(.8, .8); -} -.clockpicker-canvas { - -webkit-transition: opacity 175ms; - -moz-transition: opacity 175ms; - -ms-transition: opacity 175ms; - -o-transition: opacity 175ms; - transition: opacity 175ms; -} -.clockpicker-canvas-out { - opacity: 0.25; -} -.clockpicker-canvas-bearing { - stroke: none; - fill: $secondary-color; -} -.clockpicker-canvas-bg { - stroke: none; - fill: $secondary-color; -} -.clockpicker-canvas-bg-trans { - fill: $secondary-color; -} -.clockpicker-canvas line { - stroke: $secondary-color; - stroke-width: 4; - stroke-linecap: round; - /*shape-rendering: crispEdges;*/ -} diff --git a/_sass/materialize-src/sass/components/forms/_checkboxes.scss b/_sass/materialize-src/sass/components/forms/_checkboxes.scss deleted file mode 100644 index 60334b28..00000000 --- a/_sass/materialize-src/sass/components/forms/_checkboxes.scss +++ /dev/null @@ -1,210 +0,0 @@ -/* Checkboxes - ========================================================================== */ - -/* CUSTOM CSS CHECKBOXES */ -form p { - margin-bottom: 10px; - text-align: left; -} - -form p:last-child { - margin-bottom: 0; -} - -/* Remove default checkbox */ -[type="checkbox"]:not(:checked), -[type="checkbox"]:checked { - position: absolute; - opacity: 0; - pointer-events: none; -} - -// Checkbox Styles -[type="checkbox"] { - // Text Label Style - + label { - position: relative; - padding-left: 35px; - cursor: pointer; - display: inline-block; - height: 25px; - line-height: 25px; - font-size: 1rem; - user-select: none; - } - - /* checkbox aspect */ - + label:before, - &:not(.filled-in) + label:after { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 18px; - height: 18px; - z-index: 0; - border: 2px solid $radio-empty-color; - border-radius: 1px; - margin-top: 2px; - transition: .2s; - } - - &:not(.filled-in) + label:after { - border: 0; - transform: scale(0); - } - - &:not(:checked):disabled + label:before { - border: none; - background-color: $input-disabled-color; - } - - // Focused styles - &.tabbed:focus + label:after { - transform: scale(1); - border: 0; - border-radius: 50%; - box-shadow: 0 0 0 10px rgba(0,0,0,.1); - background-color: rgba(0,0,0,.1); - } -} - -[type="checkbox"]:checked { - + label:before { - top: -4px; - left: -5px; - width: 12px; - height: 22px; - border-top: 2px solid transparent; - border-left: 2px solid transparent; - border-right: $radio-border; - border-bottom: $radio-border; - transform: rotate(40deg); - backface-visibility: hidden; - transform-origin: 100% 100%; - } - - &:disabled + label:before { - border-right: 2px solid $input-disabled-color; - border-bottom: 2px solid $input-disabled-color; - } -} - -/* Indeterminate checkbox */ -[type="checkbox"]:indeterminate { - +label:before { - top: -11px; - left: -12px; - width: 10px; - height: 22px; - border-top: none; - border-left: none; - border-right: $radio-border; - border-bottom: none; - transform: rotate(90deg); - backface-visibility: hidden; - transform-origin: 100% 100%; - } - - // Disabled indeterminate - &:disabled + label:before { - border-right: 2px solid $input-disabled-color; - background-color: transparent; - } -} - -// Filled in Style -[type="checkbox"].filled-in { - // General - + label:after { - border-radius: 2px; - } - - + label:before, - + label:after { - content: ''; - left: 0; - position: absolute; - /* .1s delay is for check animation */ - transition: border .25s, background-color .25s, width .20s .1s, height .20s .1s, top .20s .1s, left .20s .1s; - z-index: 1; - } - - // Unchecked style - &:not(:checked) + label:before { - width: 0; - height: 0; - border: 3px solid transparent; - left: 6px; - top: 10px; - transform: rotateZ(37deg); - transform-origin: 100% 100%; - } - - &:not(:checked) + label:after { - height: 20px; - width: 20px; - background-color: transparent; - border: 2px solid $radio-empty-color; - top: 0px; - z-index: 0; - } - - // Checked style - &:checked { - + label:before { - top: 0; - left: 1px; - width: 8px; - height: 13px; - border-top: 2px solid transparent; - border-left: 2px solid transparent; - border-right: 2px solid $input-background; - border-bottom: 2px solid $input-background; - transform: rotateZ(37deg); - transform-origin: 100% 100%; - } - - + label:after { - top: 0; - width: 20px; - height: 20px; - border: 2px solid $secondary-color; - background-color: $secondary-color; - z-index: 0; - } - } - - // Focused styles - &.tabbed:focus + label:after { - border-radius: 2px; - border-color: $radio-empty-color; - background-color: rgba(0,0,0,.1); - } - - &.tabbed:checked:focus + label:after { - border-radius: 2px; - background-color: $secondary-color; - border-color: $secondary-color; - } - - // Disabled style - &:disabled:not(:checked) + label:before { - background-color: transparent; - border: 2px solid transparent; - } - - &:disabled:not(:checked) + label:after { - border-color: transparent; - background-color: $input-disabled-solid-color; - } - - &:disabled:checked + label:before { - background-color: transparent; - } - - &:disabled:checked + label:after { - background-color: $input-disabled-solid-color; - border-color: $input-disabled-solid-color; - } -} diff --git a/_sass/materialize-src/sass/components/forms/_file-input.scss b/_sass/materialize-src/sass/components/forms/_file-input.scss deleted file mode 100644 index e0f7ef73..00000000 --- a/_sass/materialize-src/sass/components/forms/_file-input.scss +++ /dev/null @@ -1,44 +0,0 @@ -/* File Input - ========================================================================== */ - -.file-field { - position: relative; - - .file-path-wrapper { - overflow: hidden; - padding-left: 10px; - } - - input.file-path { width: 100%; } - - .btn { - float: left; - height: $input-height; - line-height: $input-height; - } - - span { - cursor: pointer; - } - - input[type=file] { - - // Needed to override webkit button - &::-webkit-file-upload-button { - display: none; - } - - position: absolute; - top: 0; - right: 0; - left: 0; - bottom: 0; - width: 100%; - margin: 0; - padding: 0; - font-size: 20px; - cursor: pointer; - opacity: 0; - filter: alpha(opacity=0); - } -} diff --git a/_sass/materialize-src/sass/components/forms/_forms.scss b/_sass/materialize-src/sass/components/forms/_forms.scss deleted file mode 100644 index 4c19f4c8..00000000 --- a/_sass/materialize-src/sass/components/forms/_forms.scss +++ /dev/null @@ -1,22 +0,0 @@ -// Remove Focus Boxes -select:focus { - outline: $select-focus; -} - -button:focus { - outline: none; - background-color: $button-background-focus; -} - -label { - font-size: $label-font-size; - color: $input-border-color; -} - -@import 'input-fields'; -@import 'radio-buttons'; -@import 'checkboxes'; -@import 'switches'; -@import 'select'; -@import 'file-input'; -@import 'range'; diff --git a/_sass/materialize-src/sass/components/forms/_input-fields.scss b/_sass/materialize-src/sass/components/forms/_input-fields.scss deleted file mode 100644 index ffdf5222..00000000 --- a/_sass/materialize-src/sass/components/forms/_input-fields.scss +++ /dev/null @@ -1,333 +0,0 @@ -/* Text Inputs + Textarea - ========================================================================== */ - -/* Style Placeholders */ - -::placeholder { - color: $placeholder-text-color; -} - -/* Text inputs */ - -input:not([type]), -input[type=text]:not(.browser-default), -input[type=password]:not(.browser-default), -input[type=email]:not(.browser-default), -input[type=url]:not(.browser-default), -input[type=time]:not(.browser-default), -input[type=date]:not(.browser-default), -input[type=datetime]:not(.browser-default), -input[type=datetime-local]:not(.browser-default), -input[type=tel]:not(.browser-default), -input[type=number]:not(.browser-default), -input[type=search]:not(.browser-default), -textarea.materialize-textarea { - - // General Styles - background-color: transparent; - border: none; - border-bottom: $input-border; - border-radius: 0; - outline: none; - height: $input-height; - width: 100%; - font-size: $input-font-size; - margin: $input-margin; - padding: $input-padding; - box-shadow: none; - box-sizing: content-box; - transition: $input-transition; - - // Disabled input style - &:disabled, - &[readonly="readonly"] { - color: $input-disabled-color; - border-bottom: $input-disabled-border; - } - - // Disabled label style - &:disabled+label, - &[readonly="readonly"]+label { - color: $input-disabled-color; - } - - // Focused input style - &:focus:not([readonly]) { - border-bottom: 1px solid $input-focus-color; - box-shadow: 0 1px 0 0 $input-focus-color; - } - - // Focused label style - &:focus:not([readonly])+label { - color: $input-focus-color; - } - - // Valid Input Style - &.valid, - &:focus.valid { - @extend %valid-input-style; - } - - // Custom Success Message - &.valid + label:after, - &:focus.valid + label:after { - @extend %custom-success-message; - } - - // Invalid Input Style - &.invalid, - &:focus.invalid { - @extend %invalid-input-style; - } - - // Custom Error message - &.invalid + label:after, - &:focus.invalid + label:after { - @extend %custom-error-message; - } - - // Full width label when using validate for error messages - &.validate + label { - width: 100%; - } - - // Form Message Shared Styles - & + label:after { - @extend %input-after-style; - } - - // TODO: Remove once input fields are reworked to support validation messages better - &.invalid + label:after, - &.valid + label:after{ - display: none; - } - - &.invalid + label.active:after, - &.valid + label.active:after{ - display: block; - } -} - - -/* Validation Sass Placeholders */ -%valid-input-style { - border-bottom: 1px solid $input-success-color; - box-shadow: 0 1px 0 0 $input-success-color; -} -%invalid-input-style { - border-bottom: $input-invalid-border; - box-shadow: 0 1px 0 0 $input-error-color; -} -%custom-success-message { - content: attr(data-success); - color: $input-success-color; - opacity: 1; - transform: translateY(9px); -} -%custom-error-message { - content: attr(data-error); - color: $input-error-color; - opacity: 1; - transform: translateY(9px); -} -%input-after-style { - display: block; - content: ""; - position: absolute; - top: 100%; - left: 0; - opacity: 0; - transition: .2s opacity ease-out, .2s color ease-out; -} - - -// Styling for input field wrapper -.input-field { - // Inline styles - &.inline { - display: inline-block; - vertical-align: middle; - margin-left: 5px; - - input, - .select-dropdown { - margin-bottom: 1rem; - } - } - - // Gutter spacing - &.col { - label { - left: $gutter-width / 2; - } - - .prefix ~ label, - .prefix ~ .validate ~ label { - width: calc(100% - 3rem - #{$gutter-width}); - } - } - - position: relative; - margin-top: 1rem; - - label { - color: $input-border-color; - position: absolute; - top: 0; - left: 0; - height: 100%; - font-size: 1rem; - cursor: text; - transition: transform .2s ease-out; - transform-origin: 0% 100%; - text-align: initial; - transform: translateY(12px); - pointer-events: none; - - &:not(.label-icon).active { - transform: translateY(-14px) scale(.8); - transform-origin: 0 0; - } - } - - // Prefix Icons - .prefix { - position: absolute; - width: $input-height; - font-size: 2rem; - transition: color .2s; - - &.active { color: $input-focus-color; } - } - - .prefix ~ input, - .prefix ~ textarea, - .prefix ~ label, - .prefix ~ .validate ~ label, - .prefix ~ .autocomplete-content { - margin-left: 3rem; - width: 92%; - width: calc(100% - 3rem); - } - - .prefix ~ label { margin-left: 3rem; } - - @media #{$medium-and-down} { - .prefix ~ input { - width: 86%; - width: calc(100% - 3rem); - } - } - - @media #{$small-and-down} { - .prefix ~ input { - width: 80%; - width: calc(100% - 3rem); - } - } -} - - -/* Search Field */ - -.input-field input[type=search] { - display: block; - line-height: inherit; - - .nav-wrapper & { - height: inherit; - padding-left: 4rem; - width: calc(100% - 4rem); - border: 0; - box-shadow: none; - } - - &:focus { - background-color: $input-background; - border: 0; - box-shadow: none; - color: #444; - - & + label i, - & ~ .mdi-navigation-close, - & ~ .material-icons { - color: #444; - } - } - - & + label { - left: 1rem; - } - - & ~ .mdi-navigation-close, - & ~ .material-icons { - position: absolute; - top: 0; - right: 1rem; - color: transparent; - cursor: pointer; - font-size: 2rem; - transition: .3s color; - } -} - - -/* Textarea */ - -// Default textarea -textarea { - width: 100%; - height: $input-height; - background-color: transparent; - - &.materialize-textarea { - // Fixes validation messages for dynamic textareas - &.validate + label { - &::after { - top: calc(100% - 12px); - } - &:not(.label-icon).active { - transform: translateY(-25px); - } - height: 100%; - } - - overflow-y: hidden; /* prevents scroll bar flash */ - padding: .8rem 0 1.6rem 0; /* prevents text jump on Enter keypress */ - resize: none; - min-height: $input-height; - } -} - -// For textarea autoresize -.hiddendiv { - display: none; - white-space: pre-wrap; - word-wrap: break-word; - overflow-wrap: break-word; /* future version of deprecated 'word-wrap' */ - padding-top: 1.2rem; /* prevents text jump on Enter keypress */ - - // Reduces repaints - position: absolute; - top: 0; -} - - -/* Autocomplete */ -.autocomplete-content { - margin-top: -1 * $input-margin-bottom; - margin-bottom: $input-margin-bottom; - display: block; - opacity: 1; - position: static; - - li { - .highlight { color: #444; } - - img { - height: $dropdown-item-height - 10; - width: $dropdown-item-height - 10; - margin: 5px 15px; - } - } -} diff --git a/_sass/materialize-src/sass/components/forms/_radio-buttons.scss b/_sass/materialize-src/sass/components/forms/_radio-buttons.scss deleted file mode 100644 index ca82a960..00000000 --- a/_sass/materialize-src/sass/components/forms/_radio-buttons.scss +++ /dev/null @@ -1,115 +0,0 @@ -/* Radio Buttons - ========================================================================== */ - -// Remove default Radio Buttons -[type="radio"]:not(:checked), -[type="radio"]:checked { - position: absolute; - opacity: 0; - pointer-events: none; -} - -[type="radio"]:not(:checked) + label, -[type="radio"]:checked + label { - position: relative; - padding-left: 35px; - cursor: pointer; - display: inline-block; - height: 25px; - line-height: 25px; - font-size: 1rem; - transition: .28s ease; - user-select: none; -} - -[type="radio"] + label:before, -[type="radio"] + label:after { - content: ''; - position: absolute; - left: 0; - top: 0; - margin: 4px; - width: 16px; - height: 16px; - z-index: 0; - transition: .28s ease; -} - -/* Unchecked styles */ -[type="radio"]:not(:checked) + label:before, -[type="radio"]:not(:checked) + label:after, -[type="radio"]:checked + label:before, -[type="radio"]:checked + label:after, -[type="radio"].with-gap:checked + label:before, -[type="radio"].with-gap:checked + label:after { - border-radius: 50%; -} - -[type="radio"]:not(:checked) + label:before, -[type="radio"]:not(:checked) + label:after { - border: 2px solid $radio-empty-color; -} - -[type="radio"]:not(:checked) + label:after { - transform: scale(0); -} - -/* Checked styles */ -[type="radio"]:checked + label:before { - border: 2px solid transparent; -} - -[type="radio"]:checked + label:after, -[type="radio"].with-gap:checked + label:before, -[type="radio"].with-gap:checked + label:after { - border: $radio-border; -} - -[type="radio"]:checked + label:after, -[type="radio"].with-gap:checked + label:after { - background-color: $radio-fill-color; -} - -[type="radio"]:checked + label:after { - transform: scale(1.02); -} - -/* Radio With gap */ -[type="radio"].with-gap:checked + label:after { - transform: scale(.5); -} - -/* Focused styles */ -[type="radio"].tabbed:focus + label:before { - box-shadow: 0 0 0 10px rgba(0,0,0,.1); -} - -/* Disabled Radio With gap */ -[type="radio"].with-gap:disabled:checked + label:before { - border: 2px solid $input-disabled-color; -} - -[type="radio"].with-gap:disabled:checked + label:after { - border: none; - background-color: $input-disabled-color; -} - -/* Disabled style */ -[type="radio"]:disabled:not(:checked) + label:before, -[type="radio"]:disabled:checked + label:before { - background-color: transparent; - border-color: $input-disabled-color; -} - -[type="radio"]:disabled + label { - color: $input-disabled-color; -} - -[type="radio"]:disabled:not(:checked) + label:before { - border-color: $input-disabled-color; -} - -[type="radio"]:disabled:checked + label:after { - background-color: $input-disabled-color; - border-color: $input-disabled-solid-color; -} diff --git a/_sass/materialize-src/sass/components/forms/_range.scss b/_sass/materialize-src/sass/components/forms/_range.scss deleted file mode 100644 index d37ff7ed..00000000 --- a/_sass/materialize-src/sass/components/forms/_range.scss +++ /dev/null @@ -1,160 +0,0 @@ -/* Range - ========================================================================== */ - -.range-field { - position: relative; -} - -input[type=range], -input[type=range] + .thumb { - @extend .no-select; - cursor: pointer; -} - -input[type=range] { - position: relative; - background-color: transparent; - border: none; - outline: none; - width: 100%; - margin: 15px 0; - padding: 0; - - &:focus { - outline: none; - } -} - -input[type=range] + .thumb { - position: absolute; - top: 10px; - left: 0; - border: none; - height: 0; - width: 0; - border-radius: 50%; - background-color: $radio-fill-color; - margin-left: 7px; - - transform-origin: 50% 50%; - transform: rotate(-45deg); - - .value { - display: block; - width: 30px; - text-align: center; - color: $radio-fill-color; - font-size: 0; - transform: rotate(45deg); - } - - &.active { - border-radius: 50% 50% 50% 0; - - .value { - color: $input-background; - margin-left: -1px; - margin-top: 8px; - font-size: 10px; - } - } -} - -// WebKit -input[type=range] { - -webkit-appearance: none; -} - -input[type=range]::-webkit-slider-runnable-track { - height: $track-height; - background: #c2c0c2; - border: none; -} - -input[type=range]::-webkit-slider-thumb { - -webkit-appearance: none; - border: none; - height: $range-height; - width: $range-width; - border-radius: 50%; - background-color: $radio-fill-color; - transform-origin: 50% 50%; - margin: -5px 0 0 0; - transition: .3s; -} - -input[type=range]:focus::-webkit-slider-runnable-track { - background: #ccc; -} - -// FireFox -input[type=range] { - /* fix for FF unable to apply focus style bug */ - border: 1px solid white; - - /*required for proper track sizing in FF*/ -} - -input[type=range]::-moz-range-track { - height: $track-height; - background: #ddd; - border: none; -} - -input[type=range]::-moz-range-thumb { - border: none; - height: $range-height; - width: $range-width; - border-radius: 50%; - background: $radio-fill-color; - margin-top: -5px; -} - -// hide the outline behind the border -input[type=range]:-moz-focusring { - outline: 1px solid #fff; - outline-offset: -1px; -} - -input[type=range]:focus::-moz-range-track { - background: #ccc; -} - -// IE 10+ -input[type=range]::-ms-track { - height: $track-height; - - // remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead - background: transparent; - - // leave room for the larger thumb to overflow with a transparent border */ - border-color: transparent; - border-width: 6px 0; - - /*remove default tick marks*/ - color: transparent; -} - -input[type=range]::-ms-fill-lower { - background: #777; -} - -input[type=range]::-ms-fill-upper { - background: #ddd; -} - -input[type=range]::-ms-thumb { - border: none; - height: $range-height; - width: $range-width; - border-radius: 50%; - background: $radio-fill-color; -} - -input[type=range]:focus::-ms-fill-lower { - background: #888; -} - -input[type=range]:focus::-ms-fill-upper { - background: #ccc; -} diff --git a/_sass/materialize-src/sass/components/forms/_select.scss b/_sass/materialize-src/sass/components/forms/_select.scss deleted file mode 100644 index bc7208e8..00000000 --- a/_sass/materialize-src/sass/components/forms/_select.scss +++ /dev/null @@ -1,182 +0,0 @@ -/* Select Field - ========================================================================== */ - -select { display: none; } -select.browser-default { display: block; } - -select { - background-color: $select-background; - width: 100%; - padding: $select-padding; - border: $select-border; - border-radius: $select-radius; - height: $input-height; -} - - -.input-field { - & > select { - display: block; - position: absolute; - width: 0; - pointer-events: none; - height: 0; - top: 0; - left: 0; - opacity: 0; - } -} - -.select-label { - position: absolute; -} - -.select-wrapper { - &.valid { - & > input.select-dropdown { - @extend %valid-input-style; - } - - & + label:after { - @extend %custom-success-message; - } - } - - &.invalid { - & > input.select-dropdown { - @extend %invalid-input-style; - } - - & + label:after { - @extend %custom-error-message; - } - } - - &.valid + label, - &.invalid + label { - width: 100%; - pointer-events: none; - } - - & + label:after { - @extend %input-after-style; - } - - position: relative; - - input.select-dropdown { - position: relative; - cursor: pointer; - background-color: transparent; - border: none; - border-bottom: $input-border; - outline: none; - height: $input-height; - line-height: $input-height; - width: 100%; - font-size: $input-font-size; - margin: $input-margin; - padding: 0; - display: block; - user-select:none; - } - - span.caret { - color: initial; - position: absolute; - right: 0; - top: 0; - bottom: 0; - height: 10px; - margin: auto 0; - font-size: 10px; - line-height: 10px; - } - - & + label { - position: absolute; - top: -26px; - font-size: $label-font-size; - } -} - -// Disabled styles -select:disabled { - color: $input-disabled-color; -} - -.select-wrapper.disabled { - span.caret, - & + label { - color: $input-disabled-color; - } -} - -.select-wrapper input.select-dropdown:disabled { - color: $input-disabled-color; - cursor: default; - user-select: none; -} - -.select-wrapper i { - color: $select-disabled-color; -} - -.select-dropdown li.disabled, -.select-dropdown li.disabled > span, -.select-dropdown li.optgroup { - color: $select-disabled-color; - background-color: transparent; -} - -.select-dropdown.dropdown-content { - li { - &.active { - background-color: transparent; - } - - &:hover { - background-color: $select-option-hover; - } - - &.selected { - background-color: $select-option-focus; - } - } -} - -// Prefix Icons -.prefix ~ .select-wrapper { - margin-left: 3rem; - width: 92%; - width: calc(100% - 3rem); -} - -.prefix ~ label { margin-left: 3rem; } - -// Icons -.select-dropdown li { - img { - height: $dropdown-item-height - 10; - width: $dropdown-item-height - 10; - margin: 5px 15px; - float: right; - } -} - -// Optgroup styles -.select-dropdown li.optgroup { - border-top: 1px solid $dropdown-hover-bg-color; - - &.selected > span { - color: rgba(0, 0, 0, .7); - } - - & > span { - color: rgba(0, 0, 0, .4); - } - - & ~ li.optgroup-option { - padding-left: 1rem; - } -} diff --git a/_sass/materialize-src/sass/components/forms/_switches.scss b/_sass/materialize-src/sass/components/forms/_switches.scss deleted file mode 100644 index 3296b12c..00000000 --- a/_sass/materialize-src/sass/components/forms/_switches.scss +++ /dev/null @@ -1,89 +0,0 @@ -/* Switch - ========================================================================== */ - -.switch, -.switch * { - -webkit-tap-highlight-color: transparent; - user-select: none; -} - -.switch label { - cursor: pointer; -} - -.switch label input[type=checkbox] { - opacity: 0; - width: 0; - height: 0; - - &:checked + .lever { - background-color: $switch-checked-lever-bg; - - &:before, &:after { - left: 18px; - } - - &:after { - background-color: $switch-bg-color; - } - } -} - -.switch label .lever { - content: ""; - display: inline-block; - position: relative; - width: 36px; - height: 14px; - background-color: $switch-unchecked-lever-bg; - border-radius: $switch-radius; - margin-right: 10px; - transition: background 0.3s ease; - vertical-align: middle; - margin: 0 16px; - - &:before, &:after { - content: ""; - position: absolute; - display: inline-block; - width: 20px; - height: 20px; - border-radius: 50%; - left: 0; - top: -3px; - transition: left 0.3s ease, background .3s ease, box-shadow 0.1s ease, transform .1s ease; - } - - &:before { - background-color: transparentize($switch-bg-color, .85); - } - - &:after { - background-color: $switch-unchecked-bg; - box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); - } -} - -// Switch active style -input[type=checkbox]:checked:not(:disabled) ~ .lever:active::before, -input[type=checkbox]:checked:not(:disabled).tabbed:focus ~ .lever::before { - transform: scale(2.4); - background-color: transparentize($switch-bg-color, .85); -} - -input[type=checkbox]:not(:disabled) ~ .lever:active:before, -input[type=checkbox]:not(:disabled).tabbed:focus ~ .lever::before { - transform: scale(2.4); - background-color: rgba(0,0,0,.08); -} - -// Disabled Styles -.switch input[type=checkbox][disabled] + .lever { - cursor: default; - background-color: rgba(0,0,0,.12); -} - -.switch label input[type=checkbox][disabled] + .lever:after, -.switch label input[type=checkbox][disabled]:checked + .lever:after { - background-color: $input-disabled-solid-color; -} diff --git a/_sass/materialize-src/sass/materialize.scss b/_sass/materialize-src/sass/materialize.scss deleted file mode 100644 index 7ce0b572..00000000 --- a/_sass/materialize-src/sass/materialize.scss +++ /dev/null @@ -1,42 +0,0 @@ -//@charset "UTF-8"; - -// Colors -@import "components/color"; - -// Variables; -@import "components/variables"; - -// Reset -@import "components/normalize"; - -// components -@import "components/global"; -@import "components/badges"; -@import "components/icons-material-design"; -@import "components/grid"; -@import "components/navbar"; -@import "components/roboto"; -@import "components/typography"; -@import "components/transitions"; -@import "components/cards"; -@import "components/toast"; -@import "components/tabs"; -@import "components/tooltip"; -@import "components/buttons"; -@import "components/dropdown"; -@import "components/waves"; -@import "components/modal"; -@import "components/collapsible"; -@import "components/chips"; -@import "components/materialbox"; -@import "components/forms/forms"; -@import "components/table_of_contents"; -@import "components/sideNav"; -@import "components/preloader"; -@import "components/slider"; -@import "components/carousel"; -@import "components/tapTarget"; -@import "components/pulse"; -@import "components/date_picker/default"; -@import "components/date_picker/default.date"; -@import "components/date_picker/default.time"; diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 00000000..5cac030d --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,10 @@ +import { defineConfig } from "astro/config"; + +export default defineConfig({ + site: "https://openastronomy.org", + trailingSlash: "always", + outDir: "html", + build: { + format: "directory", + }, +}); diff --git a/css/bootstrap/bootstrap-responsive.css b/css/bootstrap/bootstrap-responsive.css deleted file mode 100644 index a3352d77..00000000 --- a/css/bootstrap/bootstrap-responsive.css +++ /dev/null @@ -1,1092 +0,0 @@ -/*! - * Bootstrap Responsive v2.2.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -@-ms-viewport { - width: device-width; -} - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -.visible-desktop { - display: inherit !important; -} - -@media (min-width: 768px) and (max-width: 979px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } -} - -@media (max-width: 767px) { - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 30px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.564102564102564%; - *margin-left: 2.5109110747408616%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.564102564102564%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145299145%; - *width: 91.39979996362975%; - } - .row-fluid .span10 { - width: 82.90598290598291%; - *width: 82.8527914166212%; - } - .row-fluid .span9 { - width: 74.35897435897436%; - *width: 74.30578286961266%; - } - .row-fluid .span8 { - width: 65.81196581196582%; - *width: 65.75877432260411%; - } - .row-fluid .span7 { - width: 57.26495726495726%; - *width: 57.21176577559556%; - } - .row-fluid .span6 { - width: 48.717948717948715%; - *width: 48.664757228587014%; - } - .row-fluid .span5 { - width: 40.17094017094017%; - *width: 40.11774868157847%; - } - .row-fluid .span4 { - width: 31.623931623931625%; - *width: 31.570740134569924%; - } - .row-fluid .span3 { - width: 23.076923076923077%; - *width: 23.023731587561375%; - } - .row-fluid .span2 { - width: 14.52991452991453%; - *width: 14.476723040552828%; - } - .row-fluid .span1 { - width: 5.982905982905983%; - *width: 5.929714493544281%; - } - .row-fluid .offset12 { - margin-left: 105.12820512820512%; - *margin-left: 105.02182214948171%; - } - .row-fluid .offset12:first-child { - margin-left: 102.56410256410257%; - *margin-left: 102.45771958537915%; - } - .row-fluid .offset11 { - margin-left: 96.58119658119658%; - *margin-left: 96.47481360247316%; - } - .row-fluid .offset11:first-child { - margin-left: 94.01709401709402%; - *margin-left: 93.91071103837061%; - } - .row-fluid .offset10 { - margin-left: 88.03418803418803%; - *margin-left: 87.92780505546462%; - } - .row-fluid .offset10:first-child { - margin-left: 85.47008547008548%; - *margin-left: 85.36370249136206%; - } - .row-fluid .offset9 { - margin-left: 79.48717948717949%; - *margin-left: 79.38079650845607%; - } - .row-fluid .offset9:first-child { - margin-left: 76.92307692307693%; - *margin-left: 76.81669394435352%; - } - .row-fluid .offset8 { - margin-left: 70.94017094017094%; - *margin-left: 70.83378796144753%; - } - .row-fluid .offset8:first-child { - margin-left: 68.37606837606839%; - *margin-left: 68.26968539734497%; - } - .row-fluid .offset7 { - margin-left: 62.393162393162385%; - *margin-left: 62.28677941443899%; - } - .row-fluid .offset7:first-child { - margin-left: 59.82905982905982%; - *margin-left: 59.72267685033642%; - } - .row-fluid .offset6 { - margin-left: 53.84615384615384%; - *margin-left: 53.739770867430444%; - } - .row-fluid .offset6:first-child { - margin-left: 51.28205128205128%; - *margin-left: 51.175668303327875%; - } - .row-fluid .offset5 { - margin-left: 45.299145299145295%; - *margin-left: 45.1927623204219%; - } - .row-fluid .offset5:first-child { - margin-left: 42.73504273504273%; - *margin-left: 42.62865975631933%; - } - .row-fluid .offset4 { - margin-left: 36.75213675213675%; - *margin-left: 36.645753773413354%; - } - .row-fluid .offset4:first-child { - margin-left: 34.18803418803419%; - *margin-left: 34.081651209310785%; - } - .row-fluid .offset3 { - margin-left: 28.205128205128204%; - *margin-left: 28.0987452264048%; - } - .row-fluid .offset3:first-child { - margin-left: 25.641025641025642%; - *margin-left: 25.53464266230224%; - } - .row-fluid .offset2 { - margin-left: 19.65811965811966%; - *margin-left: 19.551736679396257%; - } - .row-fluid .offset2:first-child { - margin-left: 17.094017094017094%; - *margin-left: 16.98763411529369%; - } - .row-fluid .offset1 { - margin-left: 11.11111111111111%; - *margin-left: 11.004728132387708%; - } - .row-fluid .offset1:first-child { - margin-left: 8.547008547008547%; - *margin-left: 8.440625568285142%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 30px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1156px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1056px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 956px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 856px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 756px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 656px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 556px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 456px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 356px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 256px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 156px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 56px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - line-height: 0; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; - } - .container, - .navbar-static-top .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - line-height: 0; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.7624309392265194%; - *margin-left: 2.709239449864817%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.7624309392265194%; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.43646408839778%; - *width: 91.38327259903608%; - } - .row-fluid .span10 { - width: 82.87292817679558%; - *width: 82.81973668743387%; - } - .row-fluid .span9 { - width: 74.30939226519337%; - *width: 74.25620077583166%; - } - .row-fluid .span8 { - width: 65.74585635359117%; - *width: 65.69266486422946%; - } - .row-fluid .span7 { - width: 57.18232044198895%; - *width: 57.12912895262725%; - } - .row-fluid .span6 { - width: 48.61878453038674%; - *width: 48.56559304102504%; - } - .row-fluid .span5 { - width: 40.05524861878453%; - *width: 40.00205712942283%; - } - .row-fluid .span4 { - width: 31.491712707182323%; - *width: 31.43852121782062%; - } - .row-fluid .span3 { - width: 22.92817679558011%; - *width: 22.87498530621841%; - } - .row-fluid .span2 { - width: 14.3646408839779%; - *width: 14.311449394616199%; - } - .row-fluid .span1 { - width: 5.801104972375691%; - *width: 5.747913483013988%; - } - .row-fluid .offset12 { - margin-left: 105.52486187845304%; - *margin-left: 105.41847889972962%; - } - .row-fluid .offset12:first-child { - margin-left: 102.76243093922652%; - *margin-left: 102.6560479605031%; - } - .row-fluid .offset11 { - margin-left: 96.96132596685082%; - *margin-left: 96.8549429881274%; - } - .row-fluid .offset11:first-child { - margin-left: 94.1988950276243%; - *margin-left: 94.09251204890089%; - } - .row-fluid .offset10 { - margin-left: 88.39779005524862%; - *margin-left: 88.2914070765252%; - } - .row-fluid .offset10:first-child { - margin-left: 85.6353591160221%; - *margin-left: 85.52897613729868%; - } - .row-fluid .offset9 { - margin-left: 79.8342541436464%; - *margin-left: 79.72787116492299%; - } - .row-fluid .offset9:first-child { - margin-left: 77.07182320441989%; - *margin-left: 76.96544022569647%; - } - .row-fluid .offset8 { - margin-left: 71.2707182320442%; - *margin-left: 71.16433525332079%; - } - .row-fluid .offset8:first-child { - margin-left: 68.50828729281768%; - *margin-left: 68.40190431409427%; - } - .row-fluid .offset7 { - margin-left: 62.70718232044199%; - *margin-left: 62.600799341718584%; - } - .row-fluid .offset7:first-child { - margin-left: 59.94475138121547%; - *margin-left: 59.838368402492065%; - } - .row-fluid .offset6 { - margin-left: 54.14364640883978%; - *margin-left: 54.037263430116376%; - } - .row-fluid .offset6:first-child { - margin-left: 51.38121546961326%; - *margin-left: 51.27483249088986%; - } - .row-fluid .offset5 { - margin-left: 45.58011049723757%; - *margin-left: 45.47372751851417%; - } - .row-fluid .offset5:first-child { - margin-left: 42.81767955801105%; - *margin-left: 42.71129657928765%; - } - .row-fluid .offset4 { - margin-left: 37.01657458563536%; - *margin-left: 36.91019160691196%; - } - .row-fluid .offset4:first-child { - margin-left: 34.25414364640884%; - *margin-left: 34.14776066768544%; - } - .row-fluid .offset3 { - margin-left: 28.45303867403315%; - *margin-left: 28.346655695309746%; - } - .row-fluid .offset3:first-child { - margin-left: 25.69060773480663%; - *margin-left: 25.584224756083227%; - } - .row-fluid .offset2 { - margin-left: 19.88950276243094%; - *margin-left: 19.783119783707537%; - } - .row-fluid .offset2:first-child { - margin-left: 17.12707182320442%; - *margin-left: 17.02068884448102%; - } - .row-fluid .offset1 { - margin-left: 11.32596685082873%; - *margin-left: 11.219583872105325%; - } - .row-fluid .offset1:first-child { - margin-left: 8.56353591160221%; - *margin-left: 8.457152932878806%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 710px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 648px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 586px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 524px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 462px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 400px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 338px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 276px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 214px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 152px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 90px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 28px; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom, - .navbar-static-top { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - .thumbnails > li { - float: none; - margin-left: 0; - } - [class*="span"], - .uneditable-input[class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: 100%; - margin-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .span12, - .row-fluid .span12 { - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="offset"]:first-child { - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } - .controls-row [class*="span"] + [class*="span"] { - margin-left: 0; - } - .modal { - position: fixed; - top: 20px; - right: 20px; - left: 20px; - width: auto; - margin: 0; - } - .modal.fade { - top: -100px; - } - .modal.fade.in { - top: 20px; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 20px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .media .pull-left, - .media .pull-right { - display: block; - float: none; - margin-bottom: 10px; - } - .media-object { - margin-right: 0; - margin-left: 0; - } - .modal { - top: 10px; - right: 10px; - left: 10px; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 20px; - } - .navbar-fixed-bottom { - margin-top: 20px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 10px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #777777; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 9px 15px; - font-weight: bold; - color: #777777; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .dropdown-menu a:hover { - background-color: #f2f2f2; - } - .navbar-inverse .nav-collapse .nav > li > a, - .navbar-inverse .nav-collapse .dropdown-menu a { - color: #999999; - } - .navbar-inverse .nav-collapse .nav > li > a:hover, - .navbar-inverse .nav-collapse .dropdown-menu a:hover { - background-color: #111111; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: none; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .open > .dropdown-menu { - display: block; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .nav > li > .dropdown-menu:before, - .nav-collapse .nav > li > .dropdown-menu:after { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 10px 15px; - margin: 10px 0; - border-top: 1px solid #f2f2f2; - border-bottom: 1px solid #f2f2f2; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar-inverse .nav-collapse .navbar-form, - .navbar-inverse .nav-collapse .navbar-search { - border-top-color: #111111; - border-bottom-color: #111111; - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/css/bootstrap/bootstrap.css b/css/bootstrap/bootstrap.css deleted file mode 100644 index d2dc7108..00000000 --- a/css/bootstrap/bootstrap.css +++ /dev/null @@ -1,6047 +0,0 @@ -/*! - * Bootstrap v2.2.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - width: auto\9; - height: auto; - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img, -.google-maps img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -label, -select, -button, -input[type="button"], -input[type="reset"], -input[type="submit"], -input[type="radio"], -input[type="checkbox"] { - cursor: pointer; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 0.5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } -} - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - line-height: 0; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 30px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 20px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover { - color: #005580; - text-decoration: underline; -} - -.img-rounded { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.img-polaroid { - padding: 4px; - background-color: #fff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.img-circle { - -webkit-border-radius: 500px; - -moz-border-radius: 500px; - border-radius: 500px; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - line-height: 0; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - min-height: 1px; - margin-left: 20px; -} - -.container, -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 30px; - margin-left: 2.127659574468085%; - *margin-left: 2.074468085106383%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .controls-row [class*="span"] + [class*="span"] { - margin-left: 2.127659574468085%; -} - -.row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; -} - -.row-fluid .span11 { - width: 91.48936170212765%; - *width: 91.43617021276594%; -} - -.row-fluid .span10 { - width: 82.97872340425532%; - *width: 82.92553191489361%; -} - -.row-fluid .span9 { - width: 74.46808510638297%; - *width: 74.41489361702126%; -} - -.row-fluid .span8 { - width: 65.95744680851064%; - *width: 65.90425531914893%; -} - -.row-fluid .span7 { - width: 57.44680851063829%; - *width: 57.39361702127659%; -} - -.row-fluid .span6 { - width: 48.93617021276595%; - *width: 48.88297872340425%; -} - -.row-fluid .span5 { - width: 40.42553191489362%; - *width: 40.37234042553192%; -} - -.row-fluid .span4 { - width: 31.914893617021278%; - *width: 31.861702127659576%; -} - -.row-fluid .span3 { - width: 23.404255319148934%; - *width: 23.351063829787233%; -} - -.row-fluid .span2 { - width: 14.893617021276595%; - *width: 14.840425531914894%; -} - -.row-fluid .span1 { - width: 6.382978723404255%; - *width: 6.329787234042553%; -} - -.row-fluid .offset12 { - margin-left: 104.25531914893617%; - *margin-left: 104.14893617021275%; -} - -.row-fluid .offset12:first-child { - margin-left: 102.12765957446808%; - *margin-left: 102.02127659574467%; -} - -.row-fluid .offset11 { - margin-left: 95.74468085106382%; - *margin-left: 95.6382978723404%; -} - -.row-fluid .offset11:first-child { - margin-left: 93.61702127659574%; - *margin-left: 93.51063829787232%; -} - -.row-fluid .offset10 { - margin-left: 87.23404255319149%; - *margin-left: 87.12765957446807%; -} - -.row-fluid .offset10:first-child { - margin-left: 85.1063829787234%; - *margin-left: 84.99999999999999%; -} - -.row-fluid .offset9 { - margin-left: 78.72340425531914%; - *margin-left: 78.61702127659572%; -} - -.row-fluid .offset9:first-child { - margin-left: 76.59574468085106%; - *margin-left: 76.48936170212764%; -} - -.row-fluid .offset8 { - margin-left: 70.2127659574468%; - *margin-left: 70.10638297872339%; -} - -.row-fluid .offset8:first-child { - margin-left: 68.08510638297872%; - *margin-left: 67.9787234042553%; -} - -.row-fluid .offset7 { - margin-left: 61.70212765957446%; - *margin-left: 61.59574468085106%; -} - -.row-fluid .offset7:first-child { - margin-left: 59.574468085106375%; - *margin-left: 59.46808510638297%; -} - -.row-fluid .offset6 { - margin-left: 53.191489361702125%; - *margin-left: 53.085106382978715%; -} - -.row-fluid .offset6:first-child { - margin-left: 51.063829787234035%; - *margin-left: 50.95744680851063%; -} - -.row-fluid .offset5 { - margin-left: 44.68085106382979%; - *margin-left: 44.57446808510638%; -} - -.row-fluid .offset5:first-child { - margin-left: 42.5531914893617%; - *margin-left: 42.4468085106383%; -} - -.row-fluid .offset4 { - margin-left: 36.170212765957444%; - *margin-left: 36.06382978723405%; -} - -.row-fluid .offset4:first-child { - margin-left: 34.04255319148936%; - *margin-left: 33.93617021276596%; -} - -.row-fluid .offset3 { - margin-left: 27.659574468085104%; - *margin-left: 27.5531914893617%; -} - -.row-fluid .offset3:first-child { - margin-left: 25.53191489361702%; - *margin-left: 25.425531914893618%; -} - -.row-fluid .offset2 { - margin-left: 19.148936170212764%; - *margin-left: 19.04255319148936%; -} - -.row-fluid .offset2:first-child { - margin-left: 17.02127659574468%; - *margin-left: 16.914893617021278%; -} - -.row-fluid .offset1 { - margin-left: 10.638297872340425%; - *margin-left: 10.53191489361702%; -} - -.row-fluid .offset1:first-child { - margin-left: 8.51063829787234%; - *margin-left: 8.404255319148938%; -} - -[class*="span"].hide, -.row-fluid [class*="span"].hide { - display: none; -} - -[class*="span"].pull-right, -.row-fluid [class*="span"].pull-right { - float: right; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - line-height: 0; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - line-height: 0; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 21px; - font-weight: 200; - line-height: 30px; -} - -small { - font-size: 85%; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -cite { - font-style: normal; -} - -.muted { - color: #999999; -} - -a.muted:hover { - color: #808080; -} - -.text-warning { - color: #c09853; -} - -a.text-warning:hover { - color: #a47e3c; -} - -.text-error { - color: #b94a48; -} - -a.text-error:hover { - color: #953b39; -} - -.text-info { - color: #3a87ad; -} - -a.text-info:hover { - color: #2d6987; -} - -.text-success { - color: #468847; -} - -a.text-success:hover { - color: #356635; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 10px 0; - font-family: inherit; - font-weight: bold; - line-height: 20px; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - line-height: 40px; -} - -h1 { - font-size: 38.5px; -} - -h2 { - font-size: 31.5px; -} - -h3 { - font-size: 24.5px; -} - -h4 { - font-size: 17.5px; -} - -h5 { - font-size: 14px; -} - -h6 { - font-size: 11.9px; -} - -h1 small { - font-size: 24.5px; -} - -h2 small { - font-size: 17.5px; -} - -h3 small { - font-size: 14px; -} - -h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 20px 0 30px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - padding: 0; - margin: 0 0 10px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -li { - line-height: 20px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -ul.inline, -ol.inline { - margin-left: 0; - list-style: none; -} - -ul.inline > li, -ol.inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 20px; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 10px; -} - -.dl-horizontal { - *zoom: 1; -} - -.dl-horizontal:before, -.dl-horizontal:after { - display: table; - line-height: 0; - content: ""; -} - -.dl-horizontal:after { - clear: both; -} - -.dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 180px; -} - -hr { - margin: 20px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 25px; -} - -blockquote small { - display: block; - line-height: 20px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 20px; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - white-space: nowrap; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 20px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - color: inherit; - white-space: pre; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 20px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: 40px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 15px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 14px; - font-weight: normal; - line-height: 20px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 20px; - padding: 4px 6px; - margin-bottom: 10px; - font-size: 14px; - line-height: 20px; - color: #555555; - vertical-align: middle; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -input, -textarea, -.uneditable-input { - width: 206px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - *margin-top: 0; - line-height: normal; -} - -input[type="file"], -input[type="image"], -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -select, -input[type="file"] { - height: 30px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 30px; -} - -select { - width: 220px; - background-color: #ffffff; - border: 1px solid #cccccc; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.uneditable-input, -.uneditable-textarea { - color: #999999; - cursor: not-allowed; - background-color: #fcfcfc; - border-color: #cccccc; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -input:-moz-placeholder, -textarea:-moz-placeholder { - color: #999999; -} - -input:-ms-input-placeholder, -textarea:-ms-input-placeholder { - color: #999999; -} - -input::-webkit-input-placeholder, -textarea::-webkit-input-placeholder { - color: #999999; -} - -.radio, -.checkbox { - min-height: 20px; - padding-left: 20px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -.controls-row [class*="span"] + [class*="span"] { - margin-left: 20px; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 926px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 846px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 766px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 686px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 606px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 526px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 446px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 366px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 286px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 206px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 126px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 46px; -} - -.controls-row { - *zoom: 1; -} - -.controls-row:before, -.controls-row:after { - display: table; - line-height: 0; - content: ""; -} - -.controls-row:after { - clear: both; -} - -.controls-row [class*="span"], -.row-fluid .controls-row [class*="span"] { - float: left; -} - -.controls-row .checkbox[class*="span"], -.controls-row .radio[class*="span"] { - padding-top: 5px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning .control-label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; -} - -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error .control-label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; -} - -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success .control-label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; -} - -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.control-group.info .control-label, -.control-group.info .help-block, -.control-group.info .help-inline { - color: #3a87ad; -} - -.control-group.info .checkbox, -.control-group.info .radio, -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - color: #3a87ad; -} - -.control-group.info input, -.control-group.info select, -.control-group.info textarea { - border-color: #3a87ad; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.control-group.info input:focus, -.control-group.info select:focus, -.control-group.info textarea:focus { - border-color: #2d6987; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -} - -.control-group.info .input-prepend .add-on, -.control-group.info .input-append .add-on { - color: #3a87ad; - background-color: #d9edf7; - border-color: #3a87ad; -} - -input:focus:invalid, -textarea:focus:invalid, -select:focus:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:invalid:focus, -textarea:focus:invalid:focus, -select:focus:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 19px 20px 20px; - margin-top: 20px; - margin-bottom: 20px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - line-height: 0; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.help-block, -.help-inline { - color: #595959; -} - -.help-block { - display: block; - margin-bottom: 10px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-append, -.input-prepend { - margin-bottom: 5px; - font-size: 0; - white-space: nowrap; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input, -.input-append .dropdown-menu, -.input-prepend .dropdown-menu { - font-size: 14px; -} - -.input-append input, -.input-prepend input, -.input-append select, -.input-prepend select, -.input-append .uneditable-input, -.input-prepend .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: top; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append input:focus, -.input-prepend input:focus, -.input-append select:focus, -.input-prepend select:focus, -.input-append .uneditable-input:focus, -.input-prepend .uneditable-input:focus { - z-index: 2; -} - -.input-append .add-on, -.input-prepend .add-on { - display: inline-block; - width: auto; - height: 20px; - min-width: 16px; - padding: 4px 5px; - font-size: 14px; - font-weight: normal; - line-height: 20px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-append .add-on, -.input-prepend .add-on, -.input-append .btn, -.input-prepend .btn, -.input-append .btn-group > .dropdown-toggle, -.input-prepend .btn-group > .dropdown-toggle { - vertical-align: top; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-append .active, -.input-prepend .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-append input + .btn-group .btn:last-child, -.input-append select + .btn-group .btn:last-child, -.input-append .uneditable-input + .btn-group .btn:last-child { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-append .add-on, -.input-append .btn, -.input-append .btn-group { - margin-left: -1px; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child, -.input-append .btn-group:last-child > .dropdown-toggle { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append input + .btn-group .btn, -.input-prepend.input-append select + .btn-group .btn, -.input-prepend.input-append .uneditable-input + .btn-group .btn { - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.input-prepend.input-append .btn-group:first-child { - margin-left: 0; -} - -input.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -/* Allow for input prepend/append in search forms */ - -.form-search .input-append .search-query, -.form-search .input-prepend .search-query { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.form-search .input-append .search-query { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search .input-append .btn { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .search-query { - -webkit-border-radius: 0 14px 14px 0; - -moz-border-radius: 0 14px 14px 0; - border-radius: 0 14px 14px 0; -} - -.form-search .input-prepend .btn { - -webkit-border-radius: 14px 0 0 14px; - -moz-border-radius: 14px 0 0 14px; - border-radius: 14px 0 0 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - vertical-align: middle; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label, -.form-search .btn-group, -.form-inline .btn-group { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 10px; -} - -legend + .control-group { - margin-top: 20px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 20px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - line-height: 0; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 160px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 180px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 180px; -} - -.form-horizontal .help-block { - margin-bottom: 0; -} - -.form-horizontal input + .help-block, -.form-horizontal select + .help-block, -.form-horizontal textarea + .help-block, -.form-horizontal .uneditable-input + .help-block, -.form-horizontal .input-prepend + .help-block, -.form-horizontal .input-append + .help-block { - margin-top: 10px; -} - -.form-horizontal .form-actions { - padding-left: 180px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table th, -.table td { - padding: 8px; - line-height: 20px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapse; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child > th:first-child, -.table-bordered tbody:first-child tr:first-child > td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child > th:last-child, -.table-bordered tbody:first-child tr:first-child > td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:first-child, -.table-bordered tbody:last-child tr:last-child > td:first-child, -.table-bordered tfoot:last-child tr:last-child > td:first-child { - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child > th:last-child, -.table-bordered tbody:last-child tr:last-child > td:last-child, -.table-bordered tfoot:last-child tr:last-child > td:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { - -webkit-border-bottom-left-radius: 0; - border-bottom-left-radius: 0; - -moz-border-radius-bottomleft: 0; -} - -.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 0; - border-bottom-right-radius: 0; - -moz-border-radius-bottomright: 0; -} - -.table-bordered caption + thead tr:first-child th:first-child, -.table-bordered caption + tbody tr:first-child td:first-child, -.table-bordered colgroup + thead tr:first-child th:first-child, -.table-bordered colgroup + tbody tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered caption + thead tr:first-child th:last-child, -.table-bordered caption + tbody tr:first-child td:last-child, -.table-bordered colgroup + thead tr:first-child th:last-child, -.table-bordered colgroup + tbody tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-striped tbody > tr:nth-child(odd) > td, -.table-striped tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover tbody tr:hover td, -.table-hover tbody tr:hover th { - background-color: #f5f5f5; -} - -table td[class*="span"], -table th[class*="span"], -.row-fluid table td[class*="span"], -.row-fluid table th[class*="span"] { - display: table-cell; - float: none; - margin-left: 0; -} - -.table td.span1, -.table th.span1 { - float: none; - width: 44px; - margin-left: 0; -} - -.table td.span2, -.table th.span2 { - float: none; - width: 124px; - margin-left: 0; -} - -.table td.span3, -.table th.span3 { - float: none; - width: 204px; - margin-left: 0; -} - -.table td.span4, -.table th.span4 { - float: none; - width: 284px; - margin-left: 0; -} - -.table td.span5, -.table th.span5 { - float: none; - width: 364px; - margin-left: 0; -} - -.table td.span6, -.table th.span6 { - float: none; - width: 444px; - margin-left: 0; -} - -.table td.span7, -.table th.span7 { - float: none; - width: 524px; - margin-left: 0; -} - -.table td.span8, -.table th.span8 { - float: none; - width: 604px; - margin-left: 0; -} - -.table td.span9, -.table th.span9 { - float: none; - width: 684px; - margin-left: 0; -} - -.table td.span10, -.table th.span10 { - float: none; - width: 764px; - margin-left: 0; -} - -.table td.span11, -.table th.span11 { - float: none; - width: 844px; - margin-left: 0; -} - -.table td.span12, -.table th.span12 { - float: none; - width: 924px; - margin-left: 0; -} - -.table tbody tr.success td { - background-color: #dff0d8; -} - -.table tbody tr.error td { - background-color: #f2dede; -} - -.table tbody tr.warning td { - background-color: #fcf8e3; -} - -.table tbody tr.info td { - background-color: #d9edf7; -} - -.table-hover tbody tr.success:hover td { - background-color: #d0e9c6; -} - -.table-hover tbody tr.error:hover td { - background-color: #ebcccc; -} - -.table-hover tbody tr.warning:hover td { - background-color: #faf2cc; -} - -.table-hover tbody tr.info:hover td { - background-color: #c4e3f3; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - margin-top: 1px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("./img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -/* White icons with optional class, or on hover/active states of certain elements */ - -.icon-white, -.nav-pills > .active > a > [class^="icon-"], -.nav-pills > .active > a > [class*=" icon-"], -.nav-list > .active > a > [class^="icon-"], -.nav-list > .active > a > [class*=" icon-"], -.navbar-inverse .nav > .active > a > [class^="icon-"], -.navbar-inverse .nav > .active > a > [class*=" icon-"], -.dropdown-menu > li > a:hover > [class^="icon-"], -.dropdown-menu > li > a:hover > [class*=" icon-"], -.dropdown-menu > .active > a > [class^="icon-"], -.dropdown-menu > .active > a > [class*=" icon-"], -.dropdown-submenu:hover > a > [class^="icon-"], -.dropdown-submenu:hover > a > [class*=" icon-"] { - background-image: url("./img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - width: 16px; - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - background-position: -384px -120px; -} - -.icon-folder-open { - width: 16px; - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 20px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu li > a:hover, -.dropdown-menu li > a:focus, -.dropdown-submenu:hover > a { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0081c2; - background-image: -moz-linear-gradient(top, #0088cc, #0077b3); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); - background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); - background-image: -o-linear-gradient(top, #0088cc, #0077b3); - background-image: linear-gradient(to bottom, #0088cc, #0077b3); - background-repeat: repeat-x; - outline: 0; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); -} - -.dropdown-menu .disabled > a, -.dropdown-menu .disabled > a:hover { - color: #999999; -} - -.dropdown-menu .disabled > a:hover { - text-decoration: none; - cursor: default; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.dropdown-submenu { - position: relative; -} - -.dropdown-submenu > .dropdown-menu { - top: 0; - left: 100%; - margin-top: -6px; - margin-left: -1px; - -webkit-border-radius: 0 6px 6px 6px; - -moz-border-radius: 0 6px 6px 6px; - border-radius: 0 6px 6px 6px; -} - -.dropdown-submenu:hover > .dropdown-menu { - display: block; -} - -.dropup .dropdown-submenu > .dropdown-menu { - top: auto; - bottom: 0; - margin-top: 0; - margin-bottom: -2px; - -webkit-border-radius: 5px 5px 5px 0; - -moz-border-radius: 5px 5px 5px 0; - border-radius: 5px 5px 5px 0; -} - -.dropdown-submenu > a:after { - display: block; - float: right; - width: 0; - height: 0; - margin-top: 5px; - margin-right: -10px; - border-color: transparent; - border-left-color: #cccccc; - border-style: solid; - border-width: 5px 0 5px 5px; - content: " "; -} - -.dropdown-submenu:hover > a:after { - border-left-color: #ffffff; -} - -.dropdown-submenu.pull-left { - float: none; -} - -.dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.dropdown .dropdown-menu .nav-header { - padding-right: 20px; - padding-left: 20px; -} - -.typeahead { - z-index: 1051; - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 20px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 12px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 14px; - line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #bbbbbb; - *border: 0; - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-bottom-color: #a2a2a2; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - color: #333333; - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover { - color: #333333; - text-decoration: none; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 11px 19px; - font-size: 17.5px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.btn-large [class^="icon-"], -.btn-large [class*=" icon-"] { - margin-top: 4px; -} - -.btn-small { - padding: 2px 10px; - font-size: 11.9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-small [class^="icon-"], -.btn-small [class*=" icon-"] { - margin-top: 0; -} - -.btn-mini [class^="icon-"], -.btn-mini [class*=" icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 0 6px; - font-size: 10.5px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn { - border-color: #c5c5c5; - border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25); -} - -.btn-primary { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #006dcc; - *background-color: #0044cc; - background-image: -moz-linear-gradient(top, #0088cc, #0044cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); - background-image: -o-linear-gradient(top, #0088cc, #0044cc); - background-image: linear-gradient(to bottom, #0088cc, #0044cc); - background-repeat: repeat-x; - border-color: #0044cc #0044cc #002a80; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - color: #ffffff; - background-color: #0044cc; - *background-color: #003bb3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #003399 \9; -} - -.btn-warning { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #faa732; - *background-color: #f89406; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - color: #ffffff; - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #da4f49; - *background-color: #bd362f; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - color: #ffffff; - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #5bb75b; - *background-color: #51a351; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(to bottom, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - color: #ffffff; - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - color: #ffffff; - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #363636; - *background-color: #222222; - background-image: -moz-linear-gradient(top, #444444, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); - background-image: -webkit-linear-gradient(top, #444444, #222222); - background-image: -o-linear-gradient(top, #444444, #222222); - background-image: linear-gradient(to bottom, #444444, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - color: #ffffff; - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled] { - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-link { - color: #0088cc; - cursor: pointer; - border-color: transparent; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-link:hover { - color: #005580; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover { - color: #333333; - text-decoration: none; -} - -.btn-group { - position: relative; - display: inline-block; - *display: inline; - *margin-left: .3em; - font-size: 0; - white-space: nowrap; - vertical-align: middle; - *zoom: 1; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 10px; - margin-bottom: 10px; - font-size: 0; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn { - position: relative; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn + .btn { - margin-left: -1px; -} - -.btn-group > .btn, -.btn-group > .dropdown-menu, -.btn-group > .popover { - font-size: 14px; -} - -.btn-group > .btn-mini { - font-size: 10.5px; -} - -.btn-group > .btn-small { - font-size: 11.9px; -} - -.btn-group > .btn-large { - font-size: 17.5px; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .btn + .dropdown-toggle { - *padding-top: 5px; - padding-right: 8px; - *padding-bottom: 5px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini + .dropdown-toggle { - *padding-top: 2px; - padding-right: 5px; - *padding-bottom: 2px; - padding-left: 5px; -} - -.btn-group > .btn-small + .dropdown-toggle { - *padding-top: 5px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large + .dropdown-toggle { - *padding-top: 7px; - padding-right: 12px; - *padding-bottom: 7px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0044cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 8px; - margin-left: 0; -} - -.btn-mini .caret, -.btn-small .caret, -.btn-large .caret { - margin-top: 6px; -} - -.btn-large .caret { - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.dropup .btn-large .caret { - border-bottom-width: 5px; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.btn-group-vertical { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group-vertical > .btn { - display: block; - float: none; - max-width: 100%; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group-vertical > .btn + .btn { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:first-child { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.btn-group-vertical > .btn:last-child { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.btn-group-vertical > .btn-large:first-child { - -webkit-border-radius: 6px 6px 0 0; - -moz-border-radius: 6px 6px 0 0; - border-radius: 6px 6px 0 0; -} - -.btn-group-vertical > .btn-large:last-child { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 20px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert, -.alert h4 { - color: #c09853; -} - -.alert h4 { - margin: 0; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 20px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success h4 { - color: #468847; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-danger h4, -.alert-error h4 { - color: #b94a48; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info h4 { - color: #3a87ad; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 20px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li > a > img { - max-width: none; -} - -.nav > .pull-right { - float: right; -} - -.nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 20px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"], -.nav-list [class*=" icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 9px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - line-height: 0; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 20px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomright: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.nav-tabs.nav-stacked > li > a:hover { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.nav .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav .dropdown-toggle:hover .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -/* move down carets for tabs */ - -.nav-tabs .dropdown-toggle .caret { - margin-top: 8px; -} - -.nav .active .dropdown-toggle .caret { - border-top-color: #fff; - border-bottom-color: #fff; -} - -.nav-tabs .active .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.nav > .dropdown.active > a:hover { - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - line-height: 0; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.nav > .disabled > a { - color: #999999; -} - -.nav > .disabled > a:hover { - text-decoration: none; - cursor: default; - background-color: transparent; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 20px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #fafafa; - background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); - background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); - background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); - background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); - background-repeat: repeat-x; - border: 1px solid #d4d4d4; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); - *zoom: 1; - -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -} - -.navbar-inner:before, -.navbar-inner:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-inner:after { - clear: both; -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; - overflow: visible; -} - -.navbar .brand { - display: block; - float: left; - padding: 10px 20px 10px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - color: #777777; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .brand:hover { - text-decoration: none; -} - -.navbar-text { - margin-bottom: 0; - line-height: 40px; - color: #777777; -} - -.navbar-link { - color: #777777; -} - -.navbar-link:hover { - color: #333333; -} - -.navbar .divider-vertical { - height: 40px; - margin: 0 9px; - border-right: 1px solid #ffffff; - border-left: 1px solid #f2f2f2; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn, -.navbar .input-prepend .btn, -.navbar .input-append .btn { - margin-top: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - line-height: 0; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .btn { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 5px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 5px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 14px; - margin-bottom: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.navbar-static-top { - position: static; - margin-bottom: 0; -} - -.navbar-static-top .navbar-inner { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - border-width: 0 0 1px; -} - -.navbar-fixed-bottom .navbar-inner { - border-width: 1px 0 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-static-top .container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-static-top .navbar-inner { - -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar-fixed-bottom .navbar-inner { - -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); - box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1); -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; - margin-right: 0; -} - -.navbar .nav > li { - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 10px 15px 10px; - color: #777777; - text-decoration: none; - text-shadow: 0 1px 0 #ffffff; -} - -.navbar .nav .dropdown-toggle .caret { - margin-top: 8px; -} - -.navbar .nav > li > a:focus, -.navbar .nav > li > a:hover { - color: #333333; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav > .active > a, -.navbar .nav > .active > a:hover, -.navbar .nav > .active > a:focus { - color: #555555; - text-decoration: none; - background-color: #e5e5e5; - -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #ededed; - *background-color: #e5e5e5; - background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); - background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); - background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); - background-repeat: repeat-x; - border-color: #e5e5e5 #e5e5e5 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - color: #ffffff; - background-color: #e5e5e5; - *background-color: #d9d9d9; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #cccccc \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .nav > li > .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .nav > li > .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .nav > li > .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown > a:hover .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - color: #555555; - background-color: #e5e5e5; -} - -.navbar .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -.navbar .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar .pull-right > li > .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:before, -.navbar .nav > li > .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu:after, -.navbar .nav > li > .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.navbar .pull-right > li > .dropdown-menu .dropdown-menu, -.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { - right: 100%; - left: auto; - margin-right: -1px; - margin-left: 0; - -webkit-border-radius: 6px 0 6px 6px; - -moz-border-radius: 6px 0 6px 6px; - border-radius: 6px 0 6px 6px; -} - -.navbar-inverse .navbar-inner { - background-color: #1b1b1b; - background-image: -moz-linear-gradient(top, #222222, #111111); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); - background-image: -webkit-linear-gradient(top, #222222, #111111); - background-image: -o-linear-gradient(top, #222222, #111111); - background-image: linear-gradient(to bottom, #222222, #111111); - background-repeat: repeat-x; - border-color: #252525; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); -} - -.navbar-inverse .brand, -.navbar-inverse .nav > li > a { - color: #999999; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-inverse .brand:hover, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; -} - -.navbar-inverse .brand { - color: #999999; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .nav > li > a:focus, -.navbar-inverse .nav > li > a:hover { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} - -.navbar-inverse .divider-vertical { - border-right-color: #222222; - border-left-color: #111111; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #111111; -} - -.navbar-inverse .nav li.dropdown > a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - color: #ffffff; - background-color: #515151; - border-color: #111111; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-inverse .navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-inverse .navbar-search .search-query:focus, -.navbar-inverse .navbar-search .search-query.focused { - padding: 5px 15px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-inverse .btn-navbar { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e0e0e; - *background-color: #040404; - background-image: -moz-linear-gradient(top, #151515, #040404); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); - background-image: -webkit-linear-gradient(top, #151515, #040404); - background-image: -o-linear-gradient(top, #151515, #040404); - background-image: linear-gradient(to bottom, #151515, #040404); - background-repeat: repeat-x; - border-color: #040404 #040404 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.navbar-inverse .btn-navbar:hover, -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active, -.navbar-inverse .btn-navbar.disabled, -.navbar-inverse .btn-navbar[disabled] { - color: #ffffff; - background-color: #040404; - *background-color: #000000; -} - -.navbar-inverse .btn-navbar:active, -.navbar-inverse .btn-navbar.active { - background-color: #000000 \9; -} - -.breadcrumb { - padding: 8px 15px; - margin: 0 0 20px; - list-style: none; - background-color: #f5f5f5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb > li > .divider { - padding: 0 5px; - color: #ccc; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - margin: 20px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination ul > li { - display: inline; -} - -.pagination ul > li > a, -.pagination ul > li > span { - float: left; - padding: 4px 12px; - line-height: 20px; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; - border-left-width: 0; -} - -.pagination ul > li > a:hover, -.pagination ul > .active > a, -.pagination ul > .active > span { - background-color: #f5f5f5; -} - -.pagination ul > .active > a, -.pagination ul > .active > span { - color: #999999; - cursor: default; -} - -.pagination ul > .disabled > span, -.pagination ul > .disabled > a, -.pagination ul > .disabled > a:hover { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination ul > li:first-child > a, -.pagination ul > li:first-child > span { - border-left-width: 1px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.pagination ul > li:last-child > a, -.pagination ul > li:last-child > span { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pagination-large ul > li > a, -.pagination-large ul > li > span { - padding: 11px 19px; - font-size: 17.5px; -} - -.pagination-large ul > li:first-child > a, -.pagination-large ul > li:first-child > span { - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.pagination-large ul > li:last-child > a, -.pagination-large ul > li:last-child > span { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.pagination-mini ul > li:first-child > a, -.pagination-small ul > li:first-child > a, -.pagination-mini ul > li:first-child > span, -.pagination-small ul > li:first-child > span { - -webkit-border-bottom-left-radius: 3px; - border-bottom-left-radius: 3px; - -webkit-border-top-left-radius: 3px; - border-top-left-radius: 3px; - -moz-border-radius-bottomleft: 3px; - -moz-border-radius-topleft: 3px; -} - -.pagination-mini ul > li:last-child > a, -.pagination-small ul > li:last-child > a, -.pagination-mini ul > li:last-child > span, -.pagination-small ul > li:last-child > span { - -webkit-border-top-right-radius: 3px; - border-top-right-radius: 3px; - -webkit-border-bottom-right-radius: 3px; - border-bottom-right-radius: 3px; - -moz-border-radius-topright: 3px; - -moz-border-radius-bottomright: 3px; -} - -.pagination-small ul > li > a, -.pagination-small ul > li > span { - padding: 2px 10px; - font-size: 11.9px; -} - -.pagination-mini ul > li > a, -.pagination-mini ul > li > span { - padding: 0 6px; - font-size: 10.5px; -} - -.pager { - margin: 20px 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - line-height: 0; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager li > a:hover { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > span { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 10%; - left: 50%; - z-index: 1050; - width: 560px; - margin-left: -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 10%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-header h3 { - margin: 0; - line-height: 30px; -} - -.modal-body { - position: relative; - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - line-height: 0; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - margin-top: -3px; -} - -.tooltip.right { - margin-left: 3px; -} - -.tooltip.bottom { - margin-top: 3px; -} - -.tooltip.left { - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - width: 236px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - -webkit-border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - line-height: 0; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 20px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 20px; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - -o-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #555555; -} - -.media, -.media-body { - overflow: hidden; - *overflow: visible; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media .pull-left { - margin-right: 10px; -} - -.media .pull-right { - margin-left: 10px; -} - -.media-object.logo { - margin-top: 20px; - margin-bottom: -40px; - width: 48%; - margin-left: 0px; - vertical-align: bottom; -} - -.media-list { - margin-left: 0; - list-style: none; -} - -.label, -.badge { - display: inline-block; - padding: 2px 4px; - font-size: 11.844px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding-right: 9px; - padding-left: 9px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -.label:empty, -.badge:empty { - display: none; -} - -a.label:hover, -a.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -.btn .label, -.btn .badge { - position: relative; - top: -1px; -} - -.btn-mini .label, -.btn-mini .badge { - top: 0; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(to bottom, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress .bar + .bar { - -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15); -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar, -.progress .bar-danger { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar, -.progress-striped .bar-danger { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar, -.progress .bar-success { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(to bottom, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); -} - -.progress-success.progress-striped .bar, -.progress-striped .bar-success { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar, -.progress .bar-info { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(to bottom, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar, -.progress-striped .bar-info { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar, -.progress .bar-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(to bottom, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); -} - -.progress-warning.progress-striped .bar, -.progress-striped .bar-warning { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 20px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 20px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img { - display: block; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 15px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - line-height: 20px; - color: #ffffff; -} - -.carousel-caption h4 { - margin: 0 0 5px; -} - -.carousel-caption p { - margin-bottom: 0; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - font-size: 18px; - font-weight: 200; - line-height: 30px; - color: inherit; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit li { - line-height: 30px; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - -.affix { - position: fixed; -} diff --git a/css/bootstrap/img/glyphicons-halflings-white.png b/css/bootstrap/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a29d8da269f9bc874b25493a45fae3bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8777 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 B7G?kd diff --git a/css/bootstrap/img/glyphicons-halflings.png b/css/bootstrap/img/glyphicons-halflings.png deleted file mode 100644 index a9969993201f9cee63cf9f49217646347297b643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12799 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 diff --git a/css/main.scss b/css/main.scss deleted file mode 100755 index 3446cc83..00000000 --- a/css/main.scss +++ /dev/null @@ -1,70 +0,0 @@ ---- -# Only the main Sass file needs front matter (the dashes are enough) ---- -@charset "utf-8"; - - - -// Our variables -$base-font-family: Helvetica,Arial,sans-serif; -$base-font-size: 16px; -$small-font-size: $base-font-size * 0.875; -$base-line-height: 1.5; - -$spacing-unit: 30px; - -$text-color: #111; -$background-color: #ffffff; -$brand-color: #2a7ae2; -$menu-color: #292929; - -$grey-color: #333333; -$grey-color-light: lighten($grey-color, 40%); -$grey-color-dark: darken($grey-color, 25%); - -$on-palm: 600px; -$on-laptop: 800px; -$on-desktop: 1060px; - - - -// Using media queries with like this: -// @include media-query($palm) { -// .wrapper { -// padding-right: $spacing-unit / 2; -// padding-left: $spacing-unit / 2; -// } -// } -@mixin media-query($device) { - @media screen and (max-width: $device) { - @content; - } -} - - - -// Import partials from `sass_dir` (defaults to `_sass`) -@import - "base", - "layout", - "syntax-highlighting" -; - -.projects { - @import "../_sass/bootstrap-sass-3.3.7/assets/stylesheets/_bootstrap.scss"; - @import "../gsoc/display/resources/css/style.scss"; - @import "../_sass/materialize-src/sass/materialize.scss"; - .container { - width: 95%; - } - code { - padding: 2px 4px; - font-size: 0.9em; - color: #ffffff; - background-color: #194242; - border-radius: 11px; - } - li { - line-height:1.5; - } -} diff --git a/css/swc-bootstrap.css b/css/swc-bootstrap.css deleted file mode 100644 index 923db6b5..00000000 --- a/css/swc-bootstrap.css +++ /dev/null @@ -1,263 +0,0 @@ -/* Customizations to Bootstrap's default styles */ - -/* readability: darken the alert colour for contrast with background */ -.alert { - color: rgb(0,0,0); -} - -.navbar .brand { - padding-top: 0px; /* align the logo */ - text-shadow:none; -} - -.navbar { - margin:0; - border-top:5px solid #2b3990; - border-bottom:1px solid #CCC; -} - -.navbar .container { - background-color: inherit; - font-size:11pt; - padding:27px 10px 0px 10px; - background:url('../img/software-carpentry-banner.png') no-repeat; - background-size: 250px; - background-position: 10px 10px; - height:50px; -} - -.navbar-inner { - min-height: 40px; -} - -.navbar .nav > li > a { - padding: 10px; -} - -.navbar-inverse .nav > li > a { - color: #f0f0f0; - text-shadow:none; -} - -.navbar-inverse .navbar-inner { - background:#D6D6D6; -} - -.navbar-inverse .nav .active > a, -.navbar-inverse .nav .active > a:hover, -.navbar-inverse .nav .active > a:focus { - color: #2b3990; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, -.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { - color: #ffffff; - background-color: #B9B9C4; -} - -.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-search .search-query { - background-color: #ffffff; - color: #666666; - border-color:#2b3990; - width:150px; -} - -.navbar-inverse .navbar-search { - border: none; -} - -.navbar-inverse .nav-collapse .nav > li > a:hover, -.navbar-inverse .nav-collapse .dropdown-menu a:hover { - background-color: transparent; -} - -.navbar-inverse .nav-collapse .nav > li > a, .navbar-inverse .nav-collapse .dropdown-menu a { - color: #2b3990; - text-align: center; -} - -.navbar-inverse .nav-collapse .nav > li:hover > a { - color: #935212; -} - -.navbar.transparent.navbar-inverse .navbar-inner { - border-width: 0px; - -webkit-box-shadow: 0px 0px; - box-shadow: 0px 0px; - border-radius:0; - -webkit-border-radius:0; - background-image: -webkit-gradient(linear, 50.00% 0.00%, 50.00% 100.00%, color-stop( 0% , rgba(0,0,0,0.00)),color-stop( 100% , rgba(0,0,0,0.00))); - background-image: -webkit-linear-gradient(270deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); - background-image: linear-gradient(180deg,rgba(0,0,0,0.00) 0%,rgba(0,0,0,0.00) 100%); -} - -code { - color: #333333; -} - -.container { - max-width:920px; -} - -blockquote p { - font-size:14px; -} - -/* GitHub Ribbon */ - -#github-ribbon a { - background:#000; - color:#fff; - text-decoration:none; - font-family:arial, sans-serif; - text-align:center; - font-weight:bold; - padding:5px 40%; - font-size:0.8rem; - line-height:1.6rem; - position:relative; - transition:0.5s; - width:100%; - margin: 0 auto; - white-space: nowrap; - z-index:10; -} - -#github-ribbon a:hover { - background:#600; - color:#fff; -} - -#github-ribbon a::before, #github-ribbon a::after { - content:""; - width:100%; - display:block; - position:absolute; - top:1px; - left:0; - height:1px; - background:#fff; -} - -#github-ribbon a::after{ - bottom:1px; - top:auto; -} - -/* Media Queries */ - -@media (max-width: 979px){ - .navbar-inverse .nav-collapse ul{ - margin:20px 0 0; - } - - .navbar-inverse .nav-collapse .nav > li > a { - font-size: 12pt; - } - - .navbar-inverse .nav-collapse .navbar-search { - text-align: center; - border-top:1px solid #AAA; - margin:0; - } - - .navbar-inverse .nav-collapse .navbar-search .search-query { - margin:10px 0; - } - - .navbar-inverse .nav-collapse .nav > li { - border-top:1px solid #AAA; - padding:10px 0; - } - -} - -@media (max-width: 767px) { - .container { - padding:0 40px; - } - - body { - padding:0; - } - - .navbar-fixed-top, .navbar-fixed-bottom, .navbar-static-top { - margin-left: 0; - margin-right: 0; - margin-bottom:0; - } -} - -@media (max-width: 979px) and (min-width: 768px) { - .container { - max-width: 700px; - } - -} - -@media (max-width: 400px) { - .header h1 { - font-size: 24pt; - } - - #header-text { - font-size:16pt; - } - - .navbar .container { - background-size: 200px; - background-position: 10px 20px; - } - - #nav-logo { - width:190px; - height:40px; - } -} - -/* github ribbon breaking point */ -@media screen and (min-width:600px){ - #github-ribbon{ - position:absolute; - display:block; - top:0; - right:0; - width:150px; - overflow:hidden; - height:150px; - } - #github-ribbon a{ - width:200px; - position:absolute; - padding:5px 40px; - top:40px; - right:-80px; - transform:rotate(45deg); - -webkit-transform:rotate(45deg); - box-shadow:1px 1px 10px rgba(0,0,0,0.8); - } - .navbar .btn-navbar { - margin-right: 150px; - } -} - -@media (max-width: 319px) { - .header h1 { - font-size: 20pt; - } - - #header-text { - font-size:16pt; - } -} \ No newline at end of file diff --git a/css/swc.css b/css/swc.css deleted file mode 100644 index fdea490b..00000000 --- a/css/swc.css +++ /dev/null @@ -1,560 +0,0 @@ - -/* Headings */ -h1, h2, h3, h4, h5, h6 { - color: rgb(03,03,03); - font-family: "Montserrat", "Helvetica", "Arial"; -} - -h1, h2 { - margin-top: 40px; - margin-bottom: 10px; -} - -h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { - color: inherit; -} - -/* Things to fix. */ -.fixme { - text-decoration: underline; - color: darkred; - background-color: lightgray; -} - -/* Putting shadows around things. */ -.shadow { - -moz-box-shadow: 0 0 30px 5px #999; - -webkit-box-shadow: 0 0 30px 5px #999; - box-shadow: 0 0 30px 5px #999; -} - -/* Things to understand (lead-in to sections in book). */ -.understand { - background-color: lightyellow; -} - -/* Block quotations. */ -blockquote { - margin: 1em; - padding: 1em 1em .5em 1em; - width: 90%; -} - -/* Citation for testimonial quote. */ -blockquote.testimonial cite { - font-style: italic; -} - -/* Main body of pages. */ -body { - font-family: "Open Sans", Helvetica, Arial, sans-serif; - color: rgb(03, 03, 03); - /* background-image: set by the javascript on head.html */ - background-size: 100%; - background-repeat: no-repeat; - background-colur: white -} - -/* Styling for editorial stylesheet */ -body.stylesheet { - background: #ffffff; - width: 60em; - margin: 20 auto; -} - -/* Explanatory call-out boxes. */ -div.box { - width: 54em; - background-color: mistyrose; - display: block; - margin-left: auto; - margin-right: auto; - padding-top: 1px; - padding-bottom: 1px; - padding-left: 10px; - padding-right: 10px; - outline-color: gray; - outline-width: 1px; - outline-style: solid; -} - -/* Level 2 headings inside pages. */ -div.content div h3 { - border-bottom: 1px solid #CCCCCC; - display: block; - font-family: Verdana,"BitStream vera Sans"; - margin-top: 10px; - padding: 0 5px 3px; -} - -/* PDF and slide files referenced from lectures. */ -div.files { - padding: 10px; -} - -.swc-blue-bg { - /*background-color: #20267D;*/ - /* svg colour is slightly different? */ - background: #2b3990; -} - -/* Main menu at the top of every page. */ -div.mainmenu { - clear: both; - background-color: #F4F4F4; - margin: 0px; - padding: 3px 0px 3px 25px; - border-bottom: 1px solid #A6A6A6; - height: 30px -} - -#menubar { - float: left; - margin-top: 4px; -} - -#searchbar { - float: right; - margin-right: 20px; -} - -/* Narration for audio-only lectures. */ -div.narration { - text-align: center; - font-size: 2em; -} - -/* Table of contents. */ -div.toc { - /* No special styling yet. */ -} - -.transcript { - display: table; -} - -.transcript .media img { - border: 1px solid grey; -} - -/* YouTube video embed. */ -div.youtube { - text-align: center; - padding: 10px; -} - -/* Glossary description lists. */ -dl.gloss { - /* Empty for now. */ -} - -/* Displaying YouTube videos. */ -iframe.youtube_player { - border: 0; - text-align: center; - width: 640px; - height: 500px; -} - -/* Sections in book chapters. */ -section { - clear: both; -} - -/* Person's name in team.html. */ -.person { - font-weight: bold; - font-style: italic; -} - -/* Short review of book in bibliography. */ -span.review { - font-style: italic; -} - -/* Bibliography book covers. */ -img.book-cover { - width: 80px; -} - -/* Blog calendar table in blog/index.html. */ -table.blogcalendar th { - text-align : right; - font-weight : bold; -} - -/* See above. */ -table.blogcalendar th.left { - text-align : left; -} - -/* See above. */ -table.blogcalendar tr td { - text-align : right; -} - -/* Blog index tables in blog/index.html. */ -table.blogindex td.date { - text-align: left ; - width:10em; -} - -/* Tables used for displaying choices in challenges. */ -table.choices tr td { - vertical-align : top; -} - -/* Database tables do _not_ have double borders */ -table.outlined { - border-collapse: collapse; -} - -/* Link items (to workshop pages) in the workshops tables */ -table.workshops td.link { - width: 50%; - text-align: left; -} - -/* Spacer items (i.e. ellipsis) on the workshops tables */ -table.workshops td.spacer { - max-width: 100%; - text-align: center; -} - -/* Date columns on the workshops tables */ -table.workshops td.date { - width: 50%; - text-align: right; -} - -/* Badge modal dialog */ -#assertion-modal { - width:700px; - margin-left:-350px; -} -#assertion-modal iframe { - background-color: transparent; - border: 0px none transparent; - padding: 0px; - width: 100%; - height: 20em; -} - -#assertion-model img.badge { - position: absolute; - right: 15px; - bottom: 35px; - opacity: 0.5; -} - -/* list with checkbox as bullet */ -ul.checklist { - list-style-image: url('../img/checkbox.png'); -} - -/* FAQ */ -dl.faq dt { - font-style: italic; - font-weight: bold; -} - -section.content { - width:100%; - background: white; -} - -.header.home { - background: url(../img/header.png) no-repeat center center; - background-attachment: fixed; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover; -} - -.header { - background:#2b3990; -} - -.header h1 { - line-height: 1.1; - margin: 60px 0px 80px; - font-size: 40pt; -} - -#header-text { - font-size:20pt; - margin:0; -} - -#nav-logo { - width:270px; - height:40px; - top:5; - left:10; - position:absolute; - z-index: 10; -} - -#home-options { - background:#F6F6F6; - border-top:1px solid #DDDDDD; - border-bottom:1px solid #DDDDDD; - padding:20px 0; - margin-bottom:20px; -} - -#title { - background:#F6F6F6; - border-top:1px solid #DDDDDD; - border-bottom:1px solid #DDDDDD; - padding:0 0 20px; - margin-bottom:20px; -} - -h5 a:link, h5 a:visited, -h4 a:link, h4 a:visited, -h3 a:link, h3 a:visited { - color:#2b3990; -} - -h5 a:hover, -h4 a:hover, -h3 a:hover { - color:#C26D17; - text-decoration: none; -} - -a { - color:#3E51CF; - -webkit-transition: all 0.2s ease; - -moz-transition: all 0.2s ease; - -o-transition: all 0.2s ease; - transition: all 0.2s ease; -} - -a:hover { - color:#965412; -} - -footer { - /* background: #2b3990; */ - background-color: #292929; - padding: 20px 0; - font-size: 10pt; - margin-top: 10px; - width: 100%; - bottom: 0; - position: static; -} - -footer a, footer a:hover{ - color:#FFF; - padding-left: 10px; -} - -footer .container .links{ - background:url('../img/software-carpentry-banner-white.png') no-repeat; - background-size: 200px; - background-position: 0; - height:40px; - padding:40px 0 0 200px; - text-align: right; -} - - -/* For the Request a Workshop form */ -#ss-form .ss-q-title { - display: block; - font-weight: bold; - padding-bottom: 0.5em; -} -#ss-form .ss-required-asterisk { - color: #c43b1d; -} -#ss-form label { - display:inline; - cursor: default; -} -#ss-form .ss-secondary-text { - color: #666; -} -#ss-form .ss-form-entry { - margin-bottom: 1.5em; -} -#ss-form ul { - margin:0; - padding:0; - list-style: none; -} -#ss-form ol { - margin:0; -} -#ss-form .ss-choice-item { - line-height: 1.3em; - padding-bottom: .5em; -} -#ss-form .ss-q-long { - resize: vertical; - width: 70%; -} -#ss-form .error-message, .required-message { - display: none; -} -#ss-form .ss-form-entry input { - vertical-align: middle; - margin: 0; - padding:0 4px; -} -#ss-form .ss-choice-item-control { - padding-right: 4px; -} - - - - - - - - - - - - - -div.page-content div.wrapper div.home img.large-logo { - padding-top: 20px; - padding-bottom: 30px; - width: 80%; - padding-left: 50px; -} - - - - - -body { - padding-bottom: 100px; -} - -body a:hover { - text-decoration: none; -} - -header.site-header { - style="background-color: #292929;" -} - -header.site-header div.wrapper .logo { - margin-top: 10px; - margin-bottom: 10px; - width: 125px; -} - -header.site-header div.wrapper a.site-title, header.site-header div.wrapper nav.site-nav div.trigger a{ - color: white; - background-color: #292929; -} - -header.site-header div.wrapper nav.site-nav div.trigger{ - margin-top: 12px; -} - -header.site-header div.wrapper nav.site-nav nav.site-nav a.menu-icon{ - margin-top: 120px; - padding-top: 100px; - -} - - -header.site-header div.wrapper a.site-title:hover, header.site-header div.wrapper nav.site-nav div.trigger a:hover{ - transition: all 0.5s ease; - color: red; - text-decoration: none; -} - -footer.site-footer { -padding-top: 10px; -padding-bottom: 10px; -text-align: center; -} - -footer.site-footer div.wrapper { - color: white; -} - -footer.site-footer div.wrapper a { - color: white; - text-decoration: none; - padding-left: 0; - padding-right: 8px; - display: inline-block; -} - -footer.site-footer div.wrapper a:hover { - text-decoration: none; - transition: all 0.5s ease; - color: gray; -} - -footer.site-footer div.wrapper a img { - height: 16px; - width: 16px; -} - - -div.page-content div.wrapper div.post article.post-content img.media-object{ - width: 120px; -} - - -footer.site-footer div.wrapper p.tagline { - color: white; -} - - - @media screen and (max-width: 670px) { - footer.site-footer div.wrapper p.tagline { - display: none; -} - - - - - -/* Remove comments to enable icon-only mobile footer. - - footer.site-footer div.wrapper a img { - height: 60px; - width: 60px; - padding-right: 20px; -} - footer.site-footer div.wrapper a span { - display: none; -} -*/ -} - - - - -/* hoping these override */ - @media screen and (max-width: 600px) { - .site-nav { - position: absolute; - top: 15px;} - .site-nav .menu-icon { - width: 46px; - height: 36px;} - .site-nav .menu-icon > svg { - width: 28px; - height: 25px; } - .site-nav .menu-icon > svg path { - fill: #f9f9f9; } - - div.page-content div.wrapper div.home img.large-logo { - display: none; -} - - -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..43e24874 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,63 @@ +import js from "@eslint/js"; +import astroPlugin from "eslint-plugin-astro"; +import astroParser from "astro-eslint-parser"; +import tsParser from "@typescript-eslint/parser"; +import tsPlugin from "@typescript-eslint/eslint-plugin"; +import prettier from "eslint-config-prettier"; +import globals from "globals"; + +export default [ + { + ignores: ["html/**", "node_modules/**"], + }, + js.configs.recommended, + { + files: ["**/*.{js,mjs,cjs}"], + languageOptions: { + ecmaVersion: "latest", + sourceType: "module", + globals: globals.node, + }, + }, + { + files: ["**/*.ts"], + languageOptions: { + parser: tsParser, + ecmaVersion: "latest", + sourceType: "module", + globals: globals.node, + }, + plugins: { + "@typescript-eslint": tsPlugin, + }, + rules: { + ...tsPlugin.configs.recommended.rules, + }, + }, + { + files: ["**/*.astro"], + languageOptions: { + parser: astroParser, + parserOptions: { + parser: tsParser, + extraFileExtensions: [".astro"], + sourceType: "module", + }, + globals: { + Astro: "readonly", + Fragment: "readonly", + ...globals.browser, + ...globals.node, + }, + }, + plugins: { + astro: astroPlugin, + "@typescript-eslint": tsPlugin, + }, + rules: { + ...astroPlugin.configs.recommended.rules, + ...tsPlugin.configs.recommended.rules, + }, + }, + prettier, +]; diff --git a/feed.xml b/feed.xml deleted file mode 100644 index 022378be..00000000 --- a/feed.xml +++ /dev/null @@ -1,30 +0,0 @@ ---- -layout: null ---- - - - - {{ site.title | xml_escape }} - {{ site.description | xml_escape }} - {{ site.url }}{{ site.baseurl }}/ - - {{ site.time | date_to_rfc822 }} - {{ site.time | date_to_rfc822 }} - Jekyll v{{ jekyll.version }} - {% for post in site.posts limit:10 %} - - {{ post.title | xml_escape }} - {{ post.content | xml_escape }} - {{ post.date | date_to_rfc822 }} - {{ post.url | prepend: site.baseurl | prepend: site.url }} - {{ post.url | prepend: site.baseurl | prepend: site.url }} - {% for tag in post.tags %} - {{ tag | xml_escape }} - {% endfor %} - {% for cat in post.categories %} - {{ cat | xml_escape }} - {% endfor %} - - {% endfor %} - - diff --git a/gsoc/contributor_guidelines.md b/gsoc/contributor_guidelines.md deleted file mode 100644 index 02aa15ad..00000000 --- a/gsoc/contributor_guidelines.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -layout: default -title: "GSoC Contributor Application Guidelines" -show_main: false ---- - -# GSoC Contributor Application Guidelines - -**Communication Channels** - -OpenAstronomy is a collaboration between open source astronomy and astrophysics projects and as such, to get help you need to find the specific project you are interested in: - -1. Browse the **[Project Ideas Page](/gsoc/)** to find a project that interests you. -2. Check the **[Members Page](/members)** to find the chat links for that specific organization. -3. Join *that* organization's chat to talk to the mentors! - ---- - -If you want to apply to OpenAstronomy to participate in GSoC -there are many things you can do to improve your application. -Many of OpenAstronomy's admins and mentors have participated in -previous editions of GSoC with their projects, so will be able to -answer any questions you might have, come talk to us on the -mailing list. - -There are many guidelines on writing a good application and how to -increase your chances, this guide covers the most important things -to OpenAstronomy, however, you should also checkout the [GSoC Contributor -Guide], the [Python Software Foundation] guide, the [Astropy GSoC guidelines] and the [SymPy -Guidelines] to name but a few. - -Some general pointers to follow are: - - -1. **The better we know you, the better we can judge your application.** -There are many ways to get yourself known by the community, you can introduce yourself through the -OpenAstronomy mailing list ([how to use Google Groups](https://support.google.com/groups/answer/1046523?hl=en)), chat with us in the Matrix channel ([how to connect to matrix](https://element.io/user-guide)) and if required contact the mentors to know -more about certain project. However, contacting mentors through email or direct messages is discouraged, and contacting them in public channels is the preferred way to provide answers to multiple people at once. Also, when you have a particular idea in -mind, get in touch with that project and introduce yourself. -For `astropy` projects you can do this by sending an e-mail to the -[astropy-gsoc-applications]() mailing list -(please do not send to the `astropy-dev` list). - -2. **Become a user!** -Download one or more of the OpenAstronomy projects and start experimenting with the code. -Look at the [latest pictures of the million degree Sun] with [SunPy](http://sunpy.org/), -[volume render a simulation of the galaxy] with [yt](http://yt-project.org/), or -[plan some astronomical observations] with [Astropy](http://www.astropy.org) - There -are loads of things to do with all the projects involved with OpenAstronomy, -get involved! - -3. **Set yourself up as a developer.** -Create an account on [GitHub](http://github.com) or the forge the organisation is using. -Don't know how to use [git](http://www.git-scm.com/) or [Mercurial](http://mercurial.selenic.com/)? -Don't worry, there are lots of git [tutorials](http://try.github.com) [online](http://gitimmersion.com/) -and many [Mercurial](https://www.mercurial-scm.org/wiki/Tutorial) [ones](http://hgbook.red-bean.com/read/) -[as well](http://mercurial.selenic.com/) that will help you to get quite confident with it in a short time. -Also both the [Astropy](https://docs.astropy.org/en/stable/index_dev.html) -and [yt](http://yt-project.org/docs/dev/developing/developing.html) -developer guides are great reads no matter what project you are thinking of working on. -Have you got stuck? ask on the forum or chat rooms for help and volunteers will support you. - -4. **Start to be a developer.** -Checkout the issue lists of the projects to see if there is something that you could do. -**You will be expected to submit a pull request to one of the OpenAstronomy projects before -you submit your application (it does not have to be accepted, but it has to be something -that shows your code abilities!).** This requirement is to show that you know how git, github, -pull requests and reviews work and allows mentors to eveluate all applications based on a real code -contribution, instead of e.g. the name of a specific school. -GSOC is a short program and we want to make sure you are -ready to start immediately. If you have previously contributed to OpenAstronomy projects, -you can point to those pull requests, too. - -5. **Plan your application.** -Think which is your favourite project from the [ideas page](/gsoc/). -Prepare a plan on how you will tackle that project and the time it will take you to solve it. -Do not worry much in providing exact dates, but plan it as best as you can -(if you are planing to have some holidays during the GSoC programme, then you should mention it too). -Use [our application template][gsoc-proposal-template] to describe how you plan to do the work during the programme. -Add your draft to the [gsoc-proposals](https://github.com/OpenAstronomy/gsoc-proposals) repository. This will be place where to receive any feedback. Follow the indications mentioned in that repository to submit your proposal. -Also, don't be afraid to ask your potential mentors for help. -Don't be shy when describing yourself! - -6. **Submit your application.** -Besides adding your proposal to the gsoc-proposals repository, you also need to [submit your application](https://summerofcode.withgoogle.com/) before the deadline. Please, include the sub-org name at the start of your proposal title as: `[] `, where `` should be the name of the sub-org in lower case (e.g., `sunpy`, `stingray`, `radis`), or the combination of two if it's the case (e.g., `astropy|sunpy`). -Only the proposals present on both, the gsoc-proposals repository and GSoC platform, will be considered. - -7. **Respect the AI policies.** -Much of the [Open Source ecosystem is suffering due to AI Slop][ai-slop-summary]. Don't be one adding more pain to this, doing so will result on being banned of the whole organisation. This is not to say that you can't use AI tools to support your learning, you can, but keeping in mind the policies and rules that each suborg may have. As a starting point, if you don't find an AI contribution policy or rules related the use of LLMs, assume they are forbidden. - -[SymPy Guidelines]: https://github.com/sympy/sympy/wiki/GSoC-2017-Application-Template -[Python Software Foundation]: http://python-gsoc.org/ -[GSoC Contributor Guide]: https://google.github.io/gsocguides/student/ -[Astropy GSoC guidelines]: https://github.com/astropy/astropy/wiki/GSoC-Guidelines -[latest pictures of the million degree Sun]: http://docs.sunpy.org/en/stable/generated/gallery/plotting/aia_example.html -[volume render a simulation of the galaxy]: http://yt-project.org/docs/dev/quickstart/volume_rendering.html -[plan some astronomical observations]: http://www.astropy.org/astropy-tutorials/Coordinates.html -[gsoc-proposal-template]: https://github.com/OpenAstronomy/gsoc-proposals/blob/main/template.md -[plan some astronomical observations]: https://learn.astropy.org/tutorials/1-Coordinates-Intro.html -[ai-slop-summary]: https://redmonk.com/kholterhoff/2026/02/03/ai-slopageddon-and-the-oss-maintainers/ diff --git a/gsoc/display/LICENSE b/gsoc/display/LICENSE deleted file mode 100644 index 4ec8c3f7..00000000 --- a/gsoc/display/LICENSE +++ /dev/null @@ -1,619 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU Affero General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero General Public License from time to time. Such new versions -will be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU Affero General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU Affero General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU Affero General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS diff --git a/gsoc/display/data/admins.js b/gsoc/display/data/admins.js deleted file mode 100644 index 14a563ab..00000000 --- a/gsoc/display/data/admins.js +++ /dev/null @@ -1,11 +0,0 @@ -admins = {2017: ["dpshelio", "Cadair", "taldcroft", "eteq"], - 2018: ["dpshelio", "bsipocz"], - 2019: ["dpshelio", "bsipocz", "mirca"], - 2020: ["dpshelio", "bsipocz", "mirca"], - 2021: ["dpshelio", "bsipocz", "mirca"], - 2022: ["dpshelio", "bsipocz", "mirca"], - 2023: ["dpshelio", "bsipocz", "mirca"], - 2024: ["dpshelio", "bsipocz", "mirca"], - 2025: ["dpshelio", "bsipocz", "mirca", "nabobalis"], - 2026: ["dpshelio", "bsipocz", "mirca", "nabobalis"], - }; diff --git a/gsoc/display/data/faq.js b/gsoc/display/data/faq.js deleted file mode 100644 index 3e1f228d..00000000 --- a/gsoc/display/data/faq.js +++ /dev/null @@ -1,15 +0,0 @@ -faq = { - -"I want to do a GSoC with OpenAstronomy!" : "i_want_to_do_a_gsoc.md", - -"What are the requirements to be accepted for GSoC?" : "gsoc_requirements.md", - -"I have an own project idea! (Mentors and contributors!)" : "own_project_idea.md", - -"How do I work out a great proposal?" : "writing_a_great_proposal.md", - -"When should I start working out the proposal?" : "working_out_the_proposal.md", - -"What are my obligations as a contributor during the GSoC?" : "contributor_obligations.md" - -} diff --git a/gsoc/display/data/faq/contributor_obligations.md b/gsoc/display/data/faq/contributor_obligations.md deleted file mode 100644 index 570ad60d..00000000 --- a/gsoc/display/data/faq/contributor_obligations.md +++ /dev/null @@ -1,8 +0,0 @@ -We expect you to: - -* Be online and active during your working hours in your sub-organisation chat system. -* Blog at least once every two weeks (this will be aggregated on -[Universe Open Astronomy](http://openastronomy.org/Universe_OA/)). -* Participate in weekly meetings with your mentor. -* Get in contact with your mentors or the admins if any even remotely -potential problems arise. diff --git a/gsoc/display/data/faq/gsoc_requirements.md b/gsoc/display/data/faq/gsoc_requirements.md deleted file mode 100644 index 4ea72098..00000000 --- a/gsoc/display/data/faq/gsoc_requirements.md +++ /dev/null @@ -1,9 +0,0 @@ -Other than the [requirements from Google](https://developers.google.com/open-source/gsoc/faq#what_are_the_eligibility_requirements_for_participation) you will have to meet the following: - -* You have to read carefully and follow [our contributor guide ](/gsoc/contributor_guidelines.html) -* You have submitted some code sample via pull-request to the sub-organisation -you are applying. (Read the developer guides to do it properly and look for -issues labelled `package-novice` for an easier start). -* You will need to create a blog to keep it up to date during the programme. You can start -writing about how you found us, the issue you are working on and how you find the community. -* Respect the AI contribution policies. If there's not one, then assume you can't use AI to contribute on it. diff --git a/gsoc/display/data/faq/i_want_to_do_a_gsoc.md b/gsoc/display/data/faq/i_want_to_do_a_gsoc.md deleted file mode 100644 index 81464a05..00000000 --- a/gsoc/display/data/faq/i_want_to_do_a_gsoc.md +++ /dev/null @@ -1,3 +0,0 @@ -Great! You are in the right place. However, notice that OpenAstronomy is an -umbrella organisation. Therefore you have to look for the projects offered by -the sub-orgs (all listed in the projects tab). diff --git a/gsoc/display/data/faq/own_project_idea.md b/gsoc/display/data/faq/own_project_idea.md deleted file mode 100644 index d1df222d..00000000 --- a/gsoc/display/data/faq/own_project_idea.md +++ /dev/null @@ -1,2 +0,0 @@ -Awesome! Submit your idea to [our projects list](https://github.com/OpenAstronomy/openastronomy.github.io/tree/master/_projects) -as a pull request. diff --git a/gsoc/display/data/faq/working_out_the_proposal.md b/gsoc/display/data/faq/working_out_the_proposal.md deleted file mode 100644 index 1e5f05f8..00000000 --- a/gsoc/display/data/faq/working_out_the_proposal.md +++ /dev/null @@ -1,2 +0,0 @@ -You can start right now! Ping any mentor and start discussing. -The earlier you start, the better! \ No newline at end of file diff --git a/gsoc/display/data/faq/writing_a_great_proposal.md b/gsoc/display/data/faq/writing_a_great_proposal.md deleted file mode 100644 index a5851b17..00000000 --- a/gsoc/display/data/faq/writing_a_great_proposal.md +++ /dev/null @@ -1,18 +0,0 @@ -Having a very good proposal is not that difficult, but you will have to -invest time on writing it. - -You need start by understanding how the sub-organisation you want to work with works, -read all their user and developers guide. Look then at the project idea you like the -most and find all the issues related to that particular project. - -What's the final goal of that project? Can you break it in sub-projects? Can -you estimate how long these sub-projects are going to take you? The best applications -we've had contains a list of problems to solve on a weekly basis. -But... _The best laid plans of mice and men gang oft astray_, sure! you will encounter -problems on the way, but having a plan will help you to prioritise when stuck. And of -course, your mentors will help you too. - -Don't forget that a submission of new code is not only code, but its documentation and -tests! - -Use the [gsoc-proposals repository](https://github.com/OpenAstronomy/gsoc-proposals/) to "draft" your proposal early on, here you can get comments and feedback from the mentors and the rest of the community. Then remember to upload it to the [GSoC platform](https://summerofcode.withgoogle.com/). diff --git a/gsoc/display/partials/tabs/faq.html b/gsoc/display/partials/tabs/faq.html deleted file mode 100644 index 6e049641..00000000 --- a/gsoc/display/partials/tabs/faq.html +++ /dev/null @@ -1,17 +0,0 @@ ---- ---- -
-
    -
  • -

    -

    -
    -
  • -
-
- - diff --git a/gsoc/display/partials/tabs/mentors.html b/gsoc/display/partials/tabs/mentors.html deleted file mode 100644 index a53fe1cc..00000000 --- a/gsoc/display/partials/tabs/mentors.html +++ /dev/null @@ -1,73 +0,0 @@ -
-
-
-
Hello there!
-
-
- We are the mentors for OpenAstronomy in GSoC {{ gic.year }} -
-
-
-
- -
-
-
-
-
- -
-
-
-
- -
-
-
-
Admins
-
-
- We are the admins for OpenAstronomy. -
-
-
-
- -
-
-
-
-
- -
-
-
-
diff --git a/gsoc/display/partials/tabs/projects.html b/gsoc/display/partials/tabs/projects.html deleted file mode 100644 index cdc3f989..00000000 --- a/gsoc/display/partials/tabs/projects.html +++ /dev/null @@ -1,136 +0,0 @@ -
-
- -
-
- -
-
-
- -
-
-
-
-
-
-
-
-
-
{{ project.name }}
-
-
- - - -
- {{ initiative }} - {{ p_size }} -
- -
- {{ project }}
-
- -
-
-
-



-
- - -
- - diff --git a/gsoc/display/resources/css/style.scss b/gsoc/display/resources/css/style.scss deleted file mode 100644 index 7891008e..00000000 --- a/gsoc/display/resources/css/style.scss +++ /dev/null @@ -1,532 +0,0 @@ -// File generated from style.css using: http://sebastianpontow.de/css2compass/ -@import url(https://fonts.googleapis.com/css?family=Roboto+Mono:300,300i,400,400i,700,700i|Roboto:100,200,300,400,500,600,700,800,900|Ubuntu+Mono|Overpass+Mono|Inconsolata); -@import url(https://fonts.googleapis.com/icon?family=Material+Icons); - -//colors -$black: black; -$color_waterloo__approx: lightslategrey; -$color_froly_70_approx: rgba(238, 110, 115, 0.7); -$color_quill_gray_approx: lightgrey; -$white: #fff; -$color_cape_cod_approx: #424242; -$color_star_dust_approx: #9e9e9e; -$color_celeste_approx: #d1d1d1; -$color_plantation_approx: darkslategrey; -$color_half_dutch_white_approx: cornsilk; -$color_twilight_blue_approx: azure; -$color_mimosa_approx: lightgoldenrodyellow; -$wheat: wheat; -$color_athens_gray_approx: #eceff1; -$color_outer_space_approx: #263238; -$color_blue_chill_approx: darkcyan; -$color_tradewind_approx: mediumaquamarine; - -//fonts -$font_0: Roboto; -$font_1: Roboto !important; -$font_2: Roboto Mono; -$font_3: menlo; -$font_4: monospace; -$font_5: -apple-system, BlinkMacSystemFont, $font_0, sans-serif; - -.tabs { - font-family: $font_0; - font-size: 1em; - text-transform: uppercase; - letter-spacing: 0.1em; - .tab { - display: inline-block; - text-align: center; - line-height: 48px; - height: 48px; - padding: 0; - margin: 0; - cursor: pointer; - text-transform: uppercase; - a { - color: $color_waterloo__approx !important; - display: block; - width: 100%; - height: 100%; - padding: 0 24px; - font-size: 14px; - text-overflow: ellipsis; - overflow: hidden; - //Instead of the line below you could use @include transition($transition-1, $transition-2, $transition-3, $transition-4, $transition-5, $transition-6, $transition-7, $transition-8, $transition-9, $transition-10) - transition: color .28s ease; - &:hover { - background-color: transparent; - color: $black !important; - } - &.active { - background-color: transparent; - color: $black !important; - } - } - &.disabled a { - color: $color_froly_70_approx; - cursor: default; - &:hover { - color: $color_froly_70_approx; - cursor: default; - } - } - } - .indicator { - position: absolute; - bottom: 0; - height: 2px; - background-color: $black !important; - will-change: left, right; - margin-left: 3em; - margin-right: 3em; - } - .col-md-4 { - position: initial !important; - } -} -.title { - font-family: $font_5; - font-size: 14em; - font-weight: 100; - text-align: center; -} -.title-get-involved { - font-family: $font_5; - font-size: 5em; - font-weight: 100; - text-align: center; -} -.main-content { - margin-top: 2em; -} -.logo2 { - height: 15em; - margin-top: 4em; -} -.description { - font-family: $font_0; - font-size: 1.6em; - text-align: center; - font-weight: 300; - text-transform: none !important; -} -pre { - padding: 0; -} -.tip { - font-size: 1.2em; -} -.tip-small { - font-size: 1em; -} -.terminal-install { - margin-top: 1em; -} -.dev-row { - border-top: 1px solid $color_quill_gray_approx; - padding-left: 0; - padding-right: 0; - margin-bottom: 0 !important; - padding-top: 1em; - padding-bottom: 1em; -} -.no-border { - border-top: 0 !important; -} -.example-card { - padding: 2em; -} -.example-select { - padding: 2em; -} -.footer-text { - text-align: center; - color: $color_waterloo__approx; - font-family: $font_0; - padding: 1em; -} -.ft-span { - text-transform: uppercase; - letter-spacing: 0.1em; -} -.container-title { - font-size: 3em; - font-weight: 100; -} -body { - display: flex !important; - min-height: 100vh !important; - flex-direction: column !important; - font-family: $font_0; -} -.page-content { - display: flex !important; - min-height: 100vh !important; - flex-direction: column !important; - font-family: $font_0; - line-height: 1.5; -} -main { - flex: 1 0 auto; -} -#search { - font-size: 24px !important; - border: none !important; - font-family: $font_1; - font-weight: 500; - color: $black !important; - //Instead of the line below you could use @include box-shadow($shadow-1, $shadow-2, $shadow-3, $shadow-4, $shadow-5, $shadow-6, $shadow-7, $shadow-8, $shadow-9, $shadow-10) - box-shadow: none !important; -} -.btn { - background-color: $black !important; - &:hover { - background-color: $color_cape_cod_approx !important; - } -} -.btn-large { - background-color: $black !important; - &:hover { - background-color: $color_cape_cod_approx !important; - } -} -::-webkit-input-placeholder { - font-weight: 200; - color: $color_star_dust_approx; -} -:-moz-placeholder { - font-weight: 200; - color: $color_celeste_approx; -} -::-moz-placeholder { - font-weight: 200; - color: $color_celeste_approx; -} -:-ms-input-placeholder { - font-weight: 200; - color: $color_celeste_approx; -} -.card-title { - overflow-wrap: break-word !important; - padding: 0.5em; - text-align: center; -} -.footer-coala { - font-size: 42px; - font-weight: 100; - vertical-align: text-bottom; -} -.footer-coala-row { - margin: 0 !important; -} -.snippet-card { - white-space: pre-line !important; -} -.showcase { - display: flex; - justify-content: center; - flex-wrap: wrap; - margin-top: 4em; -} -.showcase-card { - width: 300px; - margin-left: 0.5em; - margin-right: 0.5em; -} -.name-bear { - font-size: 22px !important; -} -.markdown { - p { - display: block !important; - } - a { - color: $color_twilight_blue_approx; - &:hover { - opacity: 0.7; - } - } - h4 { - font-size: 1.1em; - letter-spacing: 0.1em; - color: $wheat; - text-transform: uppercase; - } - h5 { - font-size: 1em; - letter-spacing: 0.1em; - color: $wheat; - } - li { - list-style-type: disc !important; - } - ul li { - margin-left: 1em; - } -} -a { - > .card { - color: $black !important; - } - &:hover > .card { - color: $black !important; - } -} -.modal { - width: 90% !important; - max-height: 90% !important; - //Instead of the line below you could use @include border-radius($radius, $vertical-radius) - border-radius: 0 !important; - top: 10% !important; - bottom: 10%; - background-color: $black !important; -} -.profile { - background-color: $black; - color: $white; -} -.dashboard { - background-color: $color_plantation_approx; -} -.modal-content-bear { - display: flex; -} -.project-name { - font-size: 2em; - text-align: center; - padding-right: 1em; - padding-top: 1em; - padding-bottom: 0.1em; - font-weight: 100; - overflow-wrap: break-word; -} -.project-description { - color: $color_quill_gray_approx; - text-align: justify; - font-size: 1.1em; - font-family: $font_0; - font-weight: 300; - padding: 1em; - > p > a { - color: $color_half_dutch_white_approx; - &:hover { - opacity: 0.7; - } - } -} -.project-card-detail { - cursor: pointer; - height: 200px; -} -.pr-element-detail { - font-size: 1em; -} -.small-heading { - font-size: 0.9em; - padding: 0.5em; - font-weight: 400; - color: $color_mimosa_approx; - letter-spacing: 0.1em; - text-transform: uppercase; -} -.authors { - font-size: 14px; - color: $wheat; - font-weight: 400; -} -.author-row { - padding-top: 20%; -} -.showcase-gi { - display: flex; - justify-content: center; - flex-wrap: wrap; - margin-top: 1em; - .card .card-action a:not(.btn):not(.btn-large):not(.btn-floating) { - margin-right: 0 !important; - } -} -.showcase-card-gi { - width: 220px; - margin-left: 0.5em; - margin-right: 0.5em; -} -.profile-img { - margin-top: -5em; - width: 100px; - //Instead of the line below you could use @include border-radius($radius, $vertical-radius) - border-radius: 100%; -} -.empty { - background-color: $color_athens_gray_approx !important; - height: 5em; -} -.profile-data { - background-color: $color_outer_space_approx !important; - color: $white; -} -.person-name { - font-size: 1.1em; - font-weight: 300; - text-align: center; -} -.small-heading-light { - font-size: 12px; - letter-spacing: 0.1em; - text-align: center; - color: $color_quill_gray_approx; - font-weight: 500; - opacity: 0.2; -} -.person-contributions { - margin-top: 2em; - text-align: center; - letter-spacing: 0.1em; -} -.person-github-id { - font-size: 1.2em; - text-align: center; - padding: 0.5em; - text-transform: none !important; - font-family: $font_2, $font_3, $font_4; -} -.person-github-bio { - font-size: 0.8em; - text-align: center; - padding-top: 0.5em; -} -.person-github-id-div { - padding: 0.5em; - text-align: center !important; -} -.github-link { - bottom: 0; - margin-top: 1em; -} -.gi-container-title { - font-size: 5em; - font-weight: 100; - text-align: center; -} -.main-content-faq { - padding: 4em; -} -.gi-container-title-header { - font-size: 6em; - font-weight: 200; - text-align: center; -} -.contributions-row { - margin-bottom: 0 !important; - position: absolute; - text-align: center; - width: 180px; - bottom: 0; - padding-bottom: 1em; -} -.medium-heading { - font-size: 1.3em; - padding: 0.5em; - font-weight: 400; - color: $color_mimosa_approx; - letter-spacing: 0.1em; -} -.mentors-github-id { - font-size: 1.2em; - color: $color_blue_chill_approx !important; - text-transform: none !important; - font-family: $font_2, $font_3, $font_4; - display: inline-block; - &:hover { - color: $black !important; - } -} -input { - background-color: $color_quill_gray_approx !important; - padding-left: 0.5em !important; -} -@media only screen and(max-width: 500px) { - .tabs .indicator { - position: absolute; - bottom: 0; - height: 2px; - background-color: $black !important; - will-change: left, right; - margin-left: 0.5em; - margin-right: 0.5em; - } -} -.explore { - text-transform: uppercase; -} -.markdown-reqs { - p { - display: initial !important; - } - a { - color: $color_tradewind_approx; - &:hover { - opacity: 0.7; - } - } -} -.project-overview-element { - padding: 10px !important; -} -.collapsible-body { - p { - margin: 0; - padding: 0.5em !important; - } - li { - list-style-type: disc !important; - } -} -.clickable { - cursor: pointer; -} -span.caret { - color: initial; - position: absolute; - right: 0; - top: 16px; - font-size: 10px; - padding-left: 10px; -} -footer.page-footer { - margin-top: 20px; - padding-top: 20px; - background-color: $white !important; - .footer-copyright { - overflow: hidden; - height: 50px; - line-height: 50px; - color: $color_waterloo__approx !important; - background-color: $white !important; - } -} -.reqs-proj > .chip { - //Instead of the line below you could use @include border-radius($radius, $vertical-radius) - border-radius: 0 !important; -} -div.mentors { - text-align: center; -} -input:not([type]) { - background-color: $color_quill_gray_approx; - padding-left: 0.5em !important; -} -textarea.materialize-textarea { - background-color: $color_quill_gray_approx; - padding-left: 0.5em !important; -} -ul:not(.browser-default) { - margin-left: 1em !important; - li { - margin-left: 1em; - } -} -.req-ul li { - list-style-type: disc !important; -} diff --git a/gsoc/display/resources/js/app.js b/gsoc/display/resources/js/app.js deleted file mode 100644 index 47f8a3c5..00000000 --- a/gsoc/display/resources/js/app.js +++ /dev/null @@ -1,183 +0,0 @@ ---- - --- - (function () { - var app = angular.module('coala', ['ngSanitize', 'btford.markdown', 'ngRoute']); - - app.config(['$routeProvider', - function ($routeProvider) { - $routeProvider. - when('/projects', { - template: '', - reloadOnSearch: false - }). - when('/mentors', { - template: '' - }). - when('/faq', { - template: '' - }). - otherwise({ - redirectTo: '/projects' - }); - }]); - - app.controller('TabController', function ($location) { - this.tab = $location.path(); - this.setTab = function (stab) { - this.tab = stab; - $location.path(stab); - }; - this.isSet = function (stab) { - return $location.path() == stab; - }; - }); - - app.directive('projects', ['$http', '$timeout', '$location', function ($http, $timeout, $location) { - return { - restrict: 'E', - templateUrl: "{{ '/gsoc/display/partials/tabs/projects.html' | prepend: site.baseurl }}", - controller: function ($scope, $location) { - self = this; - $scope.projectList = projects; - - self.showProject = function (project) { - $scope.currentProject = project; - $(document).ready(function () { - $('.modal').modal('open'); - }); - mval = encodeURIComponent(project["name"].split(' ').join('_').toLowerCase()); - $location.url('?project=' + mval); - }; - - $scope.search = function (arg) { - $scope.searchText = arg; - }; - - $scope.redirect = function (arg) { - window.open(arg, '_blank'); - }; - - $scope.updateLink = function () { - $scope.currentProject = null; - $location.url($location.path()); - }; - - $scope.projects_url_dict = {}; - angular.forEach($scope.projectList, function (value, key) { - // Create a new key as RESTURL so it can follow the name of the project. - value["resturl"] = encodeURIComponent(value["name"].split(' ').join('_').toLowerCase()); - $scope.projects_url_dict[value["resturl"]] = key; - }); - - // Find whether there's a project name in the URL and try to load it. - var project_requested = encodeURIComponent($location.search().project); - if (project_requested) { - if (Object.keys($scope.projects_url_dict).indexOf(project_requested) > -1) { - self.showProject($scope.projectList[$scope.projects_url_dict[project_requested]]); - } - } - - var search_requested = $location.search().q; - if (search_requested) { - $scope.searchText = search_requested; - } - }, - controllerAs: 'lc' - }; - }]); - - app.directive('faq', ['$http', function ($http) { - return { - restrict: 'E', - templateUrl: "{{ '/gsoc/display/partials/tabs/faq.html' | prepend: site.baseurl }}", - controller: function () { - self = this - self.faqs = faq - }, - controllerAs: 'toc' - }; - }]); - - - app.filter('format_desc', function () { - return function (value) { - if (!value) return ''; - var lastspace = value.indexOf('.'); - if (lastspace != -1) { - if (value.charAt(lastspace - 1) == ',') { - lastspace = lastspace - 1; - } - value = value.substr(0, lastspace); - } - return value; - }; - }); - - app.filter('format_issue', function () { - return function (value) { - if (!value) return ''; - res = value.split('/'); - res = res[3] + '/' + res[4] + '#' + res[6]; - return res; - }; - }); - - app.filter('format_project', function () { - return function (value) { - if (!value) return ''; - var all = {{ site.data.members | jsonify }}; - if (value in all) { - var data = all[value]; - if ('chat' in data) { - if ('matrix' in data.chat) { - return data.chat['matrix']; - } else if ('slack' in data.chat) { - return data.chat['slack']; - } else if ('gitter' in data.chat) { - return data.chat['gitter']; - } - } - if ('mailinglist' in data) { - if ('devs' in data.mailinglist) { - return data.mailinglist['devs']; - } else if ('users' in data.mailinglist) { - return data.mailinglist['users']; - } - } - } - return 'https://app.element.io/#/room/#openastronomy:matrix.org'; - }; - }); - -app.directive('mentors', ['$http', function ($http) { - return { - restrict: 'E', - templateUrl: "{{ '/gsoc/display/partials/tabs/mentors.html' | prepend: site.baseurl }}", - controller: function ($scope) { - self = this; - self.mentorsList = {}; - self.adminsList = {}; - self.year = year.toString(); - angular.forEach(projects, function (value, key) { - angular.forEach(value.mentors, function (value, key) { - self.mentorsList[value] = { - "github_handle": value, - "github_avatar_url": "https://avatars.githubusercontent.com/" + value - }; - - }); - }); - - angular.forEach(admins[year], function (value, key) { - self.adminsList[value] = { - "github_handle": value, - "github_avatar_url": "https://avatars.githubusercontent.com/" + value - - }; - }); - }, - controllerAs: "gic" - }; -}]); - -}) (); diff --git a/gsoc/display/vendors/angular-sanitize/angular-sanitize.js b/gsoc/display/vendors/angular-sanitize/angular-sanitize.js deleted file mode 100644 index 696bc70f..00000000 --- a/gsoc/display/vendors/angular-sanitize/angular-sanitize.js +++ /dev/null @@ -1,739 +0,0 @@ -/** - * @license AngularJS v1.6.1 - * (c) 2010-2016 Google, Inc. http://angularjs.org - * License: MIT - */ -(function(window, angular) {'use strict'; - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Any commits to this file should be reviewed with security in mind. * - * Changes to this file can potentially create security vulnerabilities. * - * An approval from 2 Core members with history of modifying * - * this file is required. * - * * - * Does the change somehow allow for arbitrary javascript to be executed? * - * Or allows for someone to change the prototype of built-in objects? * - * Or gives undesired access to variables likes document or window? * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -var $sanitizeMinErr = angular.$$minErr('$sanitize'); -var bind; -var extend; -var forEach; -var isDefined; -var lowercase; -var noop; -var htmlParser; -var htmlSanitizeWriter; - -/** - * @ngdoc module - * @name ngSanitize - * @description - * - * # ngSanitize - * - * The `ngSanitize` module provides functionality to sanitize HTML. - * - * - *
- * - * See {@link ngSanitize.$sanitize `$sanitize`} for usage. - */ - -/** - * @ngdoc service - * @name $sanitize - * @kind function - * - * @description - * Sanitizes an html string by stripping all potentially dangerous tokens. - * - * The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are - * then serialized back to properly escaped html string. This means that no unsafe input can make - * it into the returned string. - * - * The whitelist for URL sanitization of attribute values is configured using the functions - * `aHrefSanitizationWhitelist` and `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider - * `$compileProvider`}. - * - * The input may also contain SVG markup if this is enabled via {@link $sanitizeProvider}. - * - * @param {string} html HTML input. - * @returns {string} Sanitized HTML. - * - * @example - - - -
- Snippet: - - - - - - - - - - - - - - - - - - - - - - - - - -
DirectiveHowSourceRendered
ng-bind-htmlAutomatically uses $sanitize
<div ng-bind-html="snippet">
</div>
ng-bind-htmlBypass $sanitize by explicitly trusting the dangerous value -
<div ng-bind-html="deliberatelyTrustDangerousSnippet()">
-</div>
-
ng-bindAutomatically escapes
<div ng-bind="snippet">
</div>
-
-
- - it('should sanitize the html snippet by default', function() { - expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')). - toBe('

an html\nclick here\nsnippet

'); - }); - - it('should inline raw snippet if bound to a trusted value', function() { - expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')). - toBe("

an html\n" + - "click here\n" + - "snippet

"); - }); - - it('should escape snippet without any filter', function() { - expect(element(by.css('#bind-default div')).getAttribute('innerHTML')). - toBe("<p style=\"color:blue\">an html\n" + - "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + - "snippet</p>"); - }); - - it('should update', function() { - element(by.model('snippet')).clear(); - element(by.model('snippet')).sendKeys('new text'); - expect(element(by.css('#bind-html-with-sanitize div')).getAttribute('innerHTML')). - toBe('new text'); - expect(element(by.css('#bind-html-with-trust div')).getAttribute('innerHTML')).toBe( - 'new text'); - expect(element(by.css('#bind-default div')).getAttribute('innerHTML')).toBe( - "new <b onclick=\"alert(1)\">text</b>"); - }); -
-
- */ - - -/** - * @ngdoc provider - * @name $sanitizeProvider - * @this - * - * @description - * Creates and configures {@link $sanitize} instance. - */ -function $SanitizeProvider() { - var svgEnabled = false; - - this.$get = ['$$sanitizeUri', function($$sanitizeUri) { - if (svgEnabled) { - extend(validElements, svgElements); - } - return function(html) { - var buf = []; - htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) { - return !/^unsafe:/.test($$sanitizeUri(uri, isImage)); - })); - return buf.join(''); - }; - }]; - - - /** - * @ngdoc method - * @name $sanitizeProvider#enableSvg - * @kind function - * - * @description - * Enables a subset of svg to be supported by the sanitizer. - * - *
- *

By enabling this setting without taking other precautions, you might expose your - * application to click-hijacking attacks. In these attacks, sanitized svg elements could be positioned - * outside of the containing element and be rendered over other elements on the page (e.g. a login - * link). Such behavior can then result in phishing incidents.

- * - *

To protect against these, explicitly setup `overflow: hidden` css rule for all potential svg - * tags within the sanitized content:

- * - *
- * - *

-   *   .rootOfTheIncludedContent svg {
-   *     overflow: hidden !important;
-   *   }
-   *   
- *
- * - * @param {boolean=} flag Enable or disable SVG support in the sanitizer. - * @returns {boolean|ng.$sanitizeProvider} Returns the currently configured value if called - * without an argument or self for chaining otherwise. - */ - this.enableSvg = function(enableSvg) { - if (isDefined(enableSvg)) { - svgEnabled = enableSvg; - return this; - } else { - return svgEnabled; - } - }; - - ////////////////////////////////////////////////////////////////////////////////////////////////// - // Private stuff - ////////////////////////////////////////////////////////////////////////////////////////////////// - - bind = angular.bind; - extend = angular.extend; - forEach = angular.forEach; - isDefined = angular.isDefined; - lowercase = angular.lowercase; - noop = angular.noop; - - htmlParser = htmlParserImpl; - htmlSanitizeWriter = htmlSanitizeWriterImpl; - - // Regular Expressions for parsing tags and attributes - var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g, - // Match everything outside of normal chars and " (quote character) - NON_ALPHANUMERIC_REGEXP = /([^#-~ |!])/g; - - - // Good source of info about elements and attributes - // http://dev.w3.org/html5/spec/Overview.html#semantics - // http://simon.html5.org/html-elements - - // Safe Void Elements - HTML5 - // http://dev.w3.org/html5/spec/Overview.html#void-elements - var voidElements = toMap('area,br,col,hr,img,wbr'); - - // Elements that you can, intentionally, leave open (and which close themselves) - // http://dev.w3.org/html5/spec/Overview.html#optional-tags - var optionalEndTagBlockElements = toMap('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr'), - optionalEndTagInlineElements = toMap('rp,rt'), - optionalEndTagElements = extend({}, - optionalEndTagInlineElements, - optionalEndTagBlockElements); - - // Safe Block Elements - HTML5 - var blockElements = extend({}, optionalEndTagBlockElements, toMap('address,article,' + - 'aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,' + - 'h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,section,table,ul')); - - // Inline Elements - HTML5 - var inlineElements = extend({}, optionalEndTagInlineElements, toMap('a,abbr,acronym,b,' + - 'bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s,' + - 'samp,small,span,strike,strong,sub,sup,time,tt,u,var')); - - // SVG Elements - // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements - // Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted. - // They can potentially allow for arbitrary javascript to be executed. See #11290 - var svgElements = toMap('circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,' + - 'hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,' + - 'radialGradient,rect,stop,svg,switch,text,title,tspan'); - - // Blocked Elements (will be stripped) - var blockedElements = toMap('script,style'); - - var validElements = extend({}, - voidElements, - blockElements, - inlineElements, - optionalEndTagElements); - - //Attributes that have href and hence need to be sanitized - var uriAttrs = toMap('background,cite,href,longdesc,src,xlink:href'); - - var htmlAttrs = toMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' + - 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' + - 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' + - 'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' + - 'valign,value,vspace,width'); - - // SVG attributes (without "id" and "name" attributes) - // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes - var svgAttrs = toMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' + - 'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' + - 'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' + - 'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' + - 'height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,' + - 'marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,' + - 'max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,' + - 'path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,' + - 'requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,' + - 'stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,' + - 'stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,' + - 'stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,' + - 'underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,' + - 'width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,' + - 'xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan', true); - - var validAttrs = extend({}, - uriAttrs, - svgAttrs, - htmlAttrs); - - function toMap(str, lowercaseKeys) { - var obj = {}, items = str.split(','), i; - for (i = 0; i < items.length; i++) { - obj[lowercaseKeys ? lowercase(items[i]) : items[i]] = true; - } - return obj; - } - - var inertBodyElement; - (function(window) { - var doc; - if (window.document && window.document.implementation) { - doc = window.document.implementation.createHTMLDocument('inert'); - } else { - throw $sanitizeMinErr('noinert', 'Can\'t create an inert html document'); - } - var docElement = doc.documentElement || doc.getDocumentElement(); - var bodyElements = docElement.getElementsByTagName('body'); - - // usually there should be only one body element in the document, but IE doesn't have any, so we need to create one - if (bodyElements.length === 1) { - inertBodyElement = bodyElements[0]; - } else { - var html = doc.createElement('html'); - inertBodyElement = doc.createElement('body'); - html.appendChild(inertBodyElement); - doc.appendChild(html); - } - })(window); - - /** - * @example - * htmlParser(htmlString, { - * start: function(tag, attrs) {}, - * end: function(tag) {}, - * chars: function(text) {}, - * comment: function(text) {} - * }); - * - * @param {string} html string - * @param {object} handler - */ - function htmlParserImpl(html, handler) { - if (html === null || html === undefined) { - html = ''; - } else if (typeof html !== 'string') { - html = '' + html; - } - inertBodyElement.innerHTML = html; - - //mXSS protection - var mXSSAttempts = 5; - do { - if (mXSSAttempts === 0) { - throw $sanitizeMinErr('uinput', 'Failed to sanitize html because the input is unstable'); - } - mXSSAttempts--; - - // strip custom-namespaced attributes on IE<=11 - if (window.document.documentMode) { - stripCustomNsAttrs(inertBodyElement); - } - html = inertBodyElement.innerHTML; //trigger mXSS - inertBodyElement.innerHTML = html; - } while (html !== inertBodyElement.innerHTML); - - var node = inertBodyElement.firstChild; - while (node) { - switch (node.nodeType) { - case 1: // ELEMENT_NODE - handler.start(node.nodeName.toLowerCase(), attrToMap(node.attributes)); - break; - case 3: // TEXT NODE - handler.chars(node.textContent); - break; - } - - var nextNode; - if (!(nextNode = node.firstChild)) { - if (node.nodeType === 1) { - handler.end(node.nodeName.toLowerCase()); - } - nextNode = node.nextSibling; - if (!nextNode) { - while (nextNode == null) { - node = node.parentNode; - if (node === inertBodyElement) break; - nextNode = node.nextSibling; - if (node.nodeType === 1) { - handler.end(node.nodeName.toLowerCase()); - } - } - } - } - node = nextNode; - } - - while ((node = inertBodyElement.firstChild)) { - inertBodyElement.removeChild(node); - } - } - - function attrToMap(attrs) { - var map = {}; - for (var i = 0, ii = attrs.length; i < ii; i++) { - var attr = attrs[i]; - map[attr.name] = attr.value; - } - return map; - } - - - /** - * Escapes all potentially dangerous characters, so that the - * resulting string can be safely inserted into attribute or - * element text. - * @param value - * @returns {string} escaped text - */ - function encodeEntities(value) { - return value. - replace(/&/g, '&'). - replace(SURROGATE_PAIR_REGEXP, function(value) { - var hi = value.charCodeAt(0); - var low = value.charCodeAt(1); - return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';'; - }). - replace(NON_ALPHANUMERIC_REGEXP, function(value) { - return '&#' + value.charCodeAt(0) + ';'; - }). - replace(//g, '>'); - } - - /** - * create an HTML/XML writer which writes to buffer - * @param {Array} buf use buf.join('') to get out sanitized html string - * @returns {object} in the form of { - * start: function(tag, attrs) {}, - * end: function(tag) {}, - * chars: function(text) {}, - * comment: function(text) {} - * } - */ - function htmlSanitizeWriterImpl(buf, uriValidator) { - var ignoreCurrentElement = false; - var out = bind(buf, buf.push); - return { - start: function(tag, attrs) { - tag = lowercase(tag); - if (!ignoreCurrentElement && blockedElements[tag]) { - ignoreCurrentElement = tag; - } - if (!ignoreCurrentElement && validElements[tag] === true) { - out('<'); - out(tag); - forEach(attrs, function(value, key) { - var lkey = lowercase(key); - var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); - if (validAttrs[lkey] === true && - (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { - out(' '); - out(key); - out('="'); - out(encodeEntities(value)); - out('"'); - } - }); - out('>'); - } - }, - end: function(tag) { - tag = lowercase(tag); - if (!ignoreCurrentElement && validElements[tag] === true && voidElements[tag] !== true) { - out(''); - } - // eslint-disable-next-line eqeqeq - if (tag == ignoreCurrentElement) { - ignoreCurrentElement = false; - } - }, - chars: function(chars) { - if (!ignoreCurrentElement) { - out(encodeEntities(chars)); - } - } - }; - } - - - /** - * When IE9-11 comes across an unknown namespaced attribute e.g. 'xlink:foo' it adds 'xmlns:ns1' attribute to declare - * ns1 namespace and prefixes the attribute with 'ns1' (e.g. 'ns1:xlink:foo'). This is undesirable since we don't want - * to allow any of these custom attributes. This method strips them all. - * - * @param node Root element to process - */ - function stripCustomNsAttrs(node) { - while (node) { - if (node.nodeType === window.Node.ELEMENT_NODE) { - var attrs = node.attributes; - for (var i = 0, l = attrs.length; i < l; i++) { - var attrNode = attrs[i]; - var attrName = attrNode.name.toLowerCase(); - if (attrName === 'xmlns:ns1' || attrName.lastIndexOf('ns1:', 0) === 0) { - node.removeAttributeNode(attrNode); - i--; - l--; - } - } - } - - var nextNode = node.firstChild; - if (nextNode) { - stripCustomNsAttrs(nextNode); - } - - node = node.nextSibling; - } - } -} - -function sanitizeText(chars) { - var buf = []; - var writer = htmlSanitizeWriter(buf, noop); - writer.chars(chars); - return buf.join(''); -} - - -// define ngSanitize module and register $sanitize service -angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); - -/** - * @ngdoc filter - * @name linky - * @kind function - * - * @description - * Finds links in text input and turns them into html links. Supports `http/https/ftp/mailto` and - * plain email address links. - * - * Requires the {@link ngSanitize `ngSanitize`} module to be installed. - * - * @param {string} text Input text. - * @param {string} target Window (`_blank|_self|_parent|_top`) or named frame to open links in. - * @param {object|function(url)} [attributes] Add custom attributes to the link element. - * - * Can be one of: - * - * - `object`: A map of attributes - * - `function`: Takes the url as a parameter and returns a map of attributes - * - * If the map of attributes contains a value for `target`, it overrides the value of - * the target parameter. - * - * - * @returns {string} Html-linkified and {@link $sanitize sanitized} text. - * - * @usage - - * - * @example - - -
- Snippet: - - - - - - - - - - - - - - - - - - - - - - - - - - -
FilterSourceRendered
linky filter -
<div ng-bind-html="snippet | linky">
</div>
-
-
-
linky target -
<div ng-bind-html="snippetWithSingleURL | linky:'_blank'">
</div>
-
-
-
linky custom attributes -
<div ng-bind-html="snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}">
</div>
-
-
-
no filter
<div ng-bind="snippet">
</div>
- - - angular.module('linkyExample', ['ngSanitize']) - .controller('ExampleController', ['$scope', function($scope) { - $scope.snippet = - 'Pretty text with some links:\n' + - 'http://angularjs.org/,\n' + - 'mailto:us@somewhere.org,\n' + - 'another@somewhere.org,\n' + - 'and one more: ftp://127.0.0.1/.'; - $scope.snippetWithSingleURL = 'http://angularjs.org/'; - }]); - - - it('should linkify the snippet with urls', function() { - expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). - toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' + - 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); - expect(element.all(by.css('#linky-filter a')).count()).toEqual(4); - }); - - it('should not linkify snippet without the linky filter', function() { - expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()). - toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' + - 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); - expect(element.all(by.css('#escaped-html a')).count()).toEqual(0); - }); - - it('should update', function() { - element(by.model('snippet')).clear(); - element(by.model('snippet')).sendKeys('new http://link.'); - expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). - toBe('new http://link.'); - expect(element.all(by.css('#linky-filter a')).count()).toEqual(1); - expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()) - .toBe('new http://link.'); - }); - - it('should work with the target property', function() { - expect(element(by.id('linky-target')). - element(by.binding("snippetWithSingleURL | linky:'_blank'")).getText()). - toBe('http://angularjs.org/'); - expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank'); - }); - - it('should optionally add custom attributes', function() { - expect(element(by.id('linky-custom-attributes')). - element(by.binding("snippetWithSingleURL | linky:'_self':{rel: 'nofollow'}")).getText()). - toBe('http://angularjs.org/'); - expect(element(by.css('#linky-custom-attributes a')).getAttribute('rel')).toEqual('nofollow'); - }); - - - */ -angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) { - var LINKY_URL_REGEXP = - /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i, - MAILTO_REGEXP = /^mailto:/i; - - var linkyMinErr = angular.$$minErr('linky'); - var isDefined = angular.isDefined; - var isFunction = angular.isFunction; - var isObject = angular.isObject; - var isString = angular.isString; - - return function(text, target, attributes) { - if (text == null || text === '') return text; - if (!isString(text)) throw linkyMinErr('notstring', 'Expected string but received: {0}', text); - - var attributesFn = - isFunction(attributes) ? attributes : - isObject(attributes) ? function getAttributesObject() {return attributes;} : - function getEmptyAttributesObject() {return {};}; - - var match; - var raw = text; - var html = []; - var url; - var i; - while ((match = raw.match(LINKY_URL_REGEXP))) { - // We can not end in these as they are sometimes found at the end of the sentence - url = match[0]; - // if we did not match ftp/http/www/mailto then assume mailto - if (!match[2] && !match[4]) { - url = (match[3] ? 'http://' : 'mailto:') + url; - } - i = match.index; - addText(raw.substr(0, i)); - addLink(url, match[0].replace(MAILTO_REGEXP, '')); - raw = raw.substring(i + match[0].length); - } - addText(raw); - return $sanitize(html.join('')); - - function addText(text) { - if (!text) { - return; - } - html.push(sanitizeText(text)); - } - - function addLink(url, text) { - var key, linkAttributes = attributesFn(url); - html.push(''); - addText(text); - html.push(''); - } - }; -}]); - - -})(window, window.angular); diff --git a/gsoc/display/vendors/markdown/markdown.js b/gsoc/display/vendors/markdown/markdown.js deleted file mode 100644 index 989a6bec..00000000 --- a/gsoc/display/vendors/markdown/markdown.js +++ /dev/null @@ -1,36 +0,0 @@ -/* - * angular-markdown-directive v0.3.1 - * (c) 2013-2014 Brian Ford http://briantford.com - * License: MIT - */ - -'use strict'; - -angular.module('btford.markdown', ['ngSanitize']). - provider('markdownConverter', function () { - var opts = {}; - return { - config: function (newOpts) { - opts = newOpts; - }, - $get: function () { - return new Showdown.converter(opts); - } - }; - }). - directive('btfMarkdown', ['$sanitize', 'markdownConverter', function ($sanitize, markdownConverter) { - return { - restrict: 'AE', - link: function (scope, element, attrs) { - if (attrs.btfMarkdown) { - scope.$watch(attrs.btfMarkdown, function (newVal) { - var html = newVal ? $sanitize(markdownConverter.makeHtml(newVal)) : ''; - element.html(html); - }); - } else { - var html = $sanitize(markdownConverter.makeHtml(element.text())); - element.html(html); - } - } - }; - }]); diff --git a/gsoc/display/vendors/showdown/showdown.js b/gsoc/display/vendors/showdown/showdown.js deleted file mode 100644 index 25bed634..00000000 --- a/gsoc/display/vendors/showdown/showdown.js +++ /dev/null @@ -1,1454 +0,0 @@ -// -// showdown.js -- A javascript port of Markdown. -// -// Copyright (c) 2007 John Fraser. -// -// Original Markdown Copyright (c) 2004-2005 John Gruber -// -// -// Redistributable under a BSD-style open source license. -// See license.txt for more information. -// -// The full source distribution is at: -// -// A A L -// T C A -// T K B -// -// -// - -// -// Wherever possible, Showdown is a straight, line-by-line port -// of the Perl version of Markdown. -// -// This is not a normal parser design; it's basically just a -// series of string substitutions. It's hard to read and -// maintain this way, but keeping Showdown close to the original -// design makes it easier to port new features. -// -// More importantly, Showdown behaves like markdown.pl in most -// edge cases. So web applications can do client-side preview -// in Javascript, and then build identical HTML on the server. -// -// This port needs the new RegExp functionality of ECMA 262, -// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers -// should do fine. Even with the new regular expression features, -// We do a lot of work to emulate Perl's regex functionality. -// The tricky changes in this file mostly have the "attacklab:" -// label. Major or self-explanatory changes don't. -// -// Smart diff tools like Araxis Merge will be able to match up -// this file with markdown.pl in a useful way. A little tweaking -// helps: in a copy of markdown.pl, replace "#" with "//" and -// replace "$text" with "text". Be sure to ignore whitespace -// and line endings. -// - - -// -// Showdown usage: -// -// var text = "Markdown *rocks*."; -// -// var converter = new Showdown.converter(); -// var html = converter.makeHtml(text); -// -// alert(html); -// -// Note: move the sample code to the bottom of this -// file before uncommenting it. -// - - -// -// Showdown namespace -// -var Showdown = {extensions: {}}; - -// -// forEach -// -var forEach = Showdown.forEach = function (obj, callback) { - if (typeof obj.forEach === 'function') { - obj.forEach(callback); - } else { - var i, len = obj.length; - for (i = 0; i < len; i++) { - callback(obj[i], i, obj); - } - } -}; - -// -// Standard extension naming -// -var stdExtName = function (s) { - return s.replace(/[_-]||\s/g, '').toLowerCase(); -}; - -// -// converter -// -// Wraps all "globals" so that the only thing -// exposed is makeHtml(). -// -Showdown.converter = function (converter_options) { - -// -// Globals: -// - -// Global hashes, used by various utility routines - var g_urls; - var g_titles; - var g_html_blocks; - -// Used to track when we're inside an ordered or unordered list -// (see _ProcessListItems() for details): - var g_list_level = 0; - -// Global extensions - var g_lang_extensions = []; - var g_output_modifiers = []; - - -// -// Automatic Extension Loading (node only): -// - if (typeof module !== 'undefined' && typeof exports !== 'undefined' && typeof require !== 'undefined') { - var fs = require('fs'); - - if (fs) { - // Search extensions folder - var extensions = fs.readdirSync((__dirname || '.') + '/extensions').filter(function (file) { - return ~file.indexOf('.js'); - }).map(function (file) { - return file.replace(/\.js$/, ''); - }); - // Load extensions into Showdown namespace - Showdown.forEach(extensions, function (ext) { - var name = stdExtName(ext); - Showdown.extensions[name] = require('./extensions/' + ext); - }); - } - } - - this.makeHtml = function (text) { -// -// Main function. The order in which other subs are called here is -// essential. Link and image substitutions need to happen before -// _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the -// and tags get encoded. -// - - // Clear the global hashes. If we don't clear these, you get conflicts - // from other articles when generating a page which contains more than - // one article (e.g. an index page that shows the N most recent - // articles): - g_urls = {}; - g_titles = {}; - g_html_blocks = []; - - // attacklab: Replace ~ with ~T - // This lets us use tilde as an escape char to avoid md5 hashes - // The choice of character is arbitray; anything that isn't - // magic in Markdown will work. - text = text.replace(/~/g, "~T"); - - // attacklab: Replace $ with ~D - // RegExp interprets $ as a special character - // when it's in a replacement string - text = text.replace(/\$/g, "~D"); - - // Standardize line endings - text = text.replace(/\r\n/g, "\n"); // DOS to Unix - text = text.replace(/\r/g, "\n"); // Mac to Unix - - // Make sure text begins and ends with a couple of newlines: - text = "\n\n" + text + "\n\n"; - - // Convert all tabs to spaces. - text = _Detab(text); - - // Strip any lines consisting only of spaces and tabs. - // This makes subsequent regexen easier to write, because we can - // match consecutive blank lines with /\n+/ instead of something - // contorted like /[ \t]*\n+/ . - text = text.replace(/^[ \t]+$/mg, ""); - - // Run language extensions - Showdown.forEach(g_lang_extensions, function (x) { - text = _ExecuteExtension(x, text); - }); - - // Handle github codeblocks prior to running HashHTML so that - // HTML contained within the codeblock gets escaped propertly - text = _DoGithubCodeBlocks(text); - - // Turn block-level HTML blocks into hash entries - text = _HashHTMLBlocks(text); - - // Strip link definitions, store in hashes. - text = _StripLinkDefinitions(text); - - text = _RunBlockGamut(text); - - text = _UnescapeSpecialChars(text); - - // attacklab: Restore dollar signs - text = text.replace(/~D/g, "$$"); - - // attacklab: Restore tildes - text = text.replace(/~T/g, "~"); - - // Run output modifiers - Showdown.forEach(g_output_modifiers, function (x) { - text = _ExecuteExtension(x, text); - }); - - return text; - }; - - -// -// Options: -// - -// Parse extensions options into separate arrays - if (converter_options && converter_options.extensions) { - - var self = this; - - // Iterate over each plugin - Showdown.forEach(converter_options.extensions, function (plugin) { - - // Assume it's a bundled plugin if a string is given - if (typeof plugin === 'string') { - plugin = Showdown.extensions[stdExtName(plugin)]; - } - - if (typeof plugin === 'function') { - // Iterate over each extension within that plugin - Showdown.forEach(plugin(self), function (ext) { - // Sort extensions by type - if (ext.type) { - if (ext.type === 'language' || ext.type === 'lang') { - g_lang_extensions.push(ext); - } else if (ext.type === 'output' || ext.type === 'html') { - g_output_modifiers.push(ext); - } - } else { - // Assume language extension - g_output_modifiers.push(ext); - } - }); - } else { - throw "Extension '" + plugin + "' could not be loaded. It was either not found or is not a valid extension."; - } - }); - } - - - var _ExecuteExtension = function (ext, text) { - if (ext.regex) { - var re = new RegExp(ext.regex, 'g'); - return text.replace(re, ext.replace); - } else if (ext.filter) { - return ext.filter(text); - } - }; - - var _StripLinkDefinitions = function (text) { -// -// Strips link definitions from text, stores the URLs and titles in -// hash references. -// - - // Link defs are in the form: ^[id]: url "optional title" - - /* - var text = text.replace(/ - ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1 - [ \t]* - \n? // maybe *one* newline - [ \t]* - ? // url = $2 - [ \t]* - \n? // maybe one newline - [ \t]* - (?: - (\n*) // any lines skipped = $3 attacklab: lookbehind removed - ["(] - (.+?) // title = $4 - [")] - [ \t]* - )? // title is optional - (?:\n+|$) - /gm, - function(){...}); - */ - - // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug - text += "~0"; - - text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?[ \t]*\n?[ \t]*(?:(\n*)["(](.+?)[")][ \t]*)?(?:\n+|(?=~0))/gm, - function (wholeMatch, m1, m2, m3, m4) { - m1 = m1.toLowerCase(); - g_urls[m1] = _EncodeAmpsAndAngles(m2); // Link IDs are case-insensitive - if (m3) { - // Oops, found blank lines, so it's not a title. - // Put back the parenthetical statement we stole. - return m3 + m4; - } else if (m4) { - g_titles[m1] = m4.replace(/"/g, """); - } - - // Completely remove the definition from the text - return ""; - } - ); - - // attacklab: strip sentinel - text = text.replace(/~0/, ""); - - return text; - } - - var _HashHTMLBlocks = function (text) { - // attacklab: Double up blank lines to reduce lookaround - text = text.replace(/\n/g, "\n\n"); - - // Hashify HTML blocks: - // We only want to do this for block-level HTML tags, such as headers, - // lists, and tables. That's because we still want to wrap

s around - // "paragraphs" that are wrapped in non-block-level tags, such as anchors, - // phrase emphasis, and spans. The list of tags we're looking for is - // hard-coded: - var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del|style|section|header|footer|nav|article|aside"; - var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside"; - - // First, look for nested blocks, e.g.: - //

- //
- // tags for inner block must be indented. - //
- //
- // - // The outermost tags must start at the left margin for this to match, and - // the inner nested divs must be indented. - // We need to do this before the next, more liberal match, because the next - // match will start at the first `
` and stop at the first `
`. - - // attacklab: This regex can be expensive when it fails. - /* - var text = text.replace(/ - ( // save in $1 - ^ // start of line (with /m) - <($block_tags_a) // start tag = $2 - \b // word break - // attacklab: hack around khtml/pcre bug... - [^\r]*?\n // any number of lines, minimally matching - // the matching end tag - [ \t]* // trailing spaces/tabs - (?=\n+) // followed by a newline - ) // attacklab: there are sentinel newlines at end of document - /gm,function(){...}}; - */ - text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm, hashElement); - - // - // Now match more liberally, simply from `\n` to `\n` - // - - /* - var text = text.replace(/ - ( // save in $1 - ^ // start of line (with /m) - <($block_tags_b) // start tag = $2 - \b // word break - // attacklab: hack around khtml/pcre bug... - [^\r]*? // any number of lines, minimally matching - // the matching end tag - [ \t]* // trailing spaces/tabs - (?=\n+) // followed by a newline - ) // attacklab: there are sentinel newlines at end of document - /gm,function(){...}}; - */ - text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|style|section|header|footer|nav|article|aside)\b[^\r]*?<\/\2>[ \t]*(?=\n+)\n)/gm, hashElement); - - // Special case just for
. It was easier to make a special case than - // to make the other regex more complicated. - - /* - text = text.replace(/ - ( // save in $1 - \n\n // Starting after a blank line - [ ]{0,3} - (<(hr) // start tag = $2 - \b // word break - ([^<>])*? // - \/?>) // the matching end tag - [ \t]* - (?=\n{2,}) // followed by a blank line - ) - /g,hashElement); - */ - text = text.replace(/(\n[ ]{0,3}(<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, hashElement); - - // Special case for standalone HTML comments: - - /* - text = text.replace(/ - ( // save in $1 - \n\n // Starting after a blank line - [ ]{0,3} // attacklab: g_tab_width - 1 - - [ \t]* - (?=\n{2,}) // followed by a blank line - ) - /g,hashElement); - */ - text = text.replace(/(\n\n[ ]{0,3}[ \t]*(?=\n{2,}))/g, hashElement); - - // PHP and ASP-style processor instructions ( and <%...%>) - - /* - text = text.replace(/ - (?: - \n\n // Starting after a blank line - ) - ( // save in $1 - [ ]{0,3} // attacklab: g_tab_width - 1 - (?: - <([?%]) // $2 - [^\r]*? - \2> - ) - [ \t]* - (?=\n{2,}) // followed by a blank line - ) - /g,hashElement); - */ - text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, hashElement); - - // attacklab: Undo double lines (see comment at top of this function) - text = text.replace(/\n\n/g, "\n"); - return text; - } - - var hashElement = function (wholeMatch, m1) { - var blockText = m1; - - // Undo double lines - blockText = blockText.replace(/\n\n/g, "\n"); - blockText = blockText.replace(/^\n/, ""); - - // strip trailing blank lines - blockText = blockText.replace(/\n+$/g, ""); - - // Replace the element text with a marker ("~KxK" where x is its key) - blockText = "\n\n~K" + (g_html_blocks.push(blockText) - 1) + "K\n\n"; - - return blockText; - }; - - var _RunBlockGamut = function (text) { -// -// These are all the transformations that form block-level -// tags like paragraphs, headers, and list items. -// - text = _DoHeaders(text); - - // Do Horizontal Rules: - var key = hashBlock("
"); - text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, key); - text = text.replace(/^[ ]{0,2}([ ]?\-[ ]?){3,}[ \t]*$/gm, key); - text = text.replace(/^[ ]{0,2}([ ]?\_[ ]?){3,}[ \t]*$/gm, key); - - text = _DoLists(text); - text = _DoCodeBlocks(text); - text = _DoBlockQuotes(text); - - // We already ran _HashHTMLBlocks() before, in Markdown(), but that - // was to escape raw HTML in the original Markdown source. This time, - // we're escaping the markup we've just created, so that we don't wrap - //

tags around block-level tags. - text = _HashHTMLBlocks(text); - text = _FormParagraphs(text); - - return text; - }; - - var _RunSpanGamut = function (text) { -// -// These are all the transformations that occur *within* block-level -// tags like paragraphs, headers, and list items. -// - - text = _DoCodeSpans(text); - text = _EscapeSpecialCharsWithinTagAttributes(text); - text = _EncodeBackslashEscapes(text); - - // Process anchor and image tags. Images must come first, - // because ![foo][f] looks like an anchor. - text = _DoImages(text); - text = _DoAnchors(text); - - // Make links out of things like `` - // Must come after _DoAnchors(), because you can use < and > - // delimiters in inline links like [this](). - text = _DoAutoLinks(text); - text = _EncodeAmpsAndAngles(text); - text = _DoItalicsAndBold(text); - - // Do hard breaks: - text = text.replace(/ +\n/g, "
\n"); - - return text; - } - - var _EscapeSpecialCharsWithinTagAttributes = function (text) { -// -// Within tags -- meaning between < and > -- encode [\ ` * _] so they -// don't conflict with their use in Markdown for code, italics and strong. -// - - // Build a regex to find HTML tags and comments. See Friedl's - // "Mastering Regular Expressions", 2nd Ed., pp. 200-201. - var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|)/gi; - - text = text.replace(regex, function (wholeMatch) { - var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g, "$1`"); - tag = escapeCharacters(tag, "\\`*_"); - return tag; - }); - - return text; - } - - var _DoAnchors = function (text) { -// -// Turn Markdown link shortcuts into XHTML
tags. -// - // - // First, handle reference-style links: [link text] [id] - // - - /* - text = text.replace(/ - ( // wrap whole match in $1 - \[ - ( - (?: - \[[^\]]*\] // allow brackets nested one level - | - [^\[] // or anything else - )* - ) - \] - - [ ]? // one optional space - (?:\n[ ]*)? // one optional newline followed by spaces - - \[ - (.*?) // id = $3 - \] - )()()()() // pad remaining backreferences - /g,_DoAnchors_callback); - */ - text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeAnchorTag); - - // - // Next, inline-style links: [link text](url "optional title") - // - - /* - text = text.replace(/ - ( // wrap whole match in $1 - \[ - ( - (?: - \[[^\]]*\] // allow brackets nested one level - | - [^\[\]] // or anything else - ) - ) - \] - \( // literal paren - [ \t]* - () // no id, so leave $3 empty - ? // href = $4 - [ \t]* - ( // $5 - (['"]) // quote char = $6 - (.*?) // Title = $7 - \6 // matching quote - [ \t]* // ignore any spaces/tabs between closing quote and ) - )? // title is optional - \) - ) - /g,writeAnchorTag); - */ - text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag); - - // - // Last, handle reference-style shortcuts: [link text] - // These must come last in case you've also got [link test][1] - // or [link test](/foo) - // - - /* - text = text.replace(/ - ( // wrap whole match in $1 - \[ - ([^\[\]]+) // link text = $2; can't contain '[' or ']' - \] - )()()()()() // pad rest of backreferences - /g, writeAnchorTag); - */ - text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag); - - return text; - } - - var writeAnchorTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) { - if (m7 == undefined) m7 = ""; - var whole_match = m1; - var link_text = m2; - var link_id = m3.toLowerCase(); - var url = m4; - var title = m7; - - if (url == "") { - if (link_id == "") { - // lower-case and turn embedded newlines into spaces - link_id = link_text.toLowerCase().replace(/ ?\n/g, " "); - } - url = "#" + link_id; - - if (g_urls[link_id] != undefined) { - url = g_urls[link_id]; - if (g_titles[link_id] != undefined) { - title = g_titles[link_id]; - } - } - else { - if (whole_match.search(/\(\s*\)$/m) > -1) { - // Special case for explicit empty url - url = ""; - } else { - return whole_match; - } - } - } - - url = escapeCharacters(url, "*_"); - var result = ""; - - return result; - } - - var _DoImages = function (text) { -// -// Turn Markdown image shortcuts into tags. -// - - // - // First, handle reference-style labeled images: ![alt text][id] - // - - /* - text = text.replace(/ - ( // wrap whole match in $1 - !\[ - (.*?) // alt text = $2 - \] - - [ ]? // one optional space - (?:\n[ ]*)? // one optional newline followed by spaces - - \[ - (.*?) // id = $3 - \] - )()()()() // pad rest of backreferences - /g,writeImageTag); - */ - text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeImageTag); - - // - // Next, handle inline images: ![alt text](url "optional title") - // Don't forget: encode * and _ - - /* - text = text.replace(/ - ( // wrap whole match in $1 - !\[ - (.*?) // alt text = $2 - \] - \s? // One optional whitespace character - \( // literal paren - [ \t]* - () // no id, so leave $3 empty - ? // src url = $4 - [ \t]* - ( // $5 - (['"]) // quote char = $6 - (.*?) // title = $7 - \6 // matching quote - [ \t]* - )? // title is optional - \) - ) - /g,writeImageTag); - */ - text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeImageTag); - - return text; - } - - var writeImageTag = function (wholeMatch, m1, m2, m3, m4, m5, m6, m7) { - var whole_match = m1; - var alt_text = m2; - var link_id = m3.toLowerCase(); - var url = m4; - var title = m7; - - if (!title) title = ""; - - if (url == "") { - if (link_id == "") { - // lower-case and turn embedded newlines into spaces - link_id = alt_text.toLowerCase().replace(/ ?\n/g, " "); - } - url = "#" + link_id; - - if (g_urls[link_id] != undefined) { - url = g_urls[link_id]; - if (g_titles[link_id] != undefined) { - title = g_titles[link_id]; - } - } - else { - return whole_match; - } - } - - alt_text = alt_text.replace(/"/g, """); - url = escapeCharacters(url, "*_"); - var result = "\""' + _RunSpanGamut(m1) + ""); - }); - - text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, - function (matchFound, m1) { - return hashBlock('

' + _RunSpanGamut(m1) + "

"); - }); - - // atx-style headers: - // # Header 1 - // ## Header 2 - // ## Header 2 with closing hashes ## - // ... - // ###### Header 6 - // - - /* - text = text.replace(/ - ^(\#{1,6}) // $1 = string of #'s - [ \t]* - (.+?) // $2 = Header text - [ \t]* - \#* // optional closing #'s (not counted) - \n+ - /gm, function() {...}); - */ - - text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm, - function (wholeMatch, m1, m2) { - var h_level = m1.length; - return hashBlock("' + _RunSpanGamut(m2) + ""); - }); - - function headerId(m) { - return m.replace(/[^\w]/g, '').toLowerCase(); - } - - return text; - } - -// This declaration keeps Dojo compressor from outputting garbage: - var _ProcessListItems; - - var _DoLists = function (text) { -// -// Form HTML ordered (numbered) and unordered (bulleted) lists. -// - - // attacklab: add sentinel to hack around khtml/safari bug: - // http://bugs.webkit.org/show_bug.cgi?id=11231 - text += "~0"; - - // Re-usable pattern to match any entirel ul or ol list: - - /* - var whole_list = / - ( // $1 = whole list - ( // $2 - [ ]{0,3} // attacklab: g_tab_width - 1 - ([*+-]|\d+[.]) // $3 = first list item marker - [ \t]+ - ) - [^\r]+? - ( // $4 - ~0 // sentinel for workaround; should be $ - | - \n{2,} - (?=\S) - (?! // Negative lookahead for another list item marker - [ \t]* - (?:[*+-]|\d+[.])[ \t]+ - ) - ) - )/g - */ - var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; - - if (g_list_level) { - text = text.replace(whole_list, function (wholeMatch, m1, m2) { - var list = m1; - var list_type = (m2.search(/[*+-]/g) > -1) ? "ul" : "ol"; - - // Turn double returns into triple returns, so that we can make a - // paragraph for the last item in a list, if necessary: - list = list.replace(/\n{2,}/g, "\n\n\n"); - ; - var result = _ProcessListItems(list); - - // Trim any trailing whitespace, to put the closing `` - // up on the preceding line, to get it past the current stupid - // HTML block parser. This is a hack to work around the terrible - // hack that is the HTML block parser. - result = result.replace(/\s+$/, ""); - result = "<" + list_type + ">" + result + "\n"; - return result; - }); - } else { - whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g; - text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) { - var runup = m1; - var list = m2; - - var list_type = (m3.search(/[*+-]/g) > -1) ? "ul" : "ol"; - // Turn double returns into triple returns, so that we can make a - // paragraph for the last item in a list, if necessary: - var list = list.replace(/\n{2,}/g, "\n\n\n"); - ; - var result = _ProcessListItems(list); - result = runup + "<" + list_type + ">\n" + result + "\n"; - return result; - }); - } - - // attacklab: strip sentinel - text = text.replace(/~0/, ""); - - return text; - } - - _ProcessListItems = function (list_str) { -// -// Process the contents of a single ordered or unordered list, splitting it -// into individual list items. -// - // The $g_list_level global keeps track of when we're inside a list. - // Each time we enter a list, we increment it; when we leave a list, - // we decrement. If it's zero, we're not in a list anymore. - // - // We do this because when we're not inside a list, we want to treat - // something like this: - // - // I recommend upgrading to version - // 8. Oops, now this line is treated - // as a sub-list. - // - // As a single paragraph, despite the fact that the second line starts - // with a digit-period-space sequence. - // - // Whereas when we're inside a list (or sub-list), that line will be - // treated as the start of a sub-list. What a kludge, huh? This is - // an aspect of Markdown's syntax that's hard to parse perfectly - // without resorting to mind-reading. Perhaps the solution is to - // change the syntax rules such that sub-lists must start with a - // starting cardinal number; e.g. "1." or "a.". - - g_list_level++; - - // trim trailing blank lines: - list_str = list_str.replace(/\n{2,}$/, "\n"); - - // attacklab: add sentinel to emulate \z - list_str += "~0"; - - /* - list_str = list_str.replace(/ - (\n)? // leading line = $1 - (^[ \t]*) // leading whitespace = $2 - ([*+-]|\d+[.]) [ \t]+ // list marker = $3 - ([^\r]+? // list item text = $4 - (\n{1,2})) - (?= \n* (~0 | \2 ([*+-]|\d+[.]) [ \t]+)) - /gm, function(){...}); - */ - list_str = list_str.replace(/(\n)?(^[ \t]*)([*+-]|\d+[.])[ \t]+([^\r]+?(\n{1,2}))(?=\n*(~0|\2([*+-]|\d+[.])[ \t]+))/gm, - function (wholeMatch, m1, m2, m3, m4) { - var item = m4; - var leading_line = m1; - var leading_space = m2; - - if (leading_line || (item.search(/\n{2,}/) > -1)) { - item = _RunBlockGamut(_Outdent(item)); - } - else { - // Recursion for sub-lists: - item = _DoLists(_Outdent(item)); - item = item.replace(/\n$/, ""); // chomp(item) - item = _RunSpanGamut(item); - } - - return "
  • " + item + "
  • \n"; - } - ); - - // attacklab: strip sentinel - list_str = list_str.replace(/~0/g, ""); - - g_list_level--; - return list_str; - } - - var _DoCodeBlocks = function (text) { -// -// Process Markdown `
    ` blocks.
    -//
    -
    -        /*
    -         text = text.replace(text,
    -         /(?:\n\n|^)
    -         (								// $1 = the code block -- one or more lines, starting with a space/tab
    -         (?:
    -         (?:[ ]{4}|\t)			// Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
    -         .*\n+
    -         )+
    -         )
    -         (\n*[ ]{0,3}[^ \t\n]|(?=~0))	// attacklab: g_tab_width
    -         /g,function(){...});
    -         */
    -
    -        // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
    -        text += "~0";
    -
    -        text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
    -            function (wholeMatch, m1, m2) {
    -                var codeblock = m1;
    -                var nextChar = m2;
    -
    -                codeblock = _EncodeCode(_Outdent(codeblock));
    -                codeblock = _Detab(codeblock);
    -                codeblock = codeblock.replace(/^\n+/g, ""); // trim leading newlines
    -                codeblock = codeblock.replace(/\n+$/g, ""); // trim trailing whitespace
    -
    -                codeblock = "
    " + codeblock + "\n
    "; - - return hashBlock(codeblock) + nextChar; - } - ); - - // attacklab: strip sentinel - text = text.replace(/~0/, ""); - - return text; - }; - - var _DoGithubCodeBlocks = function (text) { -// -// Process Github-style code blocks -// Example: -// ```ruby -// def hello_world(x) -// puts "Hello, #{x}" -// end -// ``` -// - - - // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug - text += "~0"; - - text = text.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g, - function (wholeMatch, m1, m2) { - var language = m1; - var codeblock = m2; - - codeblock = _EncodeCode(codeblock); - codeblock = _Detab(codeblock); - codeblock = codeblock.replace(/^\n+/g, ""); // trim leading newlines - codeblock = codeblock.replace(/\n+$/g, ""); // trim trailing whitespace - - codeblock = "
    " + codeblock + "\n
    "; - - return hashBlock(codeblock); - } - ); - - // attacklab: strip sentinel - text = text.replace(/~0/, ""); - - return text; - } - - var hashBlock = function (text) { - text = text.replace(/(^\n+|\n+$)/g, ""); - return "\n\n~K" + (g_html_blocks.push(text) - 1) + "K\n\n"; - } - - var _DoCodeSpans = function (text) { -// -// * Backtick quotes are used for spans. -// -// * You can use multiple backticks as the delimiters if you want to -// include literal backticks in the code span. So, this input: -// -// Just type ``foo `bar` baz`` at the prompt. -// -// Will translate to: -// -//

    Just type foo `bar` baz at the prompt.

    -// -// There's no arbitrary limit to the number of backticks you -// can use as delimters. If you need three consecutive backticks -// in your code, use four for delimiters, etc. -// -// * You can use spaces to get literal backticks at the edges: -// -// ... type `` `bar` `` ... -// -// Turns to: -// -// ... type `bar` ... -// - - /* - text = text.replace(/ - (^|[^\\]) // Character before opening ` can't be a backslash - (`+) // $2 = Opening run of ` - ( // $3 = The code block - [^\r]*? - [^`] // attacklab: work around lack of lookbehind - ) - \2 // Matching closer - (?!`) - /gm, function(){...}); - */ - - text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, - function (wholeMatch, m1, m2, m3, m4) { - var c = m3; - c = c.replace(/^([ \t]*)/g, ""); // leading whitespace - c = c.replace(/[ \t]*$/g, ""); // trailing whitespace - c = _EncodeCode(c); - return m1 + "" + c + ""; - }); - - return text; - } - - var _EncodeCode = function (text) { -// -// Encode/escape certain characters inside Markdown code runs. -// The point is that in code, these characters are literals, -// and lose their special Markdown meanings. -// - // Encode all ampersands; HTML entities are not - // entities within a Markdown code span. - text = text.replace(/&/g, "&"); - - // Do the angle bracket song and dance: - text = text.replace(//g, ">"); - - // Now, escape characters that are magic in Markdown: - text = escapeCharacters(text, "\*_{}[]\\", false); - -// jj the line above breaks this: -//--- - -//* Item - -// 1. Subitem - -// special char: * -//--- - - return text; - } - - var _DoItalicsAndBold = function (text) { - - // must go first: - text = text.replace(/(\*\*|__)(?=\S)([^\r]*?\S[*_]*)\1/g, - "$2"); - - text = text.replace(/(\*|_)(?=\S)([^\r]*?\S)\1/g, - "$2"); - - return text; - } - - var _DoBlockQuotes = function (text) { - - /* - text = text.replace(/ - ( // Wrap whole match in $1 - ( - ^[ \t]*>[ \t]? // '>' at the start of a line - .+\n // rest of the first line - (.+\n)* // subsequent consecutive lines - \n* // blanks - )+ - ) - /gm, function(){...}); - */ - - text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm, - function (wholeMatch, m1) { - var bq = m1; - - // attacklab: hack around Konqueror 3.5.4 bug: - // "----------bug".replace(/^-/g,"") == "bug" - - bq = bq.replace(/^[ \t]*>[ \t]?/gm, "~0"); // trim one level of quoting - - // attacklab: clean up hack - bq = bq.replace(/~0/g, ""); - - bq = bq.replace(/^[ \t]+$/gm, ""); // trim whitespace-only lines - bq = _RunBlockGamut(bq); // recurse - - bq = bq.replace(/(^|\n)/g, "$1 "); - // These leading spaces screw with
     content, so we need to fix that:
    -                bq = bq.replace(
    -                    /(\s*
    [^\r]+?<\/pre>)/gm,
    -                    function (wholeMatch, m1) {
    -                        var pre = m1;
    -                        // attacklab: hack around Konqueror 3.5.4 bug:
    -                        pre = pre.replace(/^  /mg, "~0");
    -                        pre = pre.replace(/~0/g, "");
    -                        return pre;
    -                    });
    -
    -                return hashBlock("
    \n" + bq + "\n
    "); - }); - return text; - } - - var _FormParagraphs = function (text) { -// -// Params: -// $text - string to process with html

    tags -// - - // Strip leading and trailing lines: - text = text.replace(/^\n+/g, ""); - text = text.replace(/\n+$/g, ""); - - var grafs = text.split(/\n{2,}/g); - var grafsOut = []; - - // - // Wrap

    tags. - // - var end = grafs.length; - for (var i = 0; i < end; i++) { - var str = grafs[i]; - - // if this is an HTML marker, copy it - if (str.search(/~K(\d+)K/g) >= 0) { - grafsOut.push(str); - } - else if (str.search(/\S/) >= 0) { - str = _RunSpanGamut(str); - str = str.replace(/^([ \t]*)/g, "

    "); - str += "

    " - grafsOut.push(str); - } - - } - - // - // Unhashify HTML blocks - // - end = grafsOut.length; - for (var i = 0; i < end; i++) { - // if this is a marker for an html block... - while (grafsOut[i].search(/~K(\d+)K/) >= 0) { - var blockText = g_html_blocks[RegExp.$1]; - blockText = blockText.replace(/\$/g, "$$$$"); // Escape any dollar signs - grafsOut[i] = grafsOut[i].replace(/~K\d+K/, blockText); - } - } - - return grafsOut.join("\n\n"); - } - - var _EncodeAmpsAndAngles = function (text) { -// Smart processing for ampersands and angle brackets that need to be encoded. - - // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: - // http://bumppo.net/projects/amputator/ - text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, "&"); - - // Encode naked <'s - text = text.replace(/<(?![a-z\/?\$!])/gi, "<"); - - return text; - } - - var _EncodeBackslashEscapes = function (text) { -// -// Parameter: String. -// Returns: The string, with after processing the following backslash -// escape sequences. -// - - // attacklab: The polite way to do this is with the new - // escapeCharacters() function: - // - // text = escapeCharacters(text,"\\",true); - // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); - // - // ...but we're sidestepping its use of the (slow) RegExp constructor - // as an optimization for Firefox. This function gets called a LOT. - - text = text.replace(/\\(\\)/g, escapeCharacters_callback); - text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g, escapeCharacters_callback); - return text; - } - - var _DoAutoLinks = function (text) { - - text = text.replace(/<((https?|ftp|dict):[^'">\s]+)>/gi, "
    $1"); - - // Email addresses: - - /* - text = text.replace(/ - < - (?:mailto:)? - ( - [-.\w]+ - \@ - [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ - ) - > - /gi, _DoAutoLinks_callback()); - */ - text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, - function (wholeMatch, m1) { - return _EncodeEmailAddress(_UnescapeSpecialChars(m1)); - } - ); - - return text; - } - - var _EncodeEmailAddress = function (addr) { -// -// Input: an email address, e.g. "foo@example.com" -// -// Output: the email address as a mailto link, with each character -// of the address encoded as either a decimal or hex entity, in -// the hopes of foiling most address harvesting spam bots. E.g.: -// -// foo -// @example.com -// -// Based on a filter by Matthew Wickline, posted to the BBEdit-Talk -// mailing list: -// - - var encode = [ - function (ch) { - return "&#" + ch.charCodeAt(0) + ";"; - }, - function (ch) { - return "&#x" + ch.charCodeAt(0).toString(16) + ";"; - }, - function (ch) { - return ch; - } - ]; - - addr = "mailto:" + addr; - - addr = addr.replace(/./g, function (ch) { - if (ch == "@") { - // this *must* be encoded. I insist. - ch = encode[Math.floor(Math.random() * 2)](ch); - } else if (ch != ":") { - // leave ':' alone (to spot mailto: later) - var r = Math.random(); - // roughly 10% raw, 45% hex, 45% dec - ch = ( - r > .9 ? encode[2](ch) : - r > .45 ? encode[1](ch) : - encode[0](ch) - ); - } - return ch; - }); - - addr = "" + addr + ""; - addr = addr.replace(/">.+:/g, "\">"); // strip the mailto: from the visible part - - return addr; - } - - var _UnescapeSpecialChars = function (text) { -// -// Swap back in all the special characters we've hidden. -// - text = text.replace(/~E(\d+)E/g, - function (wholeMatch, m1) { - var charCodeToReplace = parseInt(m1); - return String.fromCharCode(charCodeToReplace); - } - ); - return text; - } - - var _Outdent = function (text) { -// -// Remove one level of line-leading tabs or spaces -// - - // attacklab: hack around Konqueror 3.5.4 bug: - // "----------bug".replace(/^-/g,"") == "bug" - - text = text.replace(/^(\t|[ ]{1,4})/gm, "~0"); // attacklab: g_tab_width - - // attacklab: clean up hack - text = text.replace(/~0/g, "") - - return text; - } - - var _Detab = function (text) { -// attacklab: Detab's completely rewritten for speed. -// In perl we could fix it by anchoring the regexp with \G. -// In javascript we're less fortunate. - - // expand first n-1 tabs - text = text.replace(/\t(?=\t)/g, " "); // attacklab: g_tab_width - - // replace the nth with two sentinels - text = text.replace(/\t/g, "~A~B"); - - // use the sentinel to anchor our regex so it doesn't explode - text = text.replace(/~B(.+?)~A/g, - function (wholeMatch, m1, m2) { - var leadingText = m1; - var numSpaces = 4 - leadingText.length % 4; // attacklab: g_tab_width - - // there *must* be a better way to do this: - for (var i = 0; i < numSpaces; i++) leadingText += " "; - - return leadingText; - } - ); - - // clean up sentinels - text = text.replace(/~A/g, " "); // attacklab: g_tab_width - text = text.replace(/~B/g, ""); - - return text; - } - - -// -// attacklab: Utility functions -// - - - var escapeCharacters = function (text, charsToEscape, afterBackslash) { - // First we have to escape the escape characters so that - // we can build a character class out of them - var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g, "\\$1") + "])"; - - if (afterBackslash) { - regexString = "\\\\" + regexString; - } - - var regex = new RegExp(regexString, "g"); - text = text.replace(regex, escapeCharacters_callback); - - return text; - } - - - var escapeCharacters_callback = function (wholeMatch, m1) { - var charCodeToEscape = m1.charCodeAt(0); - return "~E" + charCodeToEscape + "E"; - } - -} // end of Showdown.converter - - -// export -if (typeof module !== 'undefined') module.exports = Showdown; - -// stolen from AMD branch of underscore -// AMD define happens at the end for compatibility with AMD loaders -// that don't enforce next-turn semantics on modules. -if (typeof define === 'function' && define.amd) { - define('showdown', function () { - return Showdown; - }); -} diff --git a/gsoc/gsoc2015/ideas.md b/gsoc/gsoc2015/ideas.md deleted file mode 100644 index a22a49e6..00000000 --- a/gsoc/gsoc2015/ideas.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: default -title: "Ideas page for Google Summer of Code 2015" -show_main: false ---- - -# Ideas page for GSoC 2015 - - -Browse ideas for the following projects: - -{% for page in site.pages %} -{% if page.ideas_team and page.path contains 'gsoc2015' %} -* [{{ page.ideas_team }}](#{{ page.ideas_team | slugify }}) -{% endif %} -{% endfor %} - -For each participating project, the ideas are organized from easiest to hardest. - -{% for page in site.pages %} -{% if page.ideas_team and page.path contains 'gsoc2015' %} - - -# {{ page.ideas_team }} - -{{ page.content }} - -{% endif %} -{% endfor %} diff --git a/gsoc/gsoc2016/ideas.md b/gsoc/gsoc2016/ideas.md deleted file mode 100644 index eb6c87e2..00000000 --- a/gsoc/gsoc2016/ideas.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: default -title: "Ideas page for Google Summer of Code 2016" -show_main: false ---- - -# Ideas page for GSoC 2016 - - -Browse ideas for the following projects: - -{% for page in site.pages %} -{% if page.ideas_team and page.path contains 'gsoc2016' %} -* [{{ page.ideas_team }}](#{{ page.ideas_team | slugify }}) -{% endif %} -{% endfor %} - -For each participating project, the ideas are organized from easiest to hardest. - -{% for page in site.pages %} -{% if page.ideas_team and page.path contains 'gsoc2016' %} - - -# {{ page.ideas_team }} - -{{ page.content }} - -{% endif %} -{% endfor %} diff --git a/gsoc/gsoc2017/index.md b/gsoc/gsoc2017/index.md deleted file mode 100644 index ee5988b1..00000000 --- a/gsoc/gsoc2017/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2017" -show_main: false -season: 2017 ---- diff --git a/gsoc/gsoc2018/index.md b/gsoc/gsoc2018/index.md deleted file mode 100644 index 732d0439..00000000 --- a/gsoc/gsoc2018/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2018" -show_main: false -season: 2018 ---- diff --git a/gsoc/gsoc2019/index.md b/gsoc/gsoc2019/index.md deleted file mode 100644 index 550d851b..00000000 --- a/gsoc/gsoc2019/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2019" -show_main: false -season: 2019 ---- diff --git a/gsoc/gsoc2020/index.md b/gsoc/gsoc2020/index.md deleted file mode 100644 index d23da5c5..00000000 --- a/gsoc/gsoc2020/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2020" -show_main: false -season: 2020 ---- diff --git a/gsoc/gsoc2021/index.md b/gsoc/gsoc2021/index.md deleted file mode 100644 index f4ff6b35..00000000 --- a/gsoc/gsoc2021/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2021" -show_main: false -season: 2021 ---- diff --git a/gsoc/gsoc2022/index.md b/gsoc/gsoc2022/index.md deleted file mode 100644 index 49fc305a..00000000 --- a/gsoc/gsoc2022/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2022" -show_main: false -season: 2022 ---- diff --git a/gsoc/gsoc2023/index.md b/gsoc/gsoc2023/index.md deleted file mode 100644 index 251b92e2..00000000 --- a/gsoc/gsoc2023/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2023" -show_main: false -season: 2023 ---- diff --git a/gsoc/gsoc2024/index.md b/gsoc/gsoc2024/index.md deleted file mode 100644 index 8376707c..00000000 --- a/gsoc/gsoc2024/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2024" -show_main: false -season: 2024 ---- diff --git a/gsoc/gsoc2025/index.md b/gsoc/gsoc2025/index.md deleted file mode 100644 index 3e921359..00000000 --- a/gsoc/gsoc2025/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2025" -show_main: false -season: 2025 ---- diff --git a/gsoc/gsoc2026/index.md b/gsoc/gsoc2026/index.md deleted file mode 100644 index 52a139b1..00000000 --- a/gsoc/gsoc2026/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -layout: projects -title: "Ideas page for Google Summer of Code 2026" -show_main: false -season: 2026 ---- diff --git a/gsoc/index.md b/gsoc/index.md deleted file mode 100644 index c0a5743c..00000000 --- a/gsoc/index.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -layout: page -title: Google Summer of Code -permalink: /gsoc/ ---- - -## New to GSoC? - -[Background on GSoC: Start Here!](./background.html) - -## GSoC & Open Astronomy 2026 - -OpenAstronomy is an umbrella organisation which collects project ideas from any of its members. -OpenAstronomy has been a GSOC mentoring organisation since 2016 and it's applying to participate in 2026. - -Contributors applications to OpenAstronomy projects follows the same rules as the [Python Software Foundation] and the [GSoC Contributor Guide]. -We have [also our own guide to a good application for OpenAstronomy][OpenAstronomy Contributor Guide]. - -All contributors blogs are collected on the [OpenAstronomy Universe] site. - -## Quick Links - -* [OpenAstronomy Contributor Guide] -* [GSoC Contributor Guide] -* [Now You Know It!: Getting selected in Outreachy by Kriti Singh] - -## Current Project ideas offered by mentors {#current-projects} - -* [2026](./gsoc2026/) - - -
    Previous editions - -* [2025](./gsoc2025/) -* [2024](./gsoc2024/) -* [2023](./gsoc2023/) -* [2022](./gsoc2022/) -* [2021](./gsoc2021/) -* [2020](./gsoc2020/) -* [2019](./gsoc2019/) -* [2018](./gsoc2018/) -* [2017](./gsoc2017/) -* [2016](./gsoc2016/ideas.html) -* [2015](./gsoc2015/ideas.html) - -
    - -## Info for sub-organisations' admins - -Whether you have been participating for years or this is your first time read our guide for [sub-org admins](./suborg_guidelines.html). - -[OpenAstronomy Contributor Guide]: ./contributor_guidelines.html -[Python Software Foundation]: http://python-gsoc.org/ -[GSoC Contributor Guide]: https://google.github.io/gsocguides/student/ -[OpenAstronomy Universe]: http://openastronomy.org/Universe_OA/ -[Now You Know It!: Getting selected in Outreachy by Kriti Singh]: https://github.com/kritisingh1/numpy/wiki/Now-You-Know-It!-:-Getting-selected-in-Outreachy - -## Related Organizations - -OpenAstronomy is closely related to other organizations that support open-source scientific computing: - -- [NumFOCUS](https://numfocus.org/) - Supports open-source scientific computing projects, including many under OpenAstronomy [and also participates in GSoC.](https://numfocus.org/community/google-summer-of-code) -- [Python Software Foundation](https://www.python.org/) - Oversees GSoC projects for the broader Python ecosystem [and also participates in GSoC.](http://python-gsoc.org/) -- [TARDIS](https://tardis-sn.github.io/) - A radiative transfer code for supernovae, [also participating in GSoC](https://tardis-sn.github.io/summer_of_code/gsoc_start/) - -These organizations collaborate on various scientific computing initiatives and GSoC at times. diff --git a/gsoc/suborg_guidelines.md b/gsoc/suborg_guidelines.md deleted file mode 100644 index 5ab1ac23..00000000 --- a/gsoc/suborg_guidelines.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -layout: default -title: "GSoC SubOrg Guidelines" -show_main: false ---- - -# GSoC SubOrg Guidelines - -OpenAstronomy has been accepted as an umbrella organisation since -2016. We will keep applying every year, but that doesn't mean we -will always be selected. If selected, we don't know the number of -slots we will get till the contributor selection process ends. However, -it's our intention to keep the process fair for the suborganisations -and contributors. - -## I want to propose a new sub-org, what do I do? - -First, we recommend you to carefully read [Google's notes for first year organizations][Google-notes] and -[the PSF guidelines for sub orgs][PSF-sub-orgs], which provide a general idea about the goals -and concepts underpinning the Google Summer of Code program. -Then, you need to be a member of the OpenAstronomy team. That process -is simple (and free!). You need to be an open-development organisation -and be related with astronomy. Then make a pull-request to [our repository][OA repository] -adding a logo, a short description, etc. -Follow the instructions in the example at the bottom of [the `memembers.yaml` file][members PR]. -The steering council will review your application and give you feedback. - -Once a member, you can start the path to participate on GSoC! -First you should get familiarised with the program, [Google's mentor guide] is -a wonderful resource with detailed information of every aspect of it. -You need the following: -- time! How much? a fair bit. -- ideas! How many? One is enough. How good? more about this below. -- helpers! You need mentors, at least two mentors per idea. - -Let's look into that in more detail: - -### Time - -The program has a few deadlines, and Google won't extend them even if -their system is down closer to the end. They always allow a fair amount -of time to submit whatever is needed. To be on the safe side of this, -OpenAstronomy imposes a deadline of one day before Google's. You (and the contributors) -will receive a reminder from the OpenAstronomy admins before such deadline. -If you fail to meet these deadlines, your sub-org and contributors may be affected. - -Besides these deadlines, as a sub-org admin, you will have to keep track of -all your contributors and mentors, following how they are doing with their projects -and making sure they communicate regularly. - -### Ideas - -Normally organisations provide a list of ideas that can be done by a contributor -in approximately three months (working full-time). Take a look at what [Google -says on how to define a project](https://google.github.io/gsocguides/mentor/defining-a-project-ideas-list), -then look at [other ideas OpenAstronomy's members have proposed this or previous years.](./#current-projects). - -To add your own, you will have to create a pull-request to [our repository][OA repository] -following the [template](https://github.com/OpenAstronomy/openastronomy.github.io/blob/master/_projects/_template.md). -Take a look at [how others have done it before](https://github.com/OpenAstronomy/openastronomy.github.io/pull/182). -The admins and other members will review your ideas and provide feedback. Once -done, they will be merged and displayed on our website. - -It's also possible that a contributor comes up with their own ideas! That's OK, the -only limitation is that either the contributor or the admin will have to find a -mentor for that idea who is familiar with the programming language, the repository, -and the idea in itself. - -### Mentors - -For each project idea you need to have at least **two** mentors that are committed to participate -in the programme. The mentors need most importantly be familiar with the repository, -normally they are real core-contributors, they need to be familiar with the idea and -have some idea on how that could be implemented. - -The mentors also need to have time for the project. We expect around -10 hours per week (not only to mentoring, but to the organisation in itself). That -time varies depending from project to project. But a minimum they should -have a hour per week to discuss with the contributor their progress. This can be done -as a 10 minutes per day, or as 1 hour video-call. Additionally, they will need -to review the contributor code, discuss with other core-members to tell how the project -is evolving, etc. - -Why two mentors? Mentors do also need a break. They may have a conference to attend -or simply they could disappear from the project. Having two mentors will help to -keep continuity to the contributor project and brings more knowledge to the table. - -Though we are not too strict about the availability of the mentors, we suggest -they are at least one hour per day - in a non-crazy hour for contributor and mentor - -at the chat room of the organisation. So the contributor can ask the questions needed -on the organisation room. This can also be done via e-mail, but we believe the -contributors need to familiarise with the rest of the community. (Plus others can -help if the mentors are unavailable). - -Oh, and yes! you as an admin can also be a mentor. And don't forget to tell -them to read [Google's mentor guide]. - -## GSoC starts - -If we are accepted... what happens next? -First, have you read the [mentor guide][Google's mentor guide]? If so, take a -look at it again as a refresher! - -The application period for contributors is open just for two weeks. However, they -will know for more than a month which organisations are participating. Even -some contributors start to show interest from way before that!! The main purpose -of the programme is to bring new contributors to the organisation, so the more they -engage the better for your organisation. The dream contributor is that one that becomes -mentor in the following years. - - -### Contributor application - -Contributors will apply via the [GSoC portal][GSOC]. If it's not there, their -application doesn't count. OpenAstronomy offers [a template for the contributors to -apply][template-application-wiki]. Some suborgs require they post publicly their application on their wiki -(see for example [SunPy's](https://github.com/sunpy/sunpy/wiki/GSoC)), others -don't. In any case, it's good to encourage the contributors to share the draft of -their applications with the mentors, so they can improve it before the deadline. - -OpenAstronomy has [certain rules for an application to be considered][contributor -guidelines]. Familiarise with them to be able to inform your mentors and -candidates. - -### Applications evaluation - -Each sub-org will have to evaluate the contributor application using a shared -document within all the mentors. The OpenAstronomy administrators will -share them with you. There you will grade the application, the engagement -of the contributor shown so far, the quality of the pull request to the organisation, -any notes from an interview you may do, etc. - -### Slots allocation - -Based on the numbers of mentors and outstanding applications your sub-org -has, you will ask for a number of slots to the Open Astronomy administrators. -They will collect these numbers from all the other sub-org and request them -to Google. - -Google will then, after a few days, tell us how many slots we get. Nobody -knows them *a priori*, and they vary considerably year after year. - -If the number of slots obtained is smaller than the requested, then the steering -council will decide the distribution of the slots using the following points as guidelines: - -- The quality of the contributor proposal. A well-structured and described project will be favored, -not simply a copy/paste from the ideas page. -- What's the likelihood of that candidate contributor to become a long-term -contributor? How has the contributor engaged till now? -- Commitment of the mentors for the project. The mentors need to show they have -committed to the sub-org and OpenAstronomy, and evidence of this will make the -slot more likely to be allocated. -For example, it is best to have mentors that have contributed to the organisation's -code base and are familiar with the language and topic. -- A project that enables cooperation with other sub-organisations of OpenAstronomy -will generally be favored over those that do not. - -The process will be as open as possible including only the admins and mentors -involved in the selection. Remember, we cannot disclose any information on contributor -selection to the contributors before Google announces the selected contributors - -Note that OpenAstronomy usually assigns one slot for first year sub-orgs. -That may change in a case-by-case basis, e.g., the sub-organisation already participated -in previous editions of the GSoC (either by itself or with another umbrella organization), -or has experience with similar coding outreach programmes, such as [ESA-SOCIS][ESA-SOCIS]. - -### Evaluations - -Once the programme starts each contributor has to pass an evaluation per month. -If one of them is failed (or not provided on time), the contributor cannot -continue in the programme and therefore, not get paid. - -OpenAstronomy has also set a set of obligations for the contributors to do -during the programme (e.g., a blog post every two weeks describing their progress, telecommuting with mentors weekly). -If they are not followed the administrators will fail the contributors. - - -[OA repository]: https://github.com/OpenAstronomy/openastronomy.github.io -[contributor guidelines]: ./contributor_guidelines.html -[Google's mentor guide]: https://google.github.io/gsocguides/mentor/ -[GSOC]: https://summerofcode.withgoogle.com/ -[members PR]: https://github.com/OpenAstronomy/openastronomy.github.io/blob/master/_data/members.yaml -[ESA-SOCIS]: https://www.esa.int/Enabling_Support/Space_Engineering_Technology/SOCIS_The_ESA_Summer_of_Code_in_Space -[Google-notes]: https://google.github.io/gsocguides/mentor/notes-for-first-year-organizations -[PSF-sub-orgs]: https://python-gsoc.org/mentors.html#sub-orgs -[template-application-wiki]: https://github.com/OpenAstronomy/openastronomy.github.io/wiki/Contributor-Application-template diff --git a/img/icons/cgit.png b/img/icons/cgit.png deleted file mode 100644 index 40b578606dafc7b63a5e072971f12f735cbf6067..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5427 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 SC->hg0HC6%sqjG#8u~vnR__V` diff --git a/img/logo/logoOA.png b/img/logo/logoOA.png deleted file mode 100644 index 3dc2f989f554543232aa41082d080f39dd688980..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 309171 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 z z#?GoGjz8IP{^`dr@cOqApsRZl_%aZl1N3(o+S10LYo#pDSlpX6iMSDb5Rr(p7Vo+) zys6cW4YXfH(POXjI;#Arn0-Ggdw~>`T~xYW;Z}v4CVg6w?>-2-R;RD#<*Ar6%o{)l6}0-oK`e3%2j)^J=G#&Cc%v2wu|osQb@nDoRH7<|15z%P zc^SFpiBri?l~UkZDzzp;NEp6&unhB3m~$mnVVVl_Y#vrYgc_N~2^9~n2*qV&Q34UK z?6bgSnfbJ2&e=GR%6WuZm14qD3)i_3sM@HYn)>x?qx=P*ukT_aY4CFs+)I7mLP2(Y z&x@N|zCDlpAMCwplPpgaCrG^m=bqE)j8#yFU1d$gCa!Bw>IAX}Vz-HFcNVEBv_o`#$fN=Ym+r zaSp!uJjL#RS)9vaoGTos%4vaGj6a$GrwvlF71os@-Rx0oykgqzH!F~vT?JS3v{|Os zg0~X3)3AEOOd;4?Q zo<|FeXhqY_HyFwK9IP1K{bO{L`@>aJs%a~3E0N5W8SMtrI5xuCE(-QCZ)158UJ1Q! z1z~Qr-IfQV{N}>7k=6ExtBtCbEk|0mnqRNFfm@o`GH>tcT7*|z==L~7=!PEiNZp#J z1v95>LGmeQQc`ZoV?c=f+%fmajfSK-o6Yk&m8<}^%+Gn;UEED z_l3i6R-XUp^j(Sl|5<^SzIDknzW(pqeX_{b9j|lFHN)9Owx5Hwd)Av#e)h0cJ@rZN zv&gQRzZH@11MhZS{)fO1%zaPLHTx{mi-_K-$i5Ty$(xcwA{nVu#vI+MwuWNpgu@uB z>c!&|y{fYNE;{VHKEBrkImam4Qb0+%9G#VEQ$@GVTe7krMlKfKdP_-K46F+C z;w&aq*7T$hfEAA}+AKP{$Y>VshDg*xoY~-f7LJpXiOl8w16(YeEYkv~;*=UiFri2j zci~Q2Io|EDbj^G|A{<1cFsqPU$OKHpO^}*6mjyvc!3K`Pufl~3wN5cM*g6(szg`2k zd0vd!j5V(_L}3ZnJJdRkrz3NLuEvGBl!{cNPR3;}2m{~0{|8K$3#BZvqpOVohtr{$ zB+ey@;q$ccyt1!n<5Y~6CP_7mI3Oan(v3D1P$UJ~R7Bb3#A83uH;-|jlwO6g&pg}> z3`1f+44jMe;j}Q#MlJC5XMJcKtTeT|4XUaED#a+X#6jYOS4K#91yaSxZ|X-nF856@G<* zk*!!`3rJHeo3+D$ZjWL0Z0G#}?T7GP*YXPol0b4kw&$K+#X3eR*CmSO`G^itK)Z*> z@FMqp^F8M{WUK{Rm2x_@$FW3c20<*_3hK=ipq`FV=!X#`o^!oiwy8pQcaP1DuqHx1 z9Vss#uRG_~Re!saUJozf!S?NauBDPB3V3dZr&1c!Waw||@|8U1W)Y4ftVKFCxQT1* zpiBFHZry#4`{bp30nCy+a1)Dgj)~_#`ta)F{@MRBvj0ay{~28VEPi61{`mu!KbyWQ z#s44KLHo?NWrngPDy&Qm*_zl872g!)bqC$LX577DJzWKQgfuTEirxe7-TlttSC32C zJ1mk^DxSsZJ0tbt++|@Acy{Gpja`a_Bvp&OtqLa#K6O?&BqvK#ezm;jzH@S3;Ul5u zonwK<(!_5jurv;76-X&Cm=2taQMgcIdrL|}s^L%0B~qng&>zLQ)G$B`-fXxrl0M_q z>PQ7`InlcvyuAZXa4E|1=)Api-oFW9+{Xp1#7LSNVHb)pkT{xgu5lmUl;j~`vN#+_ zfKrk}u7M*}7xuYhS|(E3lk*)u2hpiW9D-7gy|ky;kLKn~caxnZyx|bT2nYZD8LIoG#DoyUasQ z0iMCR)5NhI+EkSxCGPW%FV06^>cZ^94W(+Nesg}cx78ftCz~!!VXW7}+&aeFy=raZ zE^D3F>hE1Mq}R-6D+P6@l*oTxe*Sd`(E9$>4%TZS?H;ZoE}OA(eSE&0VEF(#knTQ3 zTd>8tht_Y2-$JFmY$|7Md*>}EWZgG+-7D|*>ZP_)$ZG*!J;~ovqSwoXe0LY4{I#oX zzHMoOI*o7&5MlZ7HTnMW>WN02YzO8@2^^>o~u)c=d+|-Qp&l!e3g0o2cM+7PbVwo9ys{rtC;V3ao+v`*mMUd zPyhS~9Qo#d`{{Qj`S1IPJ6{D~lA;!WOO-7*duAH4Q@GKSwY~F74pVo}9uAbp2y~Ru z#NRmn88C{-TNmyT9v$9+_ZjqQ81$cf|5tRGE)=WuIQs;&hiw`tNd0@PMU|KG5dr6quo;jtfP0E|iN!uQL-Aj9eWxESW6N_0` zmX=78S|hBA36~j`0{c#R*bDnR77QezBWo2R=VxJ2MZ-%^^ez+O(JZcMs7WdmLD-?cKE&WLdMUo8YcQp+*ufQ=wQzQHncBJz_e| znF^d{V_rP0F{VfrF3Z$Z?G^_Uk4c~+^bL3-lC}}KwUKI)j_Sgwk!F@u=u{a~V%Lq_ zk54GhJkK1@3#Ut=R>do1j7~#sEea+^(u_*R9FEh8FVnw>&*R$Rm9mXSR~+R!;+EFU zd9C3uUa4T0O9;W*&a@n#BV^+yaAV_9BcyS}=9zjvZaZ#o1x*`mt9y8aT3;1s>GtHq zeRT5E%UV659wT!+51aqEyMK6vy4-fNW|ZSgByhD6dpX8IfwrHnmowU?2P>8oGxBbK z9r@=dnzk(1<%~Agx8zKDd3m)iD94wLB6geiymsL>U4nQ9@!IyoHob_ILa@?97?y%# z({|I+U0``&i~;%w)fxn9rW#}`)0p<8xwiE*7-|R+p83Kb7W)@hPHz~fb0=}2fPCwMdVWm z1-HY4Lhh32uROhxAAR*?%9xTS#Mu0zxH^p)bsn90y za)G%u*rLMW?g7gKrCbp8HWG09d=1}Ni%k&k<1vKY$jPouHK<@Gi*62=AXU{k-87nK z1EvW3LAc*LyFEykaLJsPne!5l_i!iZPN9pRC#y!UJ*8AG=9}f*8f;^!5h3Xg2^ z&CEi~RYTmRDzHRnr`C4BZiqQnD$5)qwoV5I-7%LCnZ-IVKqAvpnHQ(j#8N}}(3?^g zV=9$Sb`0G}sRcJDxsqKNEs-Ro^ff$wO;nYlqppAz-VD)ssTxD-$udx_@O(aVnipy@ zmTFW>)HYpF6_Nzf)Wj(gpP5dSYK5Oo|2@mc53l&ow#=K-__oNc1tY{_;|3E6e{*Wk zl9#Q3)zdc-`?&2t8`Ha#ZST8Tu)OV6RnZho@KHuCT8A0i*RvCG%{ zEYBa26r@$kNX>t2Si5l-Jz-PGLpx3 z%G)vi=;L=q`tNIj{#N(Ab;>tV2D$E}WgBO|Dh}I=D0rHG>%TdUR#|OLD z#8Qomc_@k7SboexYQE)FC}wG6g-{LVW#+P6IF?{zr%uTlg0WT0;q5l9d1y@>SBaf+ zg>wm-SE+4hzIGLUeX65x3|SlJ4l!j#?|KjwT^vJW66P_=oqO@Q;7+n_SHJ{P>J(yq>PgjK>JL zMoLq$P>72;nM7`-EwxA#$qocKLq)Lyb1}RKVnV0FAi{`{%@B+(XZAU4Q>8#PMNAn| z&wjY)>yIC!hPt7yNZYkrjnVdG1}3B`OiSUsIOsqzqb{XomkR1iR~(f@sS#8n8eJu+ zL%iS~qKK@`lB$)(9YZ)SN6yniU8F@>w$Gg8IAyehUZ+vCs|tNe>{Cx~@aN0_&{B}n z>uAO%Vp@et+nIQ2p%ZJs#5y{ir?}X*f@;egKbWg8`CB5URqb3)-$Y{7mPQ53^9ROH zJ|pe-c&$ws<)psfQl@N~vH61ZhZqZ`vE@Gx@x7+kMcS{O>-s#sEYP~iNbowNUEiKx zA7f_sEyH^2dix=E%4V(mZLpM<^tJA^trT)&ny-80JdD(3+2~?xOlL$)2GI;n^p8)k z#BZ7#&8_bvv_56LwvNB85Uwd&5}k3Ic4*gahaF%`?pk#NY1}a!_LMn%;k6yA%pEf) zcfsu*b_1z-;JvB%0hXx+tdxqyK}~Az1^|<5mXCJ;R&3_*Yw7s@kt^4My&Ty^I zG3oubNDKl-(!w*6i1Y}9yAOnldzVF?`aVA{W(Pr@MC6CSort^zc|sUs3=T!zW-4wj z2n?$1k}`QfHB>@ORm@v)^H3=hW7;7LeG29_8l=NWRU!H~|-r^L`D zx<154s*x|f7TzeLA^xf>`qMS6PqQO6foIH&p@U(B`vZJ(2X{LO!WfQ;(2sEU5MRAL z=8{6yJ=Yd{i7}?0B)`HJC*$MgV-%&BI#a6z9Hl6a`%kDoF$M_dAxlFr-9r z;Xi)-oTJx<9E~%XH?SAI@!m`X;8VfjY zh6jH8AN(Gd<-*tVF%DfCosXml$Dobg&7?swYUl{us8*?qaXwehle08Gw6|R~%?fn^ zj_slg!p<{$>-l#de|NLqe0$6(Id3D;t+3wUJZ}@3+^u^ z743J}dn+g&L{ z?Sf(R9QW6X^9D9)qu?|Qm>FUguSKm$?pQv29V2)%^5JeP$aS7$)zb2!*B$U`r|J%O zl+!7^(=7~S%aLx~`FcR`S{Oh53@>#%1g!Cwn~HuD?b(*{wF=bMLTqIr?RM>bOj|7F z+ErgOxCd&jS2aJ)qDYLnbIvU!r76r)dNuC08p6CL8lx5AY;h2%n!CYENut`PaqKju z1;I4uPc`Rzo9Bb5K8dEB#$EDS_S*IL+V9+!*`z;=Hoa(m__Q;VgjbRAEpq?cBhP>I z@w@W;_oYC0uRtTKwW?L3SN>=DmLP21H(!G?U=@ZXhoK4KMqr1K$K1Vn_x9#>_?uS z-f}#j0)Ns9;+U_a@GNbW-YI5A!D*b5t&>Mjw_kUU7t7qY~2%^ICW#+^2!k5R-F@?npL77S< zSGfyQshpMz#pl-PBsvV&KzN?&#LrJ3c(y`m5&=W7T9E~$#6EY>jzJZ33xQpRL!UTw zLf0!@7RD4}t0LYmxN+DCn-=sE-eM7_ONpI!Or=nYab6b8B)sPyYU@%<6h2mBj=xco?2Q28zuLQb`Co z?J0BRbY7TB=LJgT&(pua*D-Y4_pZg@>J#pMF#@qE zf>-#3*8q3e6bfx$PPj{CHf!3zBhr$cB0Z~h?ENlw@@^sgl0-cnsq+-w^X023zFwmU zviHC_nf7|GBkaieUfQ%{-Xa<(Vd;DzB^qmcV#IL;6DHcfd^FHi}2LAB0hj8MOv5>tGzgjFe>a6 zb~y|*!d1EZbl69Hq!%PRyCI55glAN;3dt8#J;E|_h{vi3IYogMAs7J?YGQN!#P%xiVYODJaYw#;iq3frXy|*8bvJ#CZmx~I%jsq7y73D0 zSC9`de-jp~yo>#F>cV!Fx~=$8FXa9Gre0pX%xfm|HnLxBV69k*$d+wQt(y%Bpd6pc z`$GhIG%?(59OtXc&$w$5n@vc!62V&71nzO$>#iQq?wSj|W=~7*$j!30F}2q~5VtLl zy1ReaASvr@YCmj`FO9ovP{=UE*L5Ay?r$BbuO9XFy)G}$@$YXzGi}eDa}MEHyL_e` zVwZK)?fA_;I*NB2xhDb(T3GpxAfh^o>Opeu(l9(~N?BBJGZocN`(8wJ(7xZ>x1N#Q*f#; z7GCGYV)T5PTY+BU>vx`d=1vl*#hC<(NW3qJ(x zWK7E42z}?6Nsz`CSgcSaajC+kgn)_K3b{l#N<&ZT+RaJ`t5k$pqKI2lI!l4`QmIA5 zB4tk2Ol>~su~+W*1Bcx}TssUbG3daX-2nlnrC<%CmR-myeDCo`{P^9cycrCy3qo+f zwfWMgs?ia9qPB&uHmHb83c(oxC=rQifo;OBb^j^x`;8F}uuB7Xea~SSm?@AXyv;e0 zRp}%#ND8r^$LnKtV&7$UU5_Q`+rHH;QEbMG({}?^B9O#oJ=jF&uaaO1U$+v|lK*Ib z!1Qw5#-8iNTyHqg8@6%{saRFNxBP9@u(dU%vbDYFDh6ABHtYF#^*uMC)tXWzDMu$f zpJTTy-9`|z>4h}xwq3QIzCiMhyuYV^dUL%`Gt%x5#j&MKt<&i0YO= zWF8Qclma}HQhK$IUUQ{$&ey;Vv(!}S-u(7ebJx3BuelpU)4ffXous@^bmT;CSa-OlL41s@KJwPp#KJiS&4<_-?V%Fc7aYev@l2bHpKH9 zAIV?he^v>pS&9x?1`!#6gNWRLKOnppI4JC0_<=c3_v849nH|7;QIaWnJsNgRgp}H- z*$GzYo7BeK8Tv*T>%@>`Ov_B)C7vGd*o_$}XU47xQw83=dCQx(pK+ci+?Up6#hx;! z*h5DGk|0T#fyo<2(_pC)J9#NI_(&8C^|(NfDZ2Yz9{`owRA${MAQcx!)5NfoV0x!@ z91+DPXQdyFoP}wE%Ndp>L{CeqJkQ5~mAOz%SiIpmTi$f1(bdH`H;SflA~L<*i$d9b1rUl+J!gWZ!K-|icfAhVzFn*B8b~|zSNd1w(k?WE>k>~*S!cm zi7wNG4T)ZJAn;TfbD~d)logZ8;*~^?W}(^~0zr*HklIxIIdx>!?RjJp9gtSLl`8-H zm;aP{I=u>4*n$~00rXAx+&b*_`#N1(Fo$Sy(+uQ`4nU0vXFNB>n^$0P(-&q zxVOEqG@rXPb@p1g?Q$lyqMLX7*yZI+J-uuNd$m?+*D<_(cePQqLzvza-g112&VRFy zb=x?8ogC!W6?+pn&T|R4Nm9DL+w51RG`++MGBI1h6YFTlHD|}XOXIl5e6+G;4>6gh zaVIvmvDCb<*bX6^cuee-X={H{R%P5x847UsW6 z=e(v=eS5V1t&of+{(7D5+)A`)vq<~aYp;(giAdKdVr%!jZ)5NG0`FbeA-o6P|K5*( z{pmOV!9RNc^Pm4rC$9-Gmu(9kKln}LgT@H@y$e6Q-!r62PR^K{5;qAZmC)jb6Syu% zK70R`!~H!k=VJt2C_FxXkC*cYDs5le?x$;=w6!CL3tXDIS(|lgYK@K%1-dNpBYc>-1hjLgc6zLO{}JjElyLV#;&(IJrU1Xtsq2P z<=`D-%AtHuncknV(@%*YNukRlDRr?ox2rhI+Q%sqK4fWLxb<+6H4aKyqS$sx=+qgK zFsQL>>i97WcYO*WTFwlqV@Pq3NMw41eM;_6W|MBa|K^ZszP2sPW1wcA() zU@Hx4yS4~mv+OJ?L55uB#2!75QnCl)T>w4snsULl}NU!mEGv>?yrB= zNLgtdn|P`Ond{{_e9FUsl^TWlX4JeMK5XlZb+e*{g(~i^PL~$aA?=XRU-!pc@7vAr zd5TWjo#n&V$cEpPje@4l$6U`R((Vv@`_#tRyM2hwYQSIQn%TVFS9f>cI`-j4GY~s4 zZ!w$OSpLQ*EiL#%a;6_gRFzU|D7xFPoa1mOqU`Qsicp(+d>wVKBmQ+CEs+i=qPn6% z^GdMOe&`zE%+t8T%Az*UCONC9j@tEEgi%x_jXQ4&_{q!ijN1{ni$4DDm;T`of2l23 z`M0m)13}QIbhS)I*|Z?X-7~ z@CLXScxTR|fPZ{``S=?@{`E6ivrOz0NNQaa(y-R;0WHAj!teg$f6Q-w`pEzF@BfhM zXDo%1Y!(_33QV18nK1%%e@;NF(pS4W|l$;zV_K7*o5kO)!c7UGP zrzS=tn9RGBa4J?6D-|V?L|AI2*7$u~8p}A?;aPh6+;P{Bv8y1V4Lf?AXO8m)^Z0w0 zWn!VFh?NAI+WX~Lm&x%jaZRZ9-0gvUL8{Q@ftTq_l{iFnIpZnd6PVy#?BlJJEx_X2 zsZ!+3(vqmwjyf)&Hz`Wda(oUu)8T%*kN)u~4ia~FuSWE#*~TR2&1$r=v+Lzd|M;|x zcCWe0&BL5t$8xT5oGZ?AeZ5vyx0OQw__TG-UKYH>A)~vy+g`&ojC6N*TLRVkO085d z$z44EmuJ%cK==42NMXn4IM@t3{2aylmZVnBC%XHGEo&OMzLyOyv)=zLX>5HSUdl!c z8^(d@GF@|}mxa`2=4oa+&*VOlzC~?&l_%}3g~(%%8#Bxvh|iS9aRjuMlGC_LR+gj@ zsnr2Ha<|mWd6txoASIjL-MN*b^@2$57GSaIoPKc$`dtV8SMQkrHp=o})ji*;x3Asu z&9|&-FmZ>^KK+!J<55nhlQzp$<|+zHF`|(K+ykEhpNYtm2z!a{`JEZ}(>(3}?VtR+ zx2L5%CT)-}eSIiUqLb?c_9Eo-iSK>-hOfT)IW-x57yHs-5Rx{)h{mt5##BC@J~CTv z`wE;mJA=H((O$1_0i?b|1i81_;1xul1E0gdtMd(FR7zVIp z)NCywD*!8t1>nM3VNcCtx}fykJ)#3&T#T0s92e(&jt~k@F%G`0F_wf1ebmH7L$%(C zl0+H1p51uhSPRvSTottz;pl7VM@wT;rMNQ9B_JgwPVVO=4iXO??6S6zE@X|j{#4FP zZmAZfvSnD9aTDxUYKg-QU%uoIy~?)&n#$o=A~;8 zlE|<|GhL@tQ9Q+dJm-XZqPnrTVX8=u3uww2(F~He9qE7g=J$iF*7wn&-gaANn@4)3 zZsq+RYhtVD_Ua~7T0659bP_O)Ac&Qh=TJAd5o>w*s-f8cjlFF5@VJSxhPUr1&mW^G z^!+wA4o>!NE3RnTy2RAQ<6D{7tMzDAsjs{5E%2fpPF5jY-XFF=jOe~)+efEy_X~+% znsbbZb8h2i+tR959(Fk$w>|L|vaudmRB&8U53H^0;eazlnM}Z7lC?IwDtZdK$-#rnZvBfFPpfOxO3J*lw!(w5qjL zsclD|QbJWs)(Zs&__(4v`GiY;}2wnSN?4m$3 zARI(^FCytrw|>9M99U_9g`CLY!!0bEpE)b6a=zFk?}VD1n!=`49TpcVx(J~8*Myn2w2K2mYAwwwSX%NDR8j?Iz=Ui7C}Iz!%~Wock1X;PfnR3^_Urd^6{T- zVy3Nw-fUL++G({;a-(ILzZxCKNHf2Nk#zmGGfu;ZT|RDp=kPz&t8yD5j}1)HtX-%! zi_>aPnz#FR4-3?-f_mkJ=ly}MbtK- zO07mMg_M-sbz70vo9-nt)MLsm?&<-Imk@zz5>;=9LT!gB)0|T~M5#@e+Nz6d&H{W8 z;d5Zd{aL&I^ZLcV`mR9#72+@50*C*${#*Sl{57|0trxzQyEpN?m2ft>SHKhea+4krYbB&nHFW49bXyS4M}MP z$mCMsrN$4?{Z4p#5O#Ntj$k>Cro6re#{%pn{ym4`z-gK{^>!t8s=I#2 z-LR(@#g@V!fBrjLcew^eT>Y{7N>rpb#po6n*?o5N|GrKQDw6lGd_?*~ z*rsd=;7A&RA6*vuH}4QlQJkBqSTwz&nrYWX_bWmkcZdWSW!*c6aO$*m%$tY%#wNBY z(>Lo;bd&psdveZ{Qa1rz_?3Ig#}7eRYc{FXDz@&)y>-B=pezC{Le0J=Xsy2T6;{$6 z?zSYbfDr{0CGYne$t?EuOL&vzYJ}+@pW2})HKlm-X)iO6Kl%}OZyq_n95?3p3PV{7 z^NI$&^2K-8v3~Qa+o~>KUo(*?%%!qirU*tUm7Fu>+&@|=Kew;`^>+pO<~wagFJ9}y-~NlE z$ba^B(`)ATtN;7O$KNCL-~Z&(+@;hPt3x%*A~GO6WYM>Gz1&yl-ox|vB*JGzll0c% zokV6qjEICLP7n6MjFq`nJYgVka;Li?A@XneI z3dXLZOO7@aXl=A9U%j^ltQb?dQmv{-HyqMnCuiYoq2hje5FQ_4cLzE+XFR$zgi8^o zB|2zn()Yz-GUZq+$LYj*DU>Rli!fQEmx)GPrALupR2uLpg{aIUw;D6Drt5mUot4#< z`{6G3)fGrRIrUhHEMsprtSlOxYD#oDGxYbIs&R4U#e|oO^E^9WEY3@DoWxz9xX+ox z?umuWr5Z;HRWi9@F&A&RX^#lV>VkTQn{ryP8^%JhNWdCg z`TpT83FYTsea=*!StRh0-9YYkblS7bGfu}JfBsLdKW_QTZBBj9Fb)y7d4uQN1V=ds zNo=+0)OB>+wG^tuCK&T&j&KXj;c=F{S*Y9`Y>I*{Y!H)8QQkV)+ir6cm!(A7?L$@G z)a7gP)H>cqq>YaKm33?tMO|~L^L4b_037R~MOqRXurbKD+iH*H79*PX`%Op}U1&pw zHih}}{Gs7OU#@VH6au??Ik$+^D_QL}q{CW1G;+1JMP5c~V3E85SPWsh#E84RJVzmK zO7`LHyDRSVe2R3k&0-hYgDMF?-v9t007*naR4o8Rm3lgD#k02XkgZR$H7YO|`Tf{k zlX-56w5|sYGf`E^IU|Uxpe?fUmRwgcv-Y{0y_DI_lIBh%=ND1^Mv{IFJlj0~>GFU4 zufOy(u{Mh#Z=LNb&icD3&iOynJ+EVM`Ih(jFCTcXW9@`7ynlG?e(yJaQ~%SKpYKX7 zJK((|2X#7e?jo*O9^Cmgul%YgyDaifMebFQtk=D9-?-V!79Du?eC;$wpo0hxDJWov z*8NJ?;7HLZ#zLF;y-wSXx6#5@c!9s11BrMN)1EKL)Mi*}Wb`!Kt3DbQK$ zyw?zqp@;oJ$SH(IZ|TZt-58pN=z#aifC|oQSX63RNON|ha8D%curdYF+t>gGhS$LVwe4Jjw9;XrRZ7x(2u8AxFi$HY0LUH5L zicv7s!Bv>tFv(QusdQAyfi5Ls5iHv*2P8-KalX5!dw6^`ZmySee6}}Ec=u{2yjgly;hOoYgU04XzEPy#W+Sgf ze;rAuzNhN~%JFKV@GZaat-8IOPuMgCO)DjI7_ZsP%N%3zHU-d>8h2Z-%<@_zWBPL5 zVkB?X*V^}2)pbhSNP4wstwq-6c@xB~O7rFU^FIK(6t*A_Mpn}(t_P8Ig+IG-4McVOO8LsHc>W4E@^_(~`!DI9*FE%WFSNY!JIe+p$xZm2PnUD| z7oY#EdpV!(Be_c62#g~BV9vXWe1iJ-LEgQ+zkhr>-0zMrrwGu{u=#Xt@7!zbAN$r3 z&MiLC91cx|CQU1G$gmqCkRtU_sLi*8$ChE-&L<-DUC-fe&*Fu#@6eQk`s7Z99+416ShwEILSvW}uWxA9}BDmFHk*ktY@QQ13CL>hF1XDUD4LNqO zSWBl`Cjz029z+;(&!CyN`v=Slu7O!CH5BO4&4WqWrVJk^_r9V^;nkImSkVeFcA!GeD2Cll&nfl8Be(h-y&&B zRH>RF4_G&FL2%9Ov!O`pSwxuJfhg8O03o{6(aAt!9nUW;R-s0SNG*oAF_(#t=NF0@ zQ#td;fA+(zK(7{|R}q9aEN)e46Ib0v!0sLw{^^2U&dp=IL-Wu$+&k>_1wsL>+~#I}RZ z%GZ|MMZs@q(={aI%6@2v5qC6&?^(NGkoz)6@z+E>pXeVRuXeS0Zd~n^d)~((;Cy;D z_Fs{p^>Wz?|0W{4`CP0ArR6fU&q-p~_5ZmdEpBnTQ&nlvxNh!hrI_Yy?R8#S*ao6$ zZucd=%qQ*p3AdjBr~LlEd*JT3I{W6|oPL=L^p4h~Z6)#VpnH}q@~}TJP0L^Z7yDlr zW6Lk>p;^N)=m{~{P_esWr5EKLB0GW<_T z;=#~b3+|4 zoUCkiC-e31g?*`*Fqa5RXyRKIbIKAUV-@Ifbj~?DLr)0J1jZiv5o!|7?o7>p{IEaZ z>QrWIRf?-Jxih;(LKhOcjv6ENx;SDXB&*PP;PIyPs@&;-YRB2;@Kciz&0H35K_2nC zBvHJ2FpXC=o+Q+jyS!tk15;TLaUQ!pZ-+a6`?KHVpMCmU>|Ob@^B19N_r$4I79!Cp zwPILBsWow0gpYG&s^B$YmZ?=yPjqB1?lC+{Ju|6w#)?XahupoHyApfN>{4!!mEgh^ zVqa~nWBhg~Xq1r_uZiU{OwXimdjt7UK{_rDaJQWcvEAqJKd`<`Y)Hw zXpZsvIxW})U9IvBCUkmXg(iJ$#ur z|M)6`Tlf8`L1u0bJ+E@7Z>AV)64rc~v1;t^cmE|t8o=B1!E34FX4ZAtJ?L%~v!r>I z%L;DxA&t9}oBh0;PhX12n)quEymjY+5MF;K!Vd%<&Dja^{?C8%pTvy=tT$^vcV8kQ(T>C#APVmqj(fAjU6-%Q`xAVaY6S=ks4Gp7b?+(N+X;V z+AnV;nf4KLX%w+)%*9yTnY?1+?1uyI?|#5^nfdLf-{K_BpPs*9CA)e%QH5Yn=rl9P zNUd=6%Gp6A)5(aESuFld@`R;~<^j=;q+vBmbac{zIO@tE9o3yKWpcMl{1a{(MO`B7 zzFT#RDN!V&tw5KQ5$%yQB6%QdCTV8K15U!|2!_rI!s$>^km%gIG)CUD8m6EmvNwJ> z0hpPo?7NYD?nqP~cRTj|j(_{pe-uKe=JVaU>5a4Puj3{gm$~bsQ(I1F>gBu<#n!^H z62L+Xbwav*EB4El?d&ydUBkOi!lu;5#>+QfUw7Lpt*all{q$;G3gOf9rfOabo)B=8 zjb(j10&lnF7Ml01AoczByjFjvxxZ3#M|ba6K6xwB>+W_PSNl3LPkGCUUZ0Ci=O~^n zFk>yeY1~DCN1H~}%cdzqZ)Q7WcV+ zU0*BQHX+-JHeEjxw`&Hy5!&6tSlo=16f2FEpiZMCiSgBW6`o+NJmZ^iaR}S1-SO1v=_aU9XvcC%b2$lp?3g z<*&DFFgH*ogR0yMJc#fJ+`IEBa1iA!Aq;y$_%sP`td_f8 zT>i&j|8>Uwj_1oM;1w;kYM0=k%5#CEv!xvM5mCrjx9Z&l%+vFtYOQN5O23M@rfCq-2aeWf5)_(x3R@+#v&4(pL_E#gBGXL zju#yGL>#RFoJa%Pl{eLn`*i7B*~;UPVTiQNeF2UdC!~ud!CmIa}rYOaTGV*ieK`KYP$f6AW7*`M^1tIRB0C@ z&*ZdYs*t54H9JYtp03-|k9&$&2JIPh2a-t5SDd>MO#`km%8X{cBc~mr10o$`8X5aL ziVJ3!pp|Kk>4PLhW1LJ<3JR&irAJb?T}UOxp@5w6yrZ)4Zah$3`NO~XVeqmW&aoU{ zA}y(rzP7P)>mJL?%eI>~Z=jMn3ghYtUj4v2>{{B=eVZ0(bkD6ouU0H;W8ZQH0n# z0u8=#%Oc+(F8h7U&>pw$dbNk8aYWq1i@YowNi8M`d0Q`}aTn34O=QQ-A!4g?cRNlkRRFrab5ZrW6iHo&5Nl{4iE3OP%&Mp^n)BI9Ig6&BHp5Jn zq*Dy6)B)<}|MKORv4dWT*#396dv3EcUylU#SB=46p+1G1J#K5())9BUDbO7vDLQKT zq|w5D0K64pK>0P``!2i@z|11$*iOJ2+fiRaCp}wpHkXDfA z>QVeW#8-X4B0+^AXZCpro0l4{PRhJimHb{uR~(Ap^7Rb$yD`?%9bQiYm5v{ zqT_b1a1+IO+`r@Ze*O2E#rTusf8xvYH>gBMYjU&w&_vRK!*I{j-8-Hy$JqHwPtu+t z?f5LeDLotLW2O&xC38$X$<1 zMkI$4U5x$EqpB=k__u%hgAL1RODnc*OuBYet3S3JU!Wa4xidf(^8a@nmu zwl2iGhdr)Qn?TBnLrf^sKHlDLKa5S4?9ptV-&%^Rk!wZ!!SCNPU%kBf8rQfBu3B-f zvwMEG4$@lc(_XwZ>}v0Aye-;Nz;3{YDMk8mAa%)$cT;!^yvkH|pZIv=Pu5pzbDtut zO@V#z)ShOCx>a)fYM|Vx)x*AH4sB0tt;^NaHSt+|6IRLtq`G^e|3@8o4oMb^r{B143i%M;%`y*MO9oXNbYtj#>2V!JDS3$CaEdi5^*js_X&AoXs!>QY2SnG2MV zIA5Nbth&gf0q8^9qOV0*RwsTf1(xDt;H5fPV{J&xE~o>F)VuT$gqT{;1(jTl=VhVV z3dsX9#vu?7N>L~#Snv^b6&D1VsN1N6UisMsDw$$|yZ*sbv~poFVcj}>bMaEa;~q`@ zS7Ehv(d|?nRY*a-!x#V08&HA@Yt7W+Il!fbfJB-o&(Gx4BFwq+)5}Lnu%@sNPB9Z7 z%T}(;;#^nG>q17+FaRBc_WWl0g8%ea|2_Wl+bA|P^%{~?V_;OG2e_Yw{$8i z*}L2p@UZct0p{<1+PdUsof{AST+XYHPnQo64}{_Ps)%iD?mb1RbC7Umia+a7fq%V_vMU#d$}M=1hKm-VY4><+tm0)%YeR zyA_PZproNE#6Zb~@iY*kch6-ltwvvoV`e5H1j}nSptPN|xZBl4JU1mL zxx4ar<8Vv$F@dT%VNAqhDdRS2P%bTxx!G?S2N(v3$;D2^CFB%!5q(kLImQ@Uij}m0 zi-4$S{H`@~>fbQsh1%i`!S~N1$@k@AoU@B%Q1wwYl_J(gGJ;hlw@zKfMP13X`L>%U z84uKmsub}~J*cwO%o@BHZuA)m+B#@28dVfRB&%W){r1B^3XxGd{?_Mzoxl4Z{^$J0 z7r)6r`-6YPPs_x2^T+n(LLiW2;C_4{*TQAZlw8qD+m@%6_-#!HC730Uo+urPA8-~b zOZ5?cA37{1Dn3>bNr)!5%$cWvsY~23D@?Uu5-~{_fiCo*fe<=G8-lbOIi`*~bwNR; zVxsiv$k6xPrJkgbSp&cS2cKNURaURXqK!Q*=RMG23vWQ2IZ)hLa4G z%gf%WS#7%xE7<&qS=h6k_wQ9)P!;;Y)2KGJaO>vt<$Nvnw%NRj+mqHSC2LbUZ*(;6 z$KC!U8eCA;M&-ltz%nnG2>sC0k3A3X9_adxuJ?jjO4*M5K6z+r?PVy|pb zTbJMBI0f7?|n_4`yJ^r3r)ppd5D=jxL5}zb& zhn_M`dm-Pxjy7(;D&ynyGab)sHpjm0C?=OfAIaMMKc_%isBP(?!Qu z#rYTIeKr`!fw%Yf{N$^zuXvR7eXW6U*GIWO9_;`6_L18jT3+|yq9Q>tMOZ7m38GyP zQm*x#2=^k~gM49T3_-@#>=4YaRD^*DOAS99!#tX>uj4 z8-CLTUK$H8m$MVeV&hClYhGu6NbX$)#ZYlivKCKf3PFhGu#~m7tovt3185Q_k|iT1 z@3>2KK#H1ijLN6)1`eYlapc4F9xznR4++&f+%7~&!8_^-r3OTlTI#N7&ZW?$1Mf~f z=f^*Rw0eP5WeoQ`pI<1p5>)9md3c7*1oQmlBG5~87P&d|JE@{oScC5~4W)_)RTPx9 zjnFCz+A%5AhHBdYCJt&-iev&F{YXeHh02paf*Fy-Q97QUKk$?HKjG#4$cJFOpU2VEym;W%v@$pBu@QEpyy@r zg6BI>_Rxqe3bM|ZU0AePskXQ42DF&A@%Iz)ct>ovwSM@jJ%O9hv(BKskMzUfAsJ=D z%0vl6d#-m3pZvgq8ymjzCZ~As=C|;Pat-Ow-U(RiD7JM>`{6XilH&FJihnGUkYIuDCZZn z@AuAGZpPNP0=vC8%j?fP=Iv!8vH_Ge6UUyX4^JHKM}~1=YT{qle<_hj&KV7=lp3qq zHmUU`bZkp{KN0jA;~kD-o+}KNbBV*a=IJ7q^C~g+?ehEK&)W`Kf1%^;fQSg|l8qq9>1HbW!y#n|)y- zy^1`D*{^(lcQ=I8ou20TII1L%>2rNeuijGs@a~SchXdbEQ;SLTeRC4GRP_Q~!+UnB zRE4SS%DVvl#?Rhzp<9Npwf8ktcFWFeqXZGe;7xyY_`_PfOK;z+PhK=68?q{?B|@n} zibm>uUp>w6JPT_UK6~i-_0Nv{=CA%1Km6g}=9_PS%tYZ5D%wWeA`ZYO_E@4;{=$x@IORW*us;k_`Xl7k*`TUt)Es)tRS*VWxZDD#@#7DY#_iAeIXHsag$kPz)K0*m@2ArhQ^CjJ;q z;vQ$|2Mj|caY_Rz2A=cmf~;ax6vHP3qmCXUsY;QA;r6Z2Y+YkNa+i{iMXj>hOzIOEWw$q#>B@<=HlnVrW8DB6JJh3f$lLqs^bw6c>HdNB!?)P{i1hbPLaDzuk{L<6)p5I%0AWnYMrk+CKVLn6-Dat$3AYuiD1O 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%0AI|B^*&R4 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 - - - - - - - - - image/svg+xml - - - - - - - - - - Open - Astronomy - - - - diff --git a/img/logo/logoOA_embed.svg b/img/logo/logoOA_embed.svg deleted file mode 100644 index 96efd7ca..00000000 --- a/img/logo/logoOA_embed.svg +++ /dev/null @@ -1,5546 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - Open - Astronomy -   - - - diff --git a/img/members/casacore.svg b/img/members/casacore.svg deleted file mode 100644 index 8ed708e4..00000000 --- a/img/members/casacore.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/img/members/gnuastro.svg b/img/members/gnuastro.svg deleted file mode 100644 index d5a39600..00000000 --- a/img/members/gnuastro.svg +++ /dev/null @@ -1,982 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/img/members/heliopy.png b/img/members/heliopy.png deleted file mode 100644 index e4a5a0259c00ab95e096d7bc5ce371f6cc9162ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36651 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 diff --git a/img/members/juliaastro.svg b/img/members/juliaastro.svg deleted file mode 100644 index fcd05e1d..00000000 --- a/img/members/juliaastro.svg +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - diff --git a/img/members/sherpa_logo.gif b/img/members/sherpa_logo.gif deleted file mode 100644 index 9f5421b5183bed2856573621685c3b647792e6c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7925 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.com) -which is good place to introduce yourself. - -## Contact the OpenAstronomy Members - -See our [members](/members/) page for contact details of all the individual organisations. diff --git a/linkcheck.skip.txt b/linkcheck.skip.txt new file mode 100644 index 00000000..fbe50da9 --- /dev/null +++ b/linkcheck.skip.txt @@ -0,0 +1,3 @@ +# One regex pattern per line. Lines starting with # are ignored. +# Example: +# https://example.com/skip-this diff --git a/img/logo/logoOA.xcf b/logo_source/logoOA.xcf similarity index 100% rename from img/logo/logoOA.xcf rename to logo_source/logoOA.xcf diff --git a/members.md b/members.md deleted file mode 100644 index 9c83779f..00000000 --- a/members.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: page -title: Members -permalink: /members/ ---- - -## Who is part of OpenAstronomy? - -
    -{% assign sorted_members = site.data.members | sort %} -{% for member in sorted_members %} -
    {% include member.html member=member%}
    - {% cycle '', '
    ' %} - {% cycle '', '
    ' %} -{% endfor %} -
    - diff --git a/news.md b/news.md deleted file mode 100644 index 6596d304..00000000 --- a/news.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -layout: page -title: News and Events ---- -
    - {% for post in site.posts %} -

    {{ post.title }}

    - {{ post.excerpt }} - {% endfor %} -
    diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..c35143e6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,8380 @@ +{ + "name": "openastronomy-site", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "openastronomy-site", + "dependencies": { + "astro": "^5.16.15" + }, + "devDependencies": { + "@astrojs/check": "^0.9.2", + "@eslint/js": "^9.39.2", + "@typescript-eslint/eslint-plugin": "^8.53.1", + "@typescript-eslint/parser": "^8.53.1", + "astro-eslint-parser": "^1.2.2", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-astro": "^1.5.0", + "globals": "^17.1.0", + "linkinator": "^7.5.3", + "markdownlint-cli2": "^0.21.0", + "prettier": "^3.8.1", + "prettier-plugin-astro": "^0.14.1", + "typescript": "^5.9.3" + } + }, + "node_modules/@astrojs/check": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@astrojs/check/-/check-0.9.2.tgz", + "integrity": "sha512-6rWxtJTbd/ctdAlmla0CAvloGaai5IUTG0K21kctJHHGKJKnGH6Xana7m0zNOtHpVPEJi1SgC/TcsN+ltYt0Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/language-server": "^2.13.2", + "chokidar": "^3.5.3", + "fast-glob": "^3.3.1", + "kleur": "^4.1.5", + "yargs": "^17.7.2" + }, + "bin": { + "astro-check": "dist/bin.js" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, + "node_modules/@astrojs/check/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@astrojs/check/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@astrojs/check/node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@astrojs/check/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@astrojs/check/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", + "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", + "license": "MIT" + }, + "node_modules/@astrojs/language-server": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.3.tgz", + "integrity": "sha512-yO5K7RYCMXUfeDlnU6UnmtnoXzpuQc0yhlaCNZ67k1C/MiwwwvMZz+LGa+H35c49w5QBfvtr4w4Zcf5PcH8uYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/yaml2ts": "^0.2.2", + "@jridgewell/sourcemap-codec": "^1.5.5", + "@volar/kit": "~2.4.27", + "@volar/language-core": "~2.4.27", + "@volar/language-server": "~2.4.27", + "@volar/language-service": "~2.4.27", + "muggle-string": "^0.4.1", + "tinyglobby": "^0.2.15", + "volar-service-css": "0.0.68", + "volar-service-emmet": "0.0.68", + "volar-service-html": "0.0.68", + "volar-service-prettier": "0.0.68", + "volar-service-typescript": "0.0.68", + "volar-service-typescript-twoslash-queries": "0.0.68", + "volar-service-yaml": "0.0.68", + "vscode-html-languageservice": "^5.6.1", + "vscode-uri": "^3.1.0" + }, + "bin": { + "astro-ls": "bin/nodeServer.js" + }, + "peerDependencies": { + "prettier": "^3.0.0", + "prettier-plugin-astro": ">=0.11.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + } + } + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/yaml2ts": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.2.tgz", + "integrity": "sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yaml": "^2.5.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@emmetio/abbreviation": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@emmetio/abbreviation/-/abbreviation-2.3.3.tgz", + "integrity": "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/css-abbreviation": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@emmetio/css-abbreviation/-/css-abbreviation-2.1.8.tgz", + "integrity": "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emmetio/scanner": "^1.0.4" + } + }, + "node_modules/@emmetio/css-parser": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@emmetio/css-parser/-/css-parser-0.4.1.tgz", + "integrity": "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emmetio/stream-reader": "^2.2.0", + "@emmetio/stream-reader-utils": "^0.1.0" + } + }, + "node_modules/@emmetio/html-matcher": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@emmetio/html-matcher/-/html-matcher-1.3.0.tgz", + "integrity": "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@emmetio/scanner": "^1.0.0" + } + }, + "node_modules/@emmetio/scanner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@emmetio/scanner/-/scanner-1.0.4.tgz", + "integrity": "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emmetio/stream-reader": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader/-/stream-reader-2.2.0.tgz", + "integrity": "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emmetio/stream-reader-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@emmetio/stream-reader-utils/-/stream-reader-utils-0.1.0.tgz", + "integrity": "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "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/regexpp": { + "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": "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": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "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/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "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/@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": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.21.0.tgz", + "integrity": "sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.21.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.21.0.tgz", + "integrity": "sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.21.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.21.0.tgz", + "integrity": "sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.21.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.21.0.tgz", + "integrity": "sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.21.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.21.0.tgz", + "integrity": "sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.21.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.21.0.tgz", + "integrity": "sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "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/katex": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", + "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.53.1.tgz", + "integrity": "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.53.1", + "@typescript-eslint/type-utils": "8.53.1", + "@typescript-eslint/utils": "8.53.1", + "@typescript-eslint/visitor-keys": "8.53.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.53.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.1.tgz", + "integrity": "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.53.1", + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/typescript-estree": "8.53.1", + "@typescript-eslint/visitor-keys": "8.53.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.53.1.tgz", + "integrity": "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.53.1", + "@typescript-eslint/types": "^8.53.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.53.1.tgz", + "integrity": "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/visitor-keys": "8.53.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.53.1.tgz", + "integrity": "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.53.1.tgz", + "integrity": "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/typescript-estree": "8.53.1", + "@typescript-eslint/utils": "8.53.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.53.1.tgz", + "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.53.1.tgz", + "integrity": "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.53.1", + "@typescript-eslint/tsconfig-utils": "8.53.1", + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/visitor-keys": "8.53.1", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.53.1.tgz", + "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.53.1", + "@typescript-eslint/types": "8.53.1", + "@typescript-eslint/typescript-estree": "8.53.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.53.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.53.1.tgz", + "integrity": "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.53.1", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@volar/kit": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.27.tgz", + "integrity": "sha512-ilZoQDMLzqmSsImJRWx4YiZ4FcvvPrPnFVmL6hSsIWB6Bn3qc7k88J9yP32dagrs5Y8EXIlvvD/mAFaiuEOACQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-service": "2.4.27", + "@volar/typescript": "2.4.27", + "typesafe-path": "^0.2.2", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.27.tgz", + "integrity": "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.27" + } + }, + "node_modules/@volar/language-server": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/language-server/-/language-server-2.4.27.tgz", + "integrity": "sha512-SymGNkErcHg8GjiG65iQN8sLkhqu1pwKhFySmxeBuYq5xFYagKBW36eiNITXQTdvT0tutI1GXcXdq/FdE/IyjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "@volar/language-service": "2.4.27", + "@volar/typescript": "2.4.27", + "path-browserify": "^1.0.1", + "request-light": "^0.7.0", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/language-service": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/language-service/-/language-service-2.4.27.tgz", + "integrity": "sha512-SxKZ8yLhpWa7Y5e/RDxtNfm7j7xsXp/uf2urijXEffRNpPSmVdfzQrFFy5d7l8PNpZy+bHg+yakmqBPjQN+MOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "vscode-languageserver-protocol": "^3.17.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.27.tgz", + "integrity": "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.27.tgz", + "integrity": "sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/emmet-helper": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@vscode/emmet-helper/-/emmet-helper-2.11.0.tgz", + "integrity": "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "emmet": "^2.4.3", + "jsonc-parser": "^2.3.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.15.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "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" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astro": { + "version": "5.16.15", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.15.tgz", + "integrity": "sha512-+X1Z0NTi2pa5a0Te6h77Dgc44fYj63j1yx6+39Nvg05lExajxSq7b1Uj/gtY45zoum8fD0+h0nak+DnHighs3A==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/markdown-remark": "6.3.10", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^4.0.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.1.1", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.6.2", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.25.0", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.4.0", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.4", + "vfile": "^6.0.3", + "vite": "^6.4.1", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "node_modules/astro-eslint-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/astro-eslint-parser/-/astro-eslint-parser-1.2.2.tgz", + "integrity": "sha512-JepyLROIad6f44uyqMF6HKE2QbunNzp3mYKRcPoDGt0QkxXmH222FAFC64WTyQu2Kg8NNEXHTN/sWuUId9sSxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.0.0", + "@typescript-eslint/scope-manager": "^7.0.0 || ^8.0.0", + "@typescript-eslint/types": "^7.0.0 || ^8.0.0", + "astrojs-compiler-sync": "^1.0.0", + "debug": "^4.3.4", + "entities": "^6.0.0", + "eslint-scope": "^8.0.1", + "eslint-visitor-keys": "^4.0.0", + "espree": "^10.0.0", + "fast-glob": "^3.3.3", + "is-glob": "^4.0.3", + "semver": "^7.3.8" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/astro-eslint-parser/node_modules/eslint-visitor-keys": { + "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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/astrojs-compiler-sync": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/astrojs-compiler-sync/-/astrojs-compiler-sync-1.1.1.tgz", + "integrity": "sha512-0mKvB9sDQRIZPsEJadw6OaFbGJ92cJPPR++ICca9XEyiUAZqgVuk25jNmzHPT0KF80rI94trSZrUR5iHFXGGOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "synckit": "^0.11.0" + }, + "engines": { + "node": "^18.18.0 || >=20.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "@astrojs/compiler": ">=0.27.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "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", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz", + "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/emmet": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/emmet/-/emmet-2.4.11.tgz", + "integrity": "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "./packages/scanner", + "./packages/abbreviation", + "./packages/css-abbreviation", + "./" + ], + "dependencies": { + "@emmetio/abbreviation": "^2.3.3", + "@emmetio/css-abbreviation": "^2.1.8" + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "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": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", + "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-astro": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-astro/-/eslint-plugin-astro-1.5.0.tgz", + "integrity": "sha512-IWy4kY3DKTJxd7g652zIWpBGFuxw7NIIt16kyqc8BlhnIKvI8yGJj+Maua0DiNYED3F/D8AmzoTTTA6A95WX9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "@typescript-eslint/types": "^7.7.1 || ^8", + "astro-eslint-parser": "^1.0.2", + "eslint-compat-utils": "^0.6.0", + "globals": "^16.0.0", + "postcss": "^8.4.14", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8.57.0" + } + }, + "node_modules/eslint-plugin-astro/node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "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": "^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==", + "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/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "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.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "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" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "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" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "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, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.0.tgz", + "integrity": "sha512-moThBCItUe2bjZip5PF/iZClpKHGLwMvR79Kp8XpGRBrvoRSnySN4VcILdv3/MJzbhvUA5WeiUXF5o538m5fvg==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + } + }, + "node_modules/fontkitten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.2.tgz", + "integrity": "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.1.0.tgz", + "integrity": "sha512-8HoIcWI5fCvG5NADj4bDav+er9B9JMj2vyL2pI8D0eismKyUvPLTSs+Ln3wqhwcp306i73iyVnEKx3F6T47TGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.0.tgz", + "integrity": "sha512-+A4Hq7m7Ze592k9gZRy4gJ27DrXRNnC1vPjxTt1qQxEY8RxagBkBxivkCwg7FxSTG0iLLEMaUx13oOr0R2/qcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/h3": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.5.tgz", + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "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, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonc-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", + "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "dev": true, + "license": "MIT" + }, + "node_modules/katex": { + "version": "0.16.28", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.28.tgz", + "integrity": "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "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" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/linkinator": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/linkinator/-/linkinator-7.5.3.tgz", + "integrity": "sha512-EiJvQkU+sVvmFMwt/4geFlZUe33E89ViZFRLfms/c3FomDEZHnR28ZMR5mWLfZ6DO1tUUtpkpG8fYfP2nbu/Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "escape-html": "^1.0.3", + "glob": "^13.0.0", + "htmlparser2": "^10.0.0", + "marked": "^17.0.0", + "marked-gfm-heading-id": "^4.1.3", + "meow": "^14.0.0", + "mime": "^4.0.0", + "server-destroy": "^1.0.1", + "srcset": "^5.0.0", + "undici": "^7.16.0" + }, + "bin": { + "linkinator": "build/src/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.1.tgz", + "integrity": "sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/markdownlint": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.40.0.tgz", + "integrity": "sha512-UKybllYNheWac61Ia7T6fzuQNDZimFIpCg2w6hHjgV1Qu0w1TV0LlSgryUGzM0bkKQCBhy2FDhEELB73Kb0kAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark": "4.0.2", + "micromark-core-commonmark": "2.0.3", + "micromark-extension-directive": "4.0.0", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.1", + "micromark-extension-math": "3.1.0", + "micromark-util-types": "2.0.2", + "string-width": "8.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli2": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.21.0.tgz", + "integrity": "sha512-DzzmbqfMW3EzHsunP66x556oZDzjcdjjlL2bHG4PubwnL58ZPAfz07px4GqteZkoCGnBYi779Y2mg7+vgNCwbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "globby": "16.1.0", + "js-yaml": "4.1.1", + "jsonc-parser": "3.3.1", + "markdown-it": "14.1.1", + "markdownlint": "0.40.0", + "markdownlint-cli2-formatter-default": "0.0.6", + "micromatch": "4.0.8" + }, + "bin": { + "markdownlint-cli2": "markdownlint-cli2-bin.mjs" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli2-formatter-default": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/markdownlint-cli2-formatter-default/-/markdownlint-cli2-formatter-default-0.0.6.tgz", + "integrity": "sha512-VVDGKsq9sgzu378swJ0fcHfSicUnMxnL8gnLm/Q4J/xsNJ4e5bA6lvAz7PCzIl0/No0lHyaWdqVD2jotxOSFMQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + }, + "peerDependencies": { + "markdownlint-cli2": ">=0.0.4" + } + }, + "node_modules/markdownlint-cli2/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdownlint/node_modules/string-width": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", + "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/marked": { + "version": "17.0.1", + "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.1.tgz", + "integrity": "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/marked-gfm-heading-id": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/marked-gfm-heading-id/-/marked-gfm-heading-id-4.1.3.tgz", + "integrity": "sha512-aR0i63LmFbuxU/gAgrgz1Ir+8HK6zAIFXMlckeKHpV+qKbYaOP95L4Ux5Gi+sKmCZU5qnN2rdKpvpb7PnUBIWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "github-slugger": "^2.0.0" + }, + "peerDependencies": { + "marked": ">=13 <18" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/meow": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-14.0.0.tgz", + "integrity": "sha512-JhC3R1f6dbspVtmF3vKjAWz1EVIvwFrGGPLSdU6rK79xBwHWTuHoLnRX/t1/zHS1Ch1Y2UtIrih7DAHuH9JFJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", + "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz", + "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa" + ], + "license": "MIT", + "bin": { + "mime": "bin/cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "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" + } + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-astro": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/prettier-plugin-astro/-/prettier-plugin-astro-0.14.1.tgz", + "integrity": "sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.9.1", + "prettier": "^3.0.0", + "sass-formatter": "^0.7.6" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/request-light": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.7.0.tgz", + "integrity": "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/s.color": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/s.color/-/s.color-0.0.15.tgz", + "integrity": "sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass-formatter": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/sass-formatter/-/sass-formatter-0.7.9.tgz", + "integrity": "sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "suf-log": "^2.5.3" + } + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "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" + } + }, + "node_modules/shiki": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.21.0.tgz", + "integrity": "sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.21.0", + "@shikijs/engine-javascript": "3.21.0", + "@shikijs/engine-oniguruma": "3.21.0", + "@shikijs/langs": "3.21.0", + "@shikijs/themes": "3.21.0", + "@shikijs/types": "3.21.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/srcset": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-5.0.3.tgz", + "integrity": "sha512-AZswtOXIsu0LeHdo6YY7d0r2pCH2Rl1D8ae1utvXUX4GxG3RggsVUAOFX1r8RI4YHFMYb4g89+UBPBv3mNUU2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/suf-log": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/suf-log/-/suf-log-2.5.3.tgz", + "integrity": "sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==", + "dev": true, + "license": "MIT", + "dependencies": { + "s.color": "0.0.15" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.4.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typesafe-path": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/typesafe-path/-/typesafe-path-0.2.2.tgz", + "integrity": "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-auto-import-cache": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/typescript-auto-import-cache/-/typescript-auto-import-cache-0.3.6.tgz", + "integrity": "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.8" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.19.1.tgz", + "integrity": "sha512-Gpq0iNm5M6cQWlyHQv9MV+uOj1jWk7LpkoE5vSp/7zjb4zMdAcUD+VL5y0nH4p9EbUklq00eVIIX/XcDHzu5xg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.3.tgz", + "integrity": "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/volar-service-css": { + "version": "0.0.68", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.68.tgz", + "integrity": "sha512-lJSMh6f3QzZ1tdLOZOzovLX0xzAadPhx8EKwraDLPxBndLCYfoTvnNuiFFV8FARrpAlW5C0WkH+TstPaCxr00Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-css-languageservice": "^6.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-emmet": { + "version": "0.0.68", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.68.tgz", + "integrity": "sha512-nHvixrRQ83EzkQ4G/jFxu9Y4eSsXS/X2cltEPDM+K9qZmIv+Ey1w0tg1+6caSe8TU5Hgw4oSTwNMf/6cQb3LzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emmetio/css-parser": "^0.4.1", + "@emmetio/html-matcher": "^1.3.0", + "@vscode/emmet-helper": "^2.9.3", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-html": { + "version": "0.0.68", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.68.tgz", + "integrity": "sha512-fru9gsLJxy33xAltXOh4TEdi312HP80hpuKhpYQD4O5hDnkNPEBdcQkpB+gcX0oK0VxRv1UOzcGQEUzWCVHLfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-html-languageservice": "^5.3.0", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-prettier": { + "version": "0.0.68", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.68.tgz", + "integrity": "sha512-grUmWHkHlebMOd6V8vXs2eNQUw/bJGJMjekh/EPf/p2ZNTK0Uyz7hoBRngcvGfJHMsSXZH8w/dZTForIW/4ihw==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0", + "prettier": "^2.2 || ^3.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + }, + "prettier": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript": { + "version": "0.0.68", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.68.tgz", + "integrity": "sha512-z7B/7CnJ0+TWWFp/gh2r5/QwMObHNDiQiv4C9pTBNI2Wxuwymd4bjEORzrJ/hJ5Yd5+OzeYK+nFCKevoGEEeKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-browserify": "^1.0.1", + "semver": "^7.6.2", + "typescript-auto-import-cache": "^0.3.5", + "vscode-languageserver-textdocument": "^1.0.11", + "vscode-nls": "^5.2.0", + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-typescript-twoslash-queries": { + "version": "0.0.68", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.68.tgz", + "integrity": "sha512-NugzXcM0iwuZFLCJg47vI93su5YhTIweQuLmZxvz5ZPTaman16JCvmDZexx2rd5T/75SNuvvZmrTOTNYUsfe5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/volar-service-yaml": { + "version": "0.0.68", + "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.68.tgz", + "integrity": "sha512-84XgE02LV0OvTcwfqhcSwVg4of3MLNUWPMArO6Aj8YXqyEVnPu8xTEMY2btKSq37mVAPuaEVASI4e3ptObmqcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-uri": "^3.0.8", + "yaml-language-server": "~1.19.2" + }, + "peerDependencies": { + "@volar/language-service": "~2.4.0" + }, + "peerDependenciesMeta": { + "@volar/language-service": { + "optional": true + } + } + }, + "node_modules/vscode-css-languageservice": { + "version": "6.3.9", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.9.tgz", + "integrity": "sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-html-languageservice": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.1.tgz", + "integrity": "sha512-5Mrqy5CLfFZUgkyhNZLA1Ye5g12Cb/v6VM7SxUzZUaRKWMDz4md+y26PrfRTSU0/eQAl3XpO9m2og+GGtDMuaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "vscode-languageserver-textdocument": "^1.0.12", + "vscode-languageserver-types": "^3.17.5", + "vscode-uri": "^3.1.0" + } + }, + "node_modules/vscode-json-languageservice": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/vscode-json-languageservice/-/vscode-json-languageservice-4.1.8.tgz", + "integrity": "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-nls": "^5.0.0", + "vscode-uri": "^3.0.2" + }, + "engines": { + "npm": ">=7.0.0" + } + }, + "node_modules/vscode-json-languageservice/node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-nls": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-nls/-/vscode-nls-5.2.0.tgz", + "integrity": "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which": { + "version": "2.0.2", + "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" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "devOptional": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-language-server": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.19.2.tgz", + "integrity": "sha512-9F3myNmJzUN/679jycdMxqtydPSDRAarSj3wPiF7pchEPnO9Dg07Oc+gIYLqXR4L+g+FSEVXXv2+mr54StLFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vscode/l10n": "^0.0.18", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "lodash": "4.17.21", + "prettier": "^3.5.0", + "request-light": "^0.5.7", + "vscode-json-languageservice": "4.1.8", + "vscode-languageserver": "^9.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-languageserver-types": "^3.16.0", + "vscode-uri": "^3.0.2", + "yaml": "2.7.1" + }, + "bin": { + "yaml-language-server": "bin/yaml-language-server" + } + }, + "node_modules/yaml-language-server/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/yaml-language-server/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/yaml-language-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/request-light": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", + "integrity": "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==", + "dev": true, + "license": "MIT" + }, + "node_modules/yaml-language-server/node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..3a3fe75e --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "openastronomy-site", + "private": true, + "type": "module", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "lint": "eslint \"src/**/*.{astro,js,ts}\" \"scripts/**/*.{js,mjs}\"", + "lint:fix": "eslint \"src/**/*.{astro,js,ts}\" \"scripts/**/*.{js,mjs}\" --fix", + "lint:md": "markdownlint-cli2", + "lint:md:fix": "markdownlint-cli2 --fix", + "format": "prettier . --write", + "format:check": "prettier . --check", + "astro:check": "astro check", + "check": "npm run lint && npm run astro:check", + "linkcheck:internal": "node scripts/linkcheck.mjs internal", + "linkcheck:external": "node scripts/linkcheck.mjs external" + }, + "dependencies": { + "astro": "^5.16.15" + }, + "devDependencies": { + "@astrojs/check": "^0.9.2", + "@eslint/js": "^9.39.2", + "@typescript-eslint/eslint-plugin": "^8.53.1", + "@typescript-eslint/parser": "^8.53.1", + "astro-eslint-parser": "^1.2.2", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-astro": "^1.5.0", + "globals": "^17.1.0", + "linkinator": "^7.5.3", + "markdownlint-cli2": "^0.21.0", + "prettier": "^3.8.1", + "prettier-plugin-astro": "^0.14.1", + "typescript": "^5.9.3" + } +} diff --git a/CNAME b/public/CNAME similarity index 100% rename from CNAME rename to public/CNAME diff --git a/public/css/astro-overrides.css b/public/css/astro-overrides.css new file mode 100644 index 00000000..053be8ef --- /dev/null +++ b/public/css/astro-overrides.css @@ -0,0 +1,445 @@ +:root { + --site-content-max-width: 1012px; +} + +body { + font-family: "Open Sans", Helvetica, Arial, sans-serif; + font-size: 1.05rem; + color: rgb(3 3 3); + padding-bottom: 0; + background-size: 100%; + background-repeat: no-repeat; +} + +/* Shared inline icon styles */ +.icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + margin-right: 4px; + vertical-align: middle; +} + +.icon svg { + width: 100%; + height: 100%; +} + +.icon-envelope::before { + content: "✉"; + font-size: 0.9rem; + line-height: 1; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: rgb(3 3 3); + font-family: "Montserrat", "Helvetica", "Arial"; +} + +h1, +h2 { + margin-top: 40px; + margin-bottom: 10px; +} + +h1 a, +h2 a, +h3 a, +h4 a, +h5 a, +h6 a { + color: inherit; +} + +a { + color: #3e51cf; + transition: color 0.2s ease; +} + +a:hover { + color: #965412; +} + +h5 a:link, +h5 a:visited, +h4 a:link, +h4 a:visited, +h3 a:link, +h3 a:visited { + color: #2b3990; +} + +h5 a:hover, +h4 a:hover, +h3 a:hover { + color: #c26d17; + text-decoration: none; +} + +blockquote { + margin: 1em; + padding: 1em 1em 0.5em; + width: 90%; +} + +blockquote.testimonial cite { + font-style: italic; +} + +header.site-header .wrapper, +.page-content .wrapper, +footer.site-footer .wrapper, +.container { + width: min(var(--site-content-max-width), 100%); + max-width: var(--site-content-max-width); + margin: 0 auto; +} + +header.site-header { + background-color: #292929; +} + +header.site-header .wrapper { + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + padding: 0 32px; + box-sizing: border-box; +} + +header.site-header .site-title { + display: block; +} + +header.site-header .logo { + margin-top: 10px; + margin-bottom: 10px; + width: 125px; + height: auto; + display: block; +} + +header.site-header .site-nav { + display: flex; + align-items: center; + justify-content: center; + gap: 16px; + position: relative; +} + +header.site-header .site-nav .trigger { + display: flex; + align-items: center; + justify-content: center; + gap: 16px; +} + +header.site-header .site-title, +header.site-header .site-nav .trigger a { + color: #ffffff; + background-color: #292929; +} + +header.site-header .site-nav .trigger a { + margin: 0; + font-size: 1.05rem; + line-height: 1.2; +} + +header.site-header .site-title:hover, +header.site-header .site-nav .trigger a:hover { + text-decoration: none; + color: #e15f5f; +} + +header.site-header .menu-icon { + display: none; + padding: 0; + border: 0; + background: transparent; + cursor: pointer; +} + +.page-content .wrapper { + padding: 0 32px; + box-sizing: border-box; +} + +.fixed-wrap > .page-content { + padding-bottom: 5px; +} + +.page-content img.large-logo { + width: min(52%, 480px); + max-width: 100%; + height: auto; + display: block; + margin: 20px auto 30px; +} + +.member-logo { + width: 120px; + height: auto; + display: block; +} + +footer.site-footer { + background-color: #292929; + margin-top: 10px; + width: 100%; + padding-top: 10px; + padding-bottom: 10px; + text-align: center; +} + +footer.site-footer .wrapper { + color: #ffffff; +} + +footer.site-footer .wrapper a { + color: #ffffff; + text-decoration: none; + padding-right: 8px; + display: inline-block; +} + +footer.site-footer .wrapper a:hover { + text-decoration: none; + transition: color 0.5s ease; + color: #808080; +} + +footer.site-footer .wrapper a img, +footer.site-footer .wrapper .icon-image svg { + width: 16px; + height: 16px; +} + +footer.site-footer .wrapper .tagline { + color: #ffffff; +} + +.gsoc-tabs { + display: flex; + justify-content: center; + gap: 16px; + margin: 20px 0 30px; +} + +.gsoc-section-link { + color: inherit; + text-decoration: none; +} + +.gsoc-section-link:hover, +.gsoc-section-link:focus { + text-decoration: underline; +} + +.gsoc-project-card { + background: #ffffff; + border-radius: 14px; + padding: 18px 20px; + box-shadow: 0 8px 22px rgba(0, 0, 0, 0.12); + transition: + transform 180ms ease, + box-shadow 180ms ease; + border: 0; + width: 100%; + text-align: left; + cursor: pointer; +} + +.gsoc-project-body { + margin-top: 12px; +} + +.gsoc-projects-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 24px; + margin-bottom: 32px; +} + +.gsoc-project-card:hover { + transform: translateY(-4px); + box-shadow: 0 16px 34px rgba(0, 0, 0, 0.18); +} + +.gsoc-project-card h3 { + margin-top: 0; +} + +.gsoc-project-desc { + margin: 0 0 8px; + font-size: 0.9em; + line-height: 1.4; + display: -webkit-box; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.gsoc-card-row { + font-size: 0.85em; + line-height: 1.4; + margin-top: 6px; + display: flex; + gap: 6px; + flex-wrap: wrap; +} + +.gsoc-card-label { + font-weight: 600; +} + +.gsoc-project-detail[hidden] { + display: none; +} + +.gsoc-project-detail-link { + margin: 0 0 8px; + font-size: 0.85em; + line-height: 1.3; + text-align: left; +} + +.gsoc-project-detail-link a { + color: #2b3990; + word-break: break-all; +} + +.gsoc-modal { + position: fixed; + inset: 0; + display: flex; + align-items: center; + justify-content: center; + padding: 24px; + z-index: 999; +} + +.gsoc-modal[hidden] { + display: none; +} + +.gsoc-modal-backdrop { + position: absolute; + inset: 0; + background: rgba(0, 0, 0, 0.55); +} + +.gsoc-modal-panel { + position: relative; + background: #ffffff; + border-radius: 16px; + padding: 32px 24px 24px; + width: min(900px, 100%); + max-height: 80vh; + overflow: auto; + box-shadow: 0 18px 40px rgba(0, 0, 0, 0.25); + z-index: 1; +} + +.gsoc-modal-close { + position: absolute; + top: 12px; + right: 12px; + border: 0; + border-radius: 999px; + background: #292929; + color: #ffffff; + padding: 6px 12px; + cursor: pointer; +} + +.gsoc-people-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); + gap: 16px; + margin-top: 16px; +} + +@media (max-width: 900px) { + header.site-header .wrapper { + justify-content: space-between; + width: 100%; + padding: 0 22px; + } + + header.site-header .site-nav { + position: relative; + gap: 8px; + margin-left: auto; + } + + header.site-header .site-title { + margin-right: auto; + } + + header.site-header .site-nav .trigger { + display: none; + flex-direction: column; + align-items: stretch; + text-align: center; + justify-content: flex-start; + gap: 8px; + position: absolute; + right: 0; + top: calc(100% + 6px); + padding: 10px 12px; + background: #292929; + border-radius: 8px; + z-index: 1; + } + + header.site-header .site-nav .trigger a { + display: block; + } + + header.site-header .menu-icon { + display: inline-flex !important; + align-items: center; + justify-content: center; + width: 46px; + height: 36px; + margin: 0; + padding: 0; + z-index: 2; + } + + header.site-header .menu-icon > svg { + width: 28px; + height: 25px; + } + + header.site-header .site-nav.is-open .trigger { + display: flex; + } +} + +@media (max-width: 700px) { + .page-content .wrapper { + padding: 0 22px; + } +} + +@media (max-width: 670px) { + footer.site-footer .wrapper .tagline { + display: none; + } +} + +@media (max-width: 600px) { + .page-content img.large-logo { + display: none; + } +} diff --git a/img/IMG_20160111_094506.jpg b/public/img/IMG_20160111_094506.jpg similarity index 100% rename from img/IMG_20160111_094506.jpg rename to public/img/IMG_20160111_094506.jpg diff --git a/img/logo/logoOA_svg.png b/public/og/openastronomy-og.png similarity index 100% rename from img/logo/logoOA_svg.png rename to public/og/openastronomy-og.png diff --git a/scripts/linkcheck.mjs b/scripts/linkcheck.mjs new file mode 100644 index 00000000..9b809297 --- /dev/null +++ b/scripts/linkcheck.mjs @@ -0,0 +1,346 @@ +import { existsSync, readFileSync, readdirSync, statSync } from "node:fs"; +import path from "node:path"; + +const mode = process.argv[2] ?? "internal"; +const skipFile = process.env.LINKCHECK_SKIP_FILE ?? "linkcheck.skip.txt"; +const root = process.env.LINKCHECK_ROOT ?? "html"; + +if (!existsSync(root)) { + console.error( + `Build output "${root}" not found. Run "npm run build" first or set LINKCHECK_ROOT.`, + ); + process.exit(1); +} + +const skipLines = existsSync(skipFile) + ? readFileSync(skipFile, "utf8") + .split(/\r?\n/) + .map((line) => line.trim()) + .filter((line) => line && !line.startsWith("#")) + : []; + +const skipPatterns = skipLines + .map((line) => { + try { + return new RegExp(line); + } catch { + console.warn(`Invalid skip pattern ignored: ${line}`); + return null; + } + }) + .filter(Boolean); + +const rootPath = path.resolve(root); +const rootLabel = root.replace(/\\/g, "/"); +const startTime = Date.now(); + +const collectHtmlFiles = (dir, collected = []) => { + const entries = readdirSync(dir, { withFileTypes: true }); + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + if (entry.isDirectory()) { + collectHtmlFiles(fullPath, collected); + } else if (entry.isFile() && entry.name.toLowerCase().endsWith(".html")) { + collected.push(fullPath); + } + } + return collected; +}; + +const extractLinks = (html) => { + const links = []; + const attrRegex = /\s(?:href|src)=['"]([^'"]+)['"]/gi; + let match; + while ((match = attrRegex.exec(html)) !== null) { + if (match[1]) { + links.push(match[1].trim()); + } + } + const srcsetRegex = /\ssrcset=['"]([^'"]+)['"]/gi; + while ((match = srcsetRegex.exec(html)) !== null) { + const raw = match[1] ?? ""; + raw.split(",").forEach((part) => { + const url = part.trim().split(/\s+/)[0]; + if (url) { + links.push(url); + } + }); + } + return links; +}; + +const extractAnchors = (html) => { + const anchors = new Set(); + const idRegex = /\sid=['"]([^'"]+)['"]/gi; + const nameRegex = /\sname=['"]([^'"]+)['"]/gi; + let match; + while ((match = idRegex.exec(html)) !== null) { + if (match[1]) { + anchors.add(match[1].trim()); + } + } + while ((match = nameRegex.exec(html)) !== null) { + if (match[1]) { + anchors.add(match[1].trim()); + } + } + return anchors; +}; + +const fileCache = new Map(); +const getFileData = (filePath) => { + if (fileCache.has(filePath)) { + return fileCache.get(filePath); + } + const html = readFileSync(filePath, "utf8"); + const data = { + links: extractLinks(html), + anchors: extractAnchors(html), + }; + fileCache.set(filePath, data); + return data; +}; + +const isSkippableLink = (link) => { + if (!link || link === "#") return true; + const trimmed = link.trim(); + if (!trimmed) return true; + const lower = trimmed.toLowerCase(); + if (lower.startsWith("javascript:") || lower.startsWith("data:")) return true; + if (mode === "internal") { + if (/^(mailto:|tel:|irc:|ftp:)/i.test(trimmed)) return true; + if (/^https?:\/\//i.test(trimmed)) return true; + } else { + if (!/^https?:\/\//i.test(trimmed)) return true; + } + return skipPatterns.some((pattern) => pattern.test(trimmed)); +}; + +const resolveInternalTarget = (link, currentFile) => { + const trimmed = link.trim(); + const [pathPartRaw, hashPartRaw] = trimmed.split("#"); + const pathPart = (pathPartRaw ?? "").split("?")[0]; + const hashPart = hashPartRaw ?? ""; + + let anchor = ""; + if (hashPart) { + try { + anchor = decodeURIComponent(hashPart); + } catch { + anchor = hashPart; + } + } + + if (!pathPart) { + return { filePath: currentFile, anchor }; + } + if (pathPart.startsWith("//")) { + return null; + } + + let relPath = ""; + if (pathPart.startsWith("/")) { + relPath = pathPart.slice(1); + } else { + const currentRel = path + .relative(rootPath, currentFile) + .split(path.sep) + .join("/"); + const currentDir = path.posix.dirname(currentRel); + relPath = path.posix.normalize(path.posix.join(currentDir, pathPart)); + } + + if (!relPath) { + return { + filePath: path.join(rootPath, "index.html"), + anchor, + urlPath: "/", + }; + } + + const directPath = path.join(rootPath, relPath); + if (pathPart.endsWith("/")) { + return { + filePath: path.join(directPath, "index.html"), + anchor, + urlPath: `/${relPath}`, + }; + } + + if (path.extname(relPath)) { + return { filePath: directPath, anchor, urlPath: `/${relPath}` }; + } + + if (existsSync(directPath) && statSync(directPath).isFile()) { + return { filePath: directPath, anchor, urlPath: `/${relPath}` }; + } + + return { + filePath: path.join(directPath, "index.html"), + anchor, + urlPath: `/${relPath}/`, + }; +}; + +const displaySourcePath = (filePath) => { + const rel = path.relative(rootPath, filePath).split(path.sep).join("/"); + if (rel === "index.html") return `${rootLabel}/`; + if (rel.endsWith("/index.html")) + return `${rootLabel}/${rel.replace(/index\.html$/, "")}`; + return `${rootLabel}/${rel}`; +}; + +const displayTargetPath = (urlPath, filePath, anchor) => { + let displayPath = ""; + if (urlPath) { + const normalized = urlPath.replace(/^\/+/, ""); + displayPath = normalized ? `${rootLabel}/${normalized}` : `${rootLabel}/`; + } else { + const rel = path.relative(rootPath, filePath).split(path.sep).join("/"); + displayPath = `${rootLabel}/${rel}`; + } + return anchor ? `${displayPath}#${anchor}` : displayPath; +}; + +const reportFailures = (failures, scannedCount) => { + const grouped = new Map(); + for (const failure of failures) { + if (!grouped.has(failure.source)) grouped.set(failure.source, []); + grouped.get(failure.source).push(failure); + } + for (const [source, items] of grouped) { + console.error(source); + for (const item of items) { + const code = item.type === "anchor" ? "ANCHOR" : "404"; + console.error(` [${code}] ${item.target}`); + } + } + const elapsed = ((Date.now() - startTime) / 1000).toFixed(3); + console.error( + `ERROR: Detected ${failures.length} broken links. Scanned ${scannedCount} links in ${elapsed} seconds.`, + ); +}; + +const reportSuccess = (scannedCount) => { + const elapsed = ((Date.now() - startTime) / 1000).toFixed(3); + console.log(`OK: Scanned ${scannedCount} links in ${elapsed} seconds.`); +}; + +const runInternalCheck = () => { + const htmlFiles = collectHtmlFiles(rootPath); + const failures = []; + let scannedCount = 0; + + for (const filePath of htmlFiles) { + const { links } = getFileData(filePath); + const source = displaySourcePath(filePath); + for (const link of links) { + if (isSkippableLink(link)) continue; + const target = resolveInternalTarget(link, filePath); + if (!target) continue; + const { filePath: targetFile, anchor, urlPath } = target; + scannedCount += 1; + if (!existsSync(targetFile)) { + failures.push({ + source, + target: displayTargetPath(urlPath, targetFile, anchor), + type: "missing", + }); + continue; + } + if (anchor && targetFile.toLowerCase().endsWith(".html")) { + const { anchors } = getFileData(targetFile); + if (!anchors.has(anchor)) { + failures.push({ + source, + target: displayTargetPath(urlPath, targetFile, anchor), + type: "anchor", + }); + } + } + } + } + + if (failures.length > 0) { + reportFailures(failures, scannedCount); + process.exit(1); + } + reportSuccess(scannedCount); +}; + +const checkExternalUrl = async (url, timeoutMs) => { + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), timeoutMs); + try { + let response = await fetch(url, { + method: "HEAD", + redirect: "follow", + signal: controller.signal, + }); + if (response.status === 405 || response.status === 400) { + response = await fetch(url, { + method: "GET", + redirect: "follow", + signal: controller.signal, + }); + } + clearTimeout(timeout); + return response.status >= 200 && response.status < 400; + } catch { + clearTimeout(timeout); + return false; + } +}; + +const runExternalCheck = async () => { + const htmlFiles = collectHtmlFiles(rootPath); + const linksBySource = new Map(); + const uniqueLinks = new Set(); + + for (const filePath of htmlFiles) { + const { links } = getFileData(filePath); + const source = displaySourcePath(filePath); + for (const link of links) { + if (isSkippableLink(link)) continue; + const trimmed = link.trim(); + uniqueLinks.add(trimmed); + if (!linksBySource.has(source)) linksBySource.set(source, new Set()); + linksBySource.get(source).add(trimmed); + } + } + + const failures = new Set(); + let scannedCount = 0; + const timeoutMs = Number(process.env.LINKCHECK_TIMEOUT ?? 10000); + + for (const link of uniqueLinks) { + scannedCount += 1; + const ok = await checkExternalUrl(link, timeoutMs); + if (!ok) failures.add(link); + } + + if (failures.size > 0) { + for (const [source, links] of linksBySource) { + const broken = Array.from(links).filter((link) => failures.has(link)); + if (broken.length === 0) continue; + console.error(source); + for (const link of broken) { + console.error(` [ERR] ${link}`); + } + } + const elapsed = ((Date.now() - startTime) / 1000).toFixed(3); + console.error( + `ERROR: Detected ${failures.size} broken links. Scanned ${scannedCount} links in ${elapsed} seconds.`, + ); + process.exit(1); + } + + reportSuccess(scannedCount); +}; + +console.log(`Scanning ${mode} links in ${rootLabel}`); +if (mode === "external") { + await runExternalCheck(); +} else { + runInternalCheck(); +} diff --git a/css/background_ap.jpg b/src/assets/background/background_ap.jpg similarity index 100% rename from css/background_ap.jpg rename to src/assets/background/background_ap.jpg diff --git a/css/background_sp.jpg b/src/assets/background/background_sp.jpg similarity index 100% rename from css/background_sp.jpg rename to src/assets/background/background_sp.jpg diff --git a/img/icons/discourse_icon.png b/src/assets/discourse_icon.png similarity index 100% rename from img/icons/discourse_icon.png rename to src/assets/discourse_icon.png diff --git a/src/assets/logoOA.png b/src/assets/logoOA.png new file mode 100644 index 0000000000000000000000000000000000000000..ae064c8b1ad4dce20ee45be23062dc2bb21d91a3 GIT binary patch literal 461786 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

      Xxue4!Lip`Ja|8@97@KdvN4 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 (-vK@$jelJMvaPD&NzV9=3_q@12G$`f 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 z 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 z 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

      PIz`2eUJXvZTUUB`QYMp*0?Js^V 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

      q_L>()^PaZxU;Qd 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 literal 0 HcmV?d00001 diff --git a/img/members/ims.png b/src/assets/members/ims.png similarity index 100% rename from img/members/ims.png rename to src/assets/members/ims.png diff --git a/src/assets/members/juliaastro.png b/src/assets/members/juliaastro.png new file mode 100644 index 0000000000000000000000000000000000000000..9db9c60af7f27ad4812521f42eb0dd09dc548bad GIT binary patch literal 12439 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 literal 0 HcmV?d00001 diff --git a/img/members/lincc-frameworks.png b/src/assets/members/lincc-frameworks.png similarity index 100% rename from img/members/lincc-frameworks.png rename to src/assets/members/lincc-frameworks.png diff --git a/img/members/plasmapy.png b/src/assets/members/plasmapy.png similarity index 100% rename from img/members/plasmapy.png rename to src/assets/members/plasmapy.png diff --git a/img/members/poliastro.png b/src/assets/members/poliastro.png similarity index 100% rename from img/members/poliastro.png rename to src/assets/members/poliastro.png diff --git a/img/members/radis_ico.png b/src/assets/members/radis_ico.png similarity index 100% rename from img/members/radis_ico.png rename to src/assets/members/radis_ico.png diff --git a/img/members/reltrans_logo.png b/src/assets/members/reltrans_logo.png similarity index 100% rename from img/members/reltrans_logo.png rename to src/assets/members/reltrans_logo.png diff --git a/src/assets/members/sherpa_logo.png b/src/assets/members/sherpa_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..393bbdcbb7b702f63e96281efb34615d12a2cc52 GIT binary patch literal 5495 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 J{n{ezzW{m?3#b49 literal 0 HcmV?d00001 diff --git a/img/members/stingray_logo.png b/src/assets/members/stingray_logo.png similarity index 100% rename from img/members/stingray_logo.png rename to src/assets/members/stingray_logo.png diff --git a/img/members/sunpy.png b/src/assets/members/sunpy.png similarity index 100% rename from img/members/sunpy.png rename to src/assets/members/sunpy.png diff --git a/img/members/yt.png b/src/assets/members/yt.png similarity index 100% rename from img/members/yt.png rename to src/assets/members/yt.png diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 00000000..e01e8f56 --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,48 @@ +--- +import { Image } from "astro:assets"; +import site from "../data/site.json"; +import icons from "../data/icons.json"; +import discourseIcon from "../assets/discourse_icon.png"; +--- + +

      diff --git a/src/components/Head.astro b/src/components/Head.astro new file mode 100644 index 00000000..6475d601 --- /dev/null +++ b/src/components/Head.astro @@ -0,0 +1,84 @@ +--- +import site from "../data/site.json"; +import members from "../data/members.json"; +import { fromSiteRoot } from "../lib/relative-paths.js"; +import logoWhite from "../assets/logoOA_white.png"; +import backgroundAp from "../assets/background/background_ap.jpg"; +import backgroundSp from "../assets/background/background_sp.jpg"; + +const { pageTitle, description = site.description } = Astro.props; + +const title = pageTitle ?? site.title; +const pagePath = Astro.url.pathname; +const canonicalBase = Astro.site ?? site.url; +const canonicalUrl = new URL(Astro.url.pathname, canonicalBase).toString(); +const faviconHref = fromSiteRoot(pagePath, logoWhite.src); +const overridesHref = fromSiteRoot(pagePath, "/css/astro-overrides.css"); +const ogImageUrl = new URL( + "/og/openastronomy-og.png", + canonicalBase, +).toString(); +const ogImageWidth = 1308; +const ogImageHeight = 629; +const backgroundOptions = [ + fromSiteRoot(pagePath, backgroundAp.src), + fromSiteRoot(pagePath, backgroundSp.src), +]; +const keywords = [ + "foss", + "open source", + "organizations", + "astronomy", + "OpenAstronomy", + "astrophysics", + "GSoC", + "projects", + "members", + ...Object.values(members).flatMap((member) => + member.name ? [member.name] : [], + ), +].join(", "); +--- + + + {title} + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/Header.astro b/src/components/Header.astro new file mode 100644 index 00000000..07ca2341 --- /dev/null +++ b/src/components/Header.astro @@ -0,0 +1,99 @@ +--- +import { Image } from "astro:assets"; +import site from "../data/site.json"; +import { fromSiteRoot, localizeHref } from "../lib/relative-paths.js"; +import logoWhite from "../assets/logoOA_white.png"; + +const pagePath = Astro.url.pathname; +const navLinks = [ + ...site.page_links.map((page) => ({ + title: page.title, + href: localizeHref(pagePath, page.href), + })), + ...Object.entries(site.nav_links).map(([title, href]) => ({ title, href })), +]; +const menuIconPaths = [ + "M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.031C17.335,0,18,0.665,18,1.484L18,1.484z", + "M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0c0-0.82,0.665-1.484,1.484-1.484 h15.031C17.335,6.031,18,6.696,18,7.516L18,7.516z", + "M18,13.516C18,14.335,17.335,15,16.516,15H1.484C0.665,15,0,14.335,0,13.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.031C17.335,12.031,18,12.696,18,13.516L18,13.516z", +]; +--- + + + + diff --git a/src/components/MemberCard.astro b/src/components/MemberCard.astro new file mode 100644 index 00000000..825bc394 --- /dev/null +++ b/src/components/MemberCard.astro @@ -0,0 +1,183 @@ +--- +import { Image } from "astro:assets"; +import type { ImageMetadata } from "astro"; +import icons from "../data/icons.json"; + +type MemberDetails = { + name: string; + url: string; + logo: string; + description?: string; + repositories?: Record; + mailinglist?: Record; + chat?: Record; + microblogging?: Record; +}; + +const { memberKey, details: rawDetails } = Astro.props as { + memberKey: string; + details: MemberDetails; +}; +const details = rawDetails; +const entries = (value?: Record) => + value ? Object.entries(value) : []; +const repositories = entries(details.repositories); +const mailingLists = entries(details.mailinglist); +const chats = entries(details.chat); +const microblogging = entries(details.microblogging); +const repoProviders = { + github: { + href: (repo: string) => `https://github.com/${repo}`, + icon: icons.gh_logo, + viewBox: "0 0 16 16", + height: undefined, + }, + bitbucket: { + href: (repo: string) => `https://bitbucket.com/${repo}`, + icon: icons.bb_logo, + viewBox: "0 0 30 30", + height: "50%", + }, + sourceforge: { + href: (repo: string) => `https://sourceforge.net/projects/${repo}`, + icon: icons.sf_logo, + viewBox: "0 0 15 10", + height: "50%", + }, +} as const; +const repositoryLinks = repositories.map(([provider, repo]) => { + const knownProvider = repoProviders[provider as keyof typeof repoProviders]; + if (knownProvider) { + return { + href: knownProvider.href(repo), + label: repo, + icon: knownProvider.icon, + viewBox: knownProvider.viewBox, + height: knownProvider.height, + }; + } + return { + href: repo, + label: memberKey, + icon: icons.gh_logo, + viewBox: "0 0 16 16", + height: undefined, + }; +}); +const socialLinks = microblogging + .map(([platform, handle]) => { + if (platform === "x") { + return { + href: `https://x.com/${handle}`, + label: `@${handle}`, + icon: icons.x_logo, + }; + } + if (platform === "mastodon") { + const [, username, host] = handle.split("@"); + if (!username || !host) { + return null; + } + return { + href: `https://${host}/@${username}`, + label: handle, + icon: icons.mastodon_logo, + }; + } + return null; + }) + .filter( + (link): link is { href: string; label: string; icon: string } => + link !== null, + ); + +const memberLogoModules = import.meta.glob<{ default: ImageMetadata }>( + "../assets/members/*.{png,jpg,jpeg,webp,avif}", + { eager: true }, +); +const memberLogos = Object.fromEntries( + Object.entries(memberLogoModules).map(([path, mod]) => { + const filename = path.split("/").pop() ?? ""; + return [filename, mod.default]; + }), +) as Record; +const logoAsset = memberLogos[details.logo]; +if (!logoAsset) { + throw new Error(`Missing member logo asset: ${details.logo}`); +} +--- + +
      + + + +
      + {details.name} + +
      + { + repositoryLinks.map((repository) => ( + + + + + + + {repository.label} + + )) + } +
      + { + mailingLists.length > 0 ? ( + <> + + {mailingLists.map(([label, url], index) => ( + <> + {label} + {index < mailingLists.length - 1 ? "," : ""} + + ))} +
      + + ) : null + } + { + chats.length > 0 ? ( + <> + + + + + + {chats.map(([label, url], index) => ( + <> + {label} + {index < chats.length - 1 ? "," : ""} + + ))} +
      + + ) : null + } + { + socialLinks.map((socialLink) => ( + + + + + + + {socialLink.label} + + )) + } +
      +
      +
      diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 00000000..2cc00450 --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,23 @@ +import { defineCollection, z } from "astro:content"; + +const posts = defineCollection({ + type: "content", + schema: z + .object({ + title: z.string(), + date: z.date(), + author: z.string().optional(), + meta: z.string().optional(), + }) + .passthrough(), +}); + +const pages = defineCollection({ + type: "content", + schema: z.object({}).passthrough(), +}); + +export const collections = { + posts, + pages, +}; diff --git a/src/content/pages/gsoc/2015/ideas.md b/src/content/pages/gsoc/2015/ideas.md new file mode 100644 index 00000000..6b17d432 --- /dev/null +++ b/src/content/pages/gsoc/2015/ideas.md @@ -0,0 +1,18 @@ +--- +title: "Ideas page for Google Summer of Code 2015" +show_main: false +--- + +# Ideas page for Google Summer of Code 2015 + +## Ideas page for GSoC 2015 + +Browse ideas for the following projects: + +- [Astropy core package](../ideas_astropy/) +- [Packages affiliated with Astropy](../ideas_astropy_affiliated/) +- [ChiantiPy](../ideas_chiantipy/) +- [SunPy](../ideas_sunpy/) +- [yt](../ideas_yt/) + +For each participating project, the ideas are organized from easiest to hardest. diff --git a/gsoc/gsoc2015/ideas_astropy.md b/src/content/pages/gsoc/2015/ideas_astropy.md similarity index 68% rename from gsoc/gsoc2015/ideas_astropy.md rename to src/content/pages/gsoc/2015/ideas_astropy.md index 1c10e206..1100b47b 100644 --- a/gsoc/gsoc2015/ideas_astropy.md +++ b/src/content/pages/gsoc/2015/ideas_astropy.md @@ -1,21 +1,22 @@ --- -layout: default -title: "Ideas for Astropy" +title: "Ideas for Astropy" show_main: false ideas_team: Astropy core package --- -### Implement Distribution Support for Quantity +# Ideas for Astropy -*Suggested Mentor(s):* [Erik Tollerud](http://github.com/eteq) +## Implement Distribution Support for Quantity -*Difficulty:* Beginner to Intermediate +_Suggested Mentor(s):_ [Erik Tollerud](http://github.com/eteq) -*Astronomy knowledge needed:* none, but statistics knowledge/background useful +_Difficulty:_ Beginner to Intermediate -*Programming skills:* Python +_Astronomy knowledge needed:_ none, but statistics knowledge/background useful -#### Description +_Programming skills:_ Python + +### Description The [Quantity](http://docs.astropy.org/en/stable/units/index.html) class is powerful but doesn’t have particularly useful support for uncertainties on @@ -29,22 +30,21 @@ distributions. If there is time, this could also involve expanding this system to support common analytically-representable distributions such as Gaussian and Poisson distributions. +## Implement image rasterization methods for models -### Implement image rasterization methods for models - -*Suggested Mentor(s):* [Christoph Deil](http://github.com/cdeil) +_Suggested Mentor(s):_ [Christoph Deil](http://github.com/cdeil) -*Difficulty:* Intermediate +_Difficulty:_ Intermediate -*Astronomy knowledge needed:* Basic +_Astronomy knowledge needed:_ Basic -*Programming skills:* Python, Cython +_Programming skills:_ Python, Cython -#### Description +### Description When fitting models to binned data, evaluating the model at the bin centers leads to incorrect results if the model changes significantly within a bin. E.g. think of an image where the point spread function (PSF) only has a width slightly above the pixel size and you want to distinguish small Galaxies from stars. -Currently Astropy models have an ``evaluate`` method that can be used to +Currently Astropy models have an `evaluate` method that can be used to evaluate them on a grid of pixel centers, there’s also an oversampling function to get a better representation of the expected flux in pixels. It would be useful to add methods that allow fast and precise rasterization of models, @@ -62,25 +62,25 @@ should be interested in model fitting and image rasterisation as well as profiling and extensive testing of a given method to make it “just work” for the end user. -### Add indexing capability to Table object +## Add indexing capability to Table object -*Suggested Mentor(s):* Tom Aldcroft (Astropy), Stuart Mumford (SunPy) +_Suggested Mentor(s):_ Tom Aldcroft (Astropy), Stuart Mumford (SunPy) -*Difficulty:* Intermediate +_Difficulty:_ Intermediate -*Astronomy knowledge needed:* none +_Astronomy knowledge needed:_ none -*Programming skills:* Python, Cython, familiarity with database algorithms +_Programming skills:_ Python, Cython, familiarity with database algorithms -#### Description +### Description The [Table](http://docs.astropy.org/en/stable/table/index.html) class is the -core astropy class for storing and manipulating tabular data. Currently it +core astropy class for storing and manipulating tabular data. Currently it supports a limited set of database-like capabilities including table joins and -grouping. A natural extension of this is to provide the ability to create and -maintain an index on one or more columns as well as a table primary key. With +grouping. A natural extension of this is to provide the ability to create and +maintain an index on one or more columns as well as a table primary key. With these indexed columns available then certain selection and query operations -could be highly optimized. The challenge is to maintain the integrity of the +could be highly optimized. The challenge is to maintain the integrity of the indexes as column or table properties change, using state of the art algorithms for high performance. @@ -101,17 +101,17 @@ To summarize: - Optimize existing table operations to use indexes where possible - Add new methods to select table rows based on column values -### Unify and improve file handling +## Unify and improve file handling -*Suggested Mentor(s):* [Michael Droettboom](http://github.com/mdboom) +_Suggested Mentor(s):_ [Michael Droettboom](http://github.com/mdboom) -*Difficulty:* Intermediate to Expert +_Difficulty:_ Intermediate to Expert -*Astronomy knowledge needed:* none +_Astronomy knowledge needed:_ none -*Programming skills:* Python, Unix features +_Programming skills:_ Python, Unix features -#### Description +### Description We have a number of packages that read and write data to files and file-like objects. While there was some initial effort to unify this code in @@ -126,40 +126,40 @@ fetching (see [astropy/#3446](https://github.com/astropy/astropy/issues/3446), and OS-level file locking to make multiprocessing applications that write to files more robust. -### Implement missing astropy.modeling functionality +## Implement missing astropy.modeling functionality -*Suggested Mentor(s):* [Christoph Deil](http://github.com/cdeil) +_Suggested Mentor(s):_ [Christoph Deil](http://github.com/cdeil) -*Difficulty:* Intermediate to expert +_Difficulty:_ Intermediate to expert -*Astronomy knowledge needed:* Basic +_Astronomy knowledge needed:_ Basic -*Programming skills:* Python +_Programming skills:_ Python -#### Description +### Description Implement some basic features are still missing in the astropy.modeling package: -* Fit parameter errors (symmetric and profile likelihood) -* Poisson fit statistic -* PSF-convolved models -* model parameter and fit result serialisation, e.g. to YAML or JSON or XML (e.g. some astronomers use [XML](http://fermi.gsfc.nasa.gov/ssc/data/analysis/scitools/source_models.html)) +- Fit parameter errors (symmetric and profile likelihood) +- Poisson fit statistic +- PSF-convolved models +- model parameter and fit result serialisation, e.g. to YAML or JSON or XML (e.g. some astronomers use [XML](http://fermi.gsfc.nasa.gov/ssc/data/analysis/scitools/source_models.html)) For the parameter error and Poisson fit statistic part some statistics background is needed, as well as interest in discussing and finding a good API for these things. An optional fun application at the end of this project (if model and fit result serialisation is implemented) could be to develop an interactive image fitting GUI (e.g. with IPython widgets in the web browser) for common 2D Astropy models, showing data, model and residual images and letting the user adjust model parameters and display fit statistics and results interactively. -### Implement framework for handling velocities and velocity transforms in astropy.coordinates +## Implement framework for handling velocities and velocity transforms in astropy.coordinates -*Suggested Mentor(s):* [Adrian Price-Whelan](http://github.com/adrn) & [Erik Tollerud](http://github.com/eteq) +_Suggested Mentor(s):_ [Adrian Price-Whelan](http://github.com/adrn) & [Erik Tollerud](http://github.com/eteq) -*Difficulty:* Intermediate to Expert +_Difficulty:_ Intermediate to Expert -*Astronomy knowledge needed:* understanding of coordinate transformations, some knowledge of astronomical coordinate systems would be useful +_Astronomy knowledge needed:_ understanding of coordinate transformations, some knowledge of astronomical coordinate systems would be useful -*Programming skills:* Python +_Programming skills:_ Python -#### Description +### Description The coordinates subpackage currently only supports transforming positional coordinates, but it would be useful to develop a consistent framework for also @@ -169,29 +169,28 @@ motion. This project could be: 1. working with us to develop a consistent API for handling velocities within coordinates, 2. developing a trial implementation of an API, -3. actually doing core development to implement the new features, or -4. some combination of all of the above. +3. actually doing core development to implement the new features, or +4. some combination of all of the above. -### Implement Public API for ERFA +## Implement Public API for ERFA -*Suggested Mentor(s):* [Erik Tollerud](http://github.com/eteq) +_Suggested Mentor(s):_ [Erik Tollerud](http://github.com/eteq) -*Difficulty:* Intermediate to Expert +_Difficulty:_ Intermediate to Expert -*Astronomy knowledge needed:* None required, but may be helpful for understanding ERFA functionality +_Astronomy knowledge needed:_ None required, but may be helpful for understanding ERFA functionality -*Programming skills:* Python, Cython, C +_Programming skills:_ Python, Cython, C -#### Description +### Description Some of the major functionality for Astropy uses the ERFA C library (adapted from the IAU SOFA library) as the back-end for -computational "heavy-lifting". Members of the community have expressed a desire to use this lower-level python wrapper -around ERFA for other purposes that may not be directly relevant for Astropy. So this project would involve making the -necessary changes to make the ERFA python API public. This includes: +computational "heavy-lifting". Members of the community have expressed a desire to use this lower-level python wrapper +around ERFA for other purposes that may not be directly relevant for Astropy. So this project would involve making the +necessary changes to make the ERFA python API public. This includes: -* Getting the documentation up to the astropy standard (currently it is mostly auto-generated verbatim from the C comments). -* Implementing a more complete test suite for the python side of the code. -* Possibly moving it to a separate package as part of the liberfa GitHub organization. This would also include making the necessary +- Getting the documentation up to the astropy standard (currently it is mostly auto-generated verbatim from the C comments). +- Implementing a more complete test suite for the python side of the code. +- Possibly moving it to a separate package as part of the liberfa GitHub organization. This would also include making the necessary changes to ensure everything continues to work in Astropy. -* Any other steps necessary to ensure the resulting package (or sub-package of Astropy) is stable and relatively easy to use. - +- Any other steps necessary to ensure the resulting package (or sub-package of Astropy) is stable and relatively easy to use. diff --git a/gsoc/gsoc2015/ideas_astropy_affiliated.md b/src/content/pages/gsoc/2015/ideas_astropy_affiliated.md similarity index 65% rename from gsoc/gsoc2015/ideas_astropy_affiliated.md rename to src/content/pages/gsoc/2015/ideas_astropy_affiliated.md index fbc2cd25..0dbb8e22 100644 --- a/gsoc/gsoc2015/ideas_astropy_affiliated.md +++ b/src/content/pages/gsoc/2015/ideas_astropy_affiliated.md @@ -1,67 +1,66 @@ --- -layout: default -title: "Ideas for Astropy-affiliated packages" +title: "Ideas for Astropy-affiliated packages" show_main: false ideas_team: Packages affiliated with Astropy --- -### Develop an affiliated package for observation planning / scheduling +# Ideas for Astropy-affiliated packages -*Suggested Mentor(s):* [Christoph Deil](http://github.com/cdeil) +## Develop an affiliated package for observation planning / scheduling -*Difficulty:* Beginner +_Suggested Mentor(s):_ [Christoph Deil](http://github.com/cdeil) -*Astronomy knowledge needed:* Intermediate +_Difficulty:_ Beginner -*Programming skills:* Python +_Astronomy knowledge needed:_ Intermediate -#### Description +_Programming skills:_ Python + +### Description Now that Astropy can transform from horizontal (altitude/azimuth) to sky coordinates it’s possible to develop tools for observation planning / scheduling (see -[here](http://docs.astropy.org/en/stable/coordinates/observing-example.html) +[the observing example](http://docs.astropy.org/en/stable/coordinates/observing-example.html) for an example). It would be nice to start developing an affiliated package that can be used by observers and observatories to plan and schedule observations. This project could go in a few different directions, including: -* creating typical tables and plots for observation planning -* optimising scheduling of observations for given target lists and telescope slew speed / exposure lengths for a given night or even month / year -* contribute sun / moon rise / set functionality to astropy coordinates -* a desktop or web GUI +- creating typical tables and plots for observation planning +- optimising scheduling of observations for given target lists and telescope slew speed / exposure lengths for a given night or even month / year +- contribute sun / moon rise / set functionality to astropy coordinates +- a desktop or web GUI The project could start with a look at the functionality of existing tools and then gather some input on the astropy mailing list what the community wants. The student should have an interest in coordinates, observations planning / scheduling and plotting / GUIs. +## Contribute gamma-ray data analysis methods to Gammapy -### Contribute gamma-ray data analysis methods to Gammapy - -*Suggested Mentor(s):* [Christoph Deil](http://github.com/cdeil), [Axel Donath](http://github.com/adonath) +_Suggested Mentor(s):_ [Christoph Deil](http://github.com/cdeil), [Axel Donath](http://github.com/adonath) -*Difficulty:* Beginner to intermediate +_Difficulty:_ Beginner to intermediate -*Astronomy knowledge needed:* Basic +_Astronomy knowledge needed:_ Basic -*Programming skills:* Python +_Programming skills:_ Python -#### Description +### Description [Gammapy](https://docs.gammapy.org/) is an Astropy-affiliated package to simulate and analyse data from gamma-ray telescopes such as Fermi, H.E.S.S. and CTA. A lot of basic functionality is still missing, specifically we think that contributing to one of the sub-packages gammapy.background (background modeling), gammapy.detect (source detection methods) or gammapy.spectrum (spectral analysis methods) would be a good GSoC project if you are interested in implementing specific established data analysis algorithms (e.g. adaptive-ring or reflected region or template background estimation, or spectrum forward-folding or unfolding methods) used in gamma-ray astronomy (but no prior gamma-ray data experience / knowledge needed). +## Astropy Acknowledgement/Citation Generator -### Astropy Acknowledgement/Citation Generator - -*Suggested Mentor(s):* [Erik Tollerud](http://github.com/eteq) +_Suggested Mentor(s):_ [Erik Tollerud](http://github.com/eteq) -*Difficulty:* Beginner to Intermediate +_Difficulty:_ Beginner to Intermediate -*Astronomy knowledge needed:* none, although some experience with astronomy citation practices might be useful +_Astronomy knowledge needed:_ none, although some experience with astronomy citation practices might be useful -*Programming skills:* Python and LaTeX/BibTeX +_Programming skills:_ Python and LaTeX/BibTeX -#### Description +### Description Some parts of Astropy and affiliated packages use algorithms or tools that have been published in the scientific literature (this includes Astropy itself). To @@ -72,31 +71,31 @@ have it print or write a file that tells them what papers to cite. Bonus points if this actually can show BibTeX or LaTeX bibliography entries that can be just dropped into papers with minimal effort on the part of the user. -### Adding further spectral standards to specutils +## Adding further spectral standards to specutils -*Suggested Mentor(s)*: Adam Ginsburg & Wolfgang Kerzendorf +_Suggested Mentor(s)_: Adam Ginsburg & Wolfgang Kerzendorf -*Difficulty*: Intermediate +_Difficulty_: Intermediate -*Programming skills*: Python +_Programming skills_: Python -#### Description +### Description -Specutils is a package within the astropy collection that deals with operations with spectra. Apart from imaging, spectra are the second main data product in astronomy. While imaging data is collected by hooking a giant DSLR at the end of telescope and sticking coloured glass between telescope and DSLR (a filter), spectra are obtained by breaking light up into its components and then observing the resulting distribution. These data are saved in a variety of formats. +Specutils is a package within the astropy collection that deals with operations with spectra. Apart from imaging, spectra are the second main data product in astronomy. While imaging data is collected by hooking a giant DSLR at the end of telescope and sticking coloured glass between telescope and DSLR (a filter), spectra are obtained by breaking light up into its components and then observing the resulting distribution. These data are saved in a variety of formats. -Currently, we are able to read and write a subset of standards that are out there. As a project, we suggest to implement the remaining unsupported standards. All of the code is in Python and a good understanding of classes is needed for this project. +Currently, we are able to read and write a subset of standards that are out there. As a project, we suggest to implement the remaining unsupported standards. All of the code is in Python and a good understanding of classes is needed for this project. -### Improve pyregion and pyds9 +## Improve pyregion and pyds9 -*Suggested Mentor(s):* [Christoph Deil](http://github.com/cdeil) +_Suggested Mentor(s):_ [Christoph Deil](http://github.com/cdeil) -*Difficulty:* Intermediate +_Difficulty:_ Intermediate -*Astronomy knowledge needed:* Basic +_Astronomy knowledge needed:_ Basic -*Programming skills:* Python +_Programming skills:_ Python -#### Description +### Description The pyregion package is very useful to work with ds9 and CIAO region files. It is now at @@ -115,29 +114,26 @@ interested in sky coordinates and regions, parsing, visualisation, writing tests and docs, and for the ds9 interfaces some Cython coding is probably needed. -### Revamp astropython.org web site +## Revamp astropython.org web site -*Suggested Mentor(s):* Tom Aldcroft +_Suggested Mentor(s):_ Tom Aldcroft -*Difficulty:* Intermediate +_Difficulty:_ Intermediate -*Astronomy knowledge needed:* Basic / none +_Astronomy knowledge needed:_ Basic / none -*Programming skills:* Python, web development (javascript etc) +_Programming skills:_ Python, web development (javascript etc) -#### Description +### Description The [http://www.astropython.org](http://www.astropython.org) site is one of the top two generic informational / resource sites about Python in astronomy. This site uses Google App Engine and is basically all custom code built around the bloggart engine. Currently it is getting a bit stale for a few reasons: -* There is no good mechanism for guest posting to expand the community of people contributing. -* It is painful to add content because of the antiquated entry interface which now seems to work only on firefox. -* The comment system is lacking (no feedback to comment authors etc). -* The website code itself is convoluted and difficult to maintain / improve - -The proposal is to start over with all modern tools to bring fresh energy and involvement into this project. All details of how to do this to be determined, but one requirement is to migrate all the current content. Part of this would be re-evaluating current resources as well as digging around to freshen up the resource list. - - +- There is no good mechanism for guest posting to expand the community of people contributing. +- It is painful to add content because of the antiquated entry interface which now seems to work only on firefox. +- The comment system is lacking (no feedback to comment authors etc). +- The website code itself is convoluted and difficult to maintain / improve +The proposal is to start over with all modern tools to bring fresh energy and involvement into this project. All details of how to do this to be determined, but one requirement is to migrate all the current content. Part of this would be re-evaluating current resources as well as digging around to freshen up the resource list. diff --git a/gsoc/gsoc2015/ideas_chiantipy.md b/src/content/pages/gsoc/2015/ideas_chiantipy.md similarity index 50% rename from gsoc/gsoc2015/ideas_chiantipy.md rename to src/content/pages/gsoc/2015/ideas_chiantipy.md index 364f90d4..2d348e3b 100644 --- a/gsoc/gsoc2015/ideas_chiantipy.md +++ b/src/content/pages/gsoc/2015/ideas_chiantipy.md @@ -1,44 +1,45 @@ --- -layout: default -title: "Ideas for ChiantiPy" +title: "Ideas for ChiantiPy" show_main: false ideas_team: ChiantiPy --- -### GUI Spectral Explorer +# Ideas for ChiantiPy -*Suggested Mentor(s):* [Ken Dere](http://sourceforge.net/u/kdere/profile/) +## GUI Spectral Explorer -*Difficulty:* Intermediate +_Suggested Mentor(s):_ [Ken Dere](http://sourceforge.net/u/kdere/profile/) -*Astronomy knowledge needed:* A basic understand of astrophysical spectroscopy +_Difficulty:_ Intermediate -*Programming skills:* Python +_Astronomy knowledge needed:_ A basic understand of astrophysical spectroscopy -#### Description +_Programming skills:_ Python + +### Description The goal of this project is to provide a graphical user interface to enable a user to explore observed spectra and compare it with -theoretical spectra. The basis for the theoretical spectra is the +theoretical spectra. The basis for the theoretical spectra is the CHIANTI atomic database for astrophysical spectroscopy that was -first released in 1997. Programmatic access to the database, which +first released in 1997. Programmatic access to the database, which is freely available, is provided by the ChiantiPy package -- a pure -python package. It is highly object oriented with each ion, such as -Fe XVII, being the basic object. Higher level objects are often +python package. It is highly object oriented with each ion, such as +Fe XVII, being the basic object. Higher level objects are often assembled from a collection of ions, such as when calculating a -spectrum. ChiantiPy uses the CHIANTI database to calculate line and +spectrum. ChiantiPy uses the CHIANTI database to calculate line and continuum intensities as a function of temperature, electron density. This can be done for a set of elemental abundances in -CHIANTI or for a user provided set of elemental abundances. At +CHIANTI or for a user provided set of elemental abundances. At present, if a user wants to compare CHIANTI theoretical spectra it -must be done on a case-by-case basis. A GUI explorer, written in +must be done on a case-by-case basis. A GUI explorer, written in Python and preferably PyQt or Wx based, will provide an integrated tool to import observed spectra and plot them alongside theoretical -spectra. It will further allow the user to understand what spectra +spectra. It will further allow the user to understand what spectra lines contribute to various spectral line profile, how the predicted spectra vary as a function of temperature and density. It will be necessary to develop techniques to import observed -spectra from a variety sources. Typical sources are in FITS files, -HDF5 files, or csv files. It will also be important to allow users +spectra from a variety sources. Typical sources are in FITS files, +HDF5 files, or csv files. It will also be important to allow users import their data through modules of their own. diff --git a/gsoc/gsoc2015/ideas_sunpy.md b/src/content/pages/gsoc/2015/ideas_sunpy.md similarity index 79% rename from gsoc/gsoc2015/ideas_sunpy.md rename to src/content/pages/gsoc/2015/ideas_sunpy.md index 40a23ca0..30b39fff 100644 --- a/gsoc/gsoc2015/ideas_sunpy.md +++ b/src/content/pages/gsoc/2015/ideas_sunpy.md @@ -1,21 +1,23 @@ --- -layout: default -title: "Ideas for sunpy" +title: "Ideas for sunpy" show_main: false ideas_team: SunPy --- -### Improvements to the SunPy Database +# Ideas for sunpy -*Suggested Mentor(s):* [Stuart Mumford](http://github.com/Cadair), [Steven Christe](http://github.com/ehsteve) +## Improvements to the SunPy Database -*Difficulty:* Beginner +_Suggested Mentor(s):_ [Stuart Mumford](http://github.com/Cadair), [Steven Christe](http://github.com/ehsteve) -*Astronomy knowledge needed:* None +_Difficulty:_ Beginner -*Programming skills:* Python, some database knowledge would be helpful, but not required. +_Astronomy knowledge needed:_ None + +_Programming skills:_ Python, some database knowledge would be helpful, but not required. + +### Description -#### Description The `database` module provides functionality to users to manage collections of files on disk in a way not reliant upon folder structure and file name. The database allows users to find files on disk by either physical parameters, such as wavelength and time or properties of the instrument such as name and spacecraft. It also allows more complex queries by enabling searches of the raw meta data associated with the files. @@ -26,21 +28,19 @@ The improvements to the database functionality that would be implemented by this 1. Support for relative paths in the database module [#783](https://github.com/sunpy/sunpy/issues/783) to allow a centralised database with multiple users, all referencing a central file store mounted with different absolute paths on each client. 1. Supporting all data supported by the `sunpy.lightcurve` module in the database. The major hurdle here is the lack of standardisation in the file used by this data. -There are various other maintenance tasks which need undertaking (https://github.com/sunpy/sunpy/labels/Database) which would be a good way for someone interested in this project to familiarise themselves with the codebase. - +There are various other maintenance tasks which need undertaking () which would be a good way for someone interested in this project to familiarise themselves with the codebase. +## Integrating ChiantiPy and SunPy -### Integrating ChiantiPy and SunPy +_Suggested Mentor(s):_ [Dan Ryan](https://github.com/DanRyanIrish), [Ken Dere](http://sourceforge.net/u/kdere/profile/) -*Suggested Mentor(s):* [Dan Ryan](https://github.com/DanRyanIrish), [Ken Dere](http://sourceforge.net/u/kdere/profile/) +_Difficulty:_ Beginner -*Difficulty:* Beginner +_Astronomy knowledge needed:_ Some knowledge of spectra. -*Astronomy knowledge needed:* Some knowledge of spectra. +_Programming skills:_ Python. -*Programming skills:* Python. - -#### Description +### Description The [CHIANTI](http://www.chiantidatabase.org/) atomic physics database is a valuable resource for solar physics. The CHIANTI database holds a large amount of information on the physical properties of different elements in different ionisation states and enabled the calculation of various parameters from this information. Using CHIANTI it is possible to calculate the spectra of various types of solar plasma (e.g., flare, quiet sun, etc.) from the observed elemental abundances and ionisation states. These synthetic spectra are essential for comparing to the data observed by various instruments to calculate the response functions of the instruments and to compare to the properties of observed plasma to allow the calculation of physical parameters such as temperature. @@ -53,21 +53,21 @@ Other potential application of ChiantiPy in SunPy include: 1. Calculation of AIA temperature response functions from ChiantiPy contribution functions. -**Expected Outcomes**: This project would facilitate SunPy becoming independent from Solar SoftWare (SSW) in producing and maintaining files required by the sunpy.instr.goes module for determining the thermodynamic properties of the emitting plasma observed by GOES. It would also allow SunPy users to calculate spectra and exclusively through Python without relying on SSW. - +### Expected Outcomes +This project would facilitate SunPy becoming independent from Solar SoftWare (SSW) in producing and maintaining files required by the sunpy.instr.goes module for determining the thermodynamic properties of the emitting plasma observed by GOES. It would also allow SunPy users to calculate spectra and exclusively through Python without relying on SSW. -### Support for analysis of Solar Energetic Particles +## Support for analysis of Solar Energetic Particles -*Suggested Mentor(s):* [David Pérez-Suárez](http://github.com/dpshelio) +_Suggested Mentor(s):_ [David Pérez-Suárez](http://github.com/dpshelio) -*Difficulty:* Beginner +_Difficulty:_ Beginner -*Astronomy knowledge needed:* None +_Astronomy knowledge needed:_ None -*Programming skills:* Python. +_Programming skills:_ Python. -#### Description +### Description SunPy is able to read a lightcurve from different sources (GOES x-ray, Lyra, Norh,...), however these are not all. SoHO/ERNE (Energetic and Relativistic Nuclei and Electron experiment on board SoHO) measures @@ -78,19 +78,18 @@ able to read these files in as a lightcurve object and allow to perform the basic operations used when such data is analysed: eg. energy ranges binning, visualisation, ... +## Lightcurve Refactor +_Suggested Mentor(s):_ [Stuart Mumford](http://github.com/Cadair), [Dan Ryan](https://github.com/DanRyanIrish), [Andrew Inglis](https://github.com/aringlis) -### Lightcurve Refactor +_Difficulty:_ Intermediate -*Suggested Mentor(s):* [Stuart Mumford](http://github.com/Cadair), [Dan Ryan](https://github.com/DanRyanIrish), [Andrew Inglis](https://github.com/aringlis) +_Astronomy knowledge needed:_ None -*Difficulty:* Intermediate +_Programming skills:_ Python -*Astronomy knowledge needed:* None +### Description -*Programming skills:* Python - -#### Description The `Lightcurve` class is one of the three core datatypes in SunPy, along with Map and Spectra. `Lightcurve` is designed to read in, process and store meta data related to solar physics time series data. Currently, `Lightcurve` uses the pandas library as its underlying data structure, however, this is subject to change in the future. @@ -108,29 +107,26 @@ This leaves `lightcurve` in a similar position to `map` where the data acquisiti Therefore, enabling the implementation of a factory class like `Map` for the lightcurve module. -**Expected Outcomes** +### Expected Outcomes Someone under taking this project will complete the following tasks: 1. Become familiar with the `UnifiedDownloader` code, if it has not been accepted into the SunPy codebase, complete the remaining tasks for this to be achieved. 1. Re-write any new lightcurve sources that were not included in the `UnifiedDownloader` code as sources for `UnifiedDownloader`. -1. Write a factory class for `lightcurve` similar to the `sunpy.map.Map` class. This class will be a generic constructor for `lightcurve` allowing the user to instantiate any one of the many subclasses of `GenericLightcurve` present in `sunpy.lightcurve.sources`. The API design for the factory class is here: https://github.com/sunpy/sunpy-SEP/pull/6 +1. Write a factory class for `lightcurve` similar to the `sunpy.map.Map` class. This class will be a generic constructor for `lightcurve` allowing the user to instantiate any one of the many subclasses of `GenericLightcurve` present in `sunpy.lightcurve.sources`. The API design for the factory class is here: 1. Design and develop a robust method of dealing with lightcurve meta data, which can handle joining different parts of timeseries from different files, each with their own meta data. (See [#1122](https://github.com/sunpy/sunpy/issues/1122)) +## IRIS, 4D Cubes and GUI +_Suggested Mentors:_ [Steven Christe](http://github.com/ehsteve) (NASA GSFC, SunPy), [Nabil Freij](https://github.com/nabobalis) (Sheffield University) -### IRIS, 4D Cubes and GUI - -*Suggested Mentors:* [Steven Christe](http://github.com/ehsteve) (NASA GSFC, SunPy), [Nabil Freij](https://github.com/nabobalis) (Sheffield University) - -*Difficulty:* Intermediate to Expert +_Difficulty:_ Intermediate to Expert -*Astronomy knowledge needed:* None +_Astronomy knowledge needed:_ None -*Programming skills:* Python and basic knowledge of GUI design. +_Programming skills:_ Python and basic knowledge of GUI design. - -#### Description: +### Description Recently, a new Sun observing satellite was launched, called [IRIS](http://iris.lmsal.com). It performs high-resolution, multi-wavelength observations of the solar atmosphere. @@ -142,15 +138,15 @@ Using this language, a GUI was created called [CRISPEX](http://folk.uio.no/grega This project aims to create a smaller scale version that uses [Ginga](http://ejeschke.github.io/ginga/) as a backend. Ginga is a file viewer that was created with astrophysics in mind. -It allows basic manipulation of FIT files, which are the standard data container in astrophysics. +It allows basic manipulation of FIT files, which are the standard data container in astrophysics. A Python plugin will be created and integrated into Ginga, allowing the user to open 3D/4D datasets and perform basic analysis, such as, slit extraction. To achieve this, a previous ESA summer project created a cube class. While it was finished, it was never integrated into SunPy. -The code was created to hold and manipulate complex datatypes. +The code was created to hold and manipulate complex datatypes. It is similar in style to the SunPy Map Class and follows that convention. -It however, has extra features enabling specific data formats to be extracted that the user requires, for example, a spectrum. -The student will need to become familiar with this code, as small tweaks need to occur before it is added to SunPy. +It however, has extra features enabling specific data formats to be extracted that the user requires, for example, a spectrum. +The student will need to become familiar with this code, as small tweaks need to occur before it is added to SunPy. Finally, the plugin will be created using Python. However, a background in QT would ideally be needed but it is not necessary. @@ -165,4 +161,3 @@ Plugin Features: Sunpy Feature: 1. Full IRIS support. - diff --git a/gsoc/gsoc2015/ideas_yt.md b/src/content/pages/gsoc/2015/ideas_yt.md similarity index 56% rename from gsoc/gsoc2015/ideas_yt.md rename to src/content/pages/gsoc/2015/ideas_yt.md index 3773fd99..e9f04816 100644 --- a/gsoc/gsoc2015/ideas_yt.md +++ b/src/content/pages/gsoc/2015/ideas_yt.md @@ -1,23 +1,24 @@ --- -layout: default -title: "Ideas for yt" +title: "Ideas for yt" show_main: false ideas_team: yt --- -### Enable volume rendering of octree datasets +# Ideas for yt -*Suggested Mentor(s):* Matthew Turk, Sam Skillman +## Enable volume rendering of octree datasets -*Difficulty:* Intermediate +_Suggested Mentor(s):_ Matthew Turk, Sam Skillman -*Astronomy knowledge needed:* None +_Difficulty:_ Intermediate -*Programming skills:* Familiarity with Python and Cython, and a familiarity with data structures such as octrees and B-trees. +_Astronomy knowledge needed:_ None -#### Description +_Programming skills:_ Familiarity with Python and Cython, and a familiarity with data structures such as octrees and B-trees. -At present, volume rendering in yt works best with patch-based AMR datasets. Extending this to support octree datasets will enable a much greater diversity of data types and formats to be visualized in this way. +### Description + +At present, volume rendering in yt works best with patch-based AMR datasets. Extending this to support octree datasets will enable a much greater diversity of data types and formats to be visualized in this way. This would include several specific, concrete actions: @@ -25,17 +26,17 @@ This would include several specific, concrete actions: 1. Refactoring grid traversal methods to travel along the octree data structure without explicit parentage links (i.e., using built-in neighbor-finding functions) 1. Optimizing for parallel decomposition of octrees in this way -### Implementation of deep image format +## Implementation of deep image format -*Suggested Mentor(s):* Matthew Turk, Kacper Kowalik +_Suggested Mentor(s):_ Matthew Turk, Kacper Kowalik -*Difficulty:* Advanced +_Difficulty:_ Advanced -*Astronomy knowledge needed:* None +_Astronomy knowledge needed:_ None -*Programming skills:* Familiarity with Python and Cython, and a familiarity with z-buffering. +_Programming skills:_ Familiarity with Python and Cython, and a familiarity with z-buffering. -#### Description +### Description Deep image compositing can be used to create a notion of depth. This could be utilized for multi-level rendering, rendering of semi-transparent streamlines inside volumes. @@ -44,17 +45,17 @@ This would require: 1. Developing a sparse image format data container 1. Utilizing aforementioned container for multi-level rendering -### Volume Traversal +## Volume Traversal -*Suggested Mentor(s):* Matthew Turk, Sam Skillman +_Suggested Mentor(s):_ Matthew Turk, Sam Skillman -*Difficulty:* Advanced +_Difficulty:_ Advanced -*Astronomy knowledge needed:* None +_Astronomy knowledge needed:_ None -*Programming skills:* Familiarity with Python and Cython, and a familiarity with data structures such as octrees and B-trees. +_Programming skills:_ Familiarity with Python and Cython, and a familiarity with data structures such as octrees and B-trees. -#### Description +### Description Currently yt uses several objects that utilize brick decomposition, i.e. a process by which overlapping grids are broken apart until a full tessellation of the domain (or data source) is created with no overlaps. This is done by the kD-tree decomposition. This project aims to enhance current capabilities by providing easy mechanisms for creating volume traversal mechanisms. There are two components to this: handling tiles of data, and creating fast methods for passing through the data and moving between tiles. @@ -62,11 +63,14 @@ This would require: 1. Creating flexible (in terms of ordering) iterator over the "tiles" that compose a given data object 1. Designing and implementing object for storing values returned by aforementioned iterator, that would: - * Cache a slice of the grid or data object that it operates on - * Filter particles from the data object it operates on - * Provide a mechanism for identifying neighbor objects from a given face index. - * Provide mechanisms for generating vertex-centered data or cell-centered data quickly + +- Cache a slice of the grid or data object that it operates on +- Filter particles from the data object it operates on +- Provide a mechanism for identifying neighbor objects from a given face index. +- Provide mechanisms for generating vertex-centered data or cell-centered data quickly + 1. Implement a mechanism for integrating paths through tiles, that would: - * define a method for determining when a ray has left an object - * define a method for selecting the next brick to traverse or connect to - * update the value of a ray's direction + +- define a method for determining when a ray has left an object +- define a method for selecting the next brick to traverse or connect to +- update the value of a ray's direction diff --git a/src/content/pages/gsoc/2016/ideas.md b/src/content/pages/gsoc/2016/ideas.md new file mode 100644 index 00000000..fcfe4492 --- /dev/null +++ b/src/content/pages/gsoc/2016/ideas.md @@ -0,0 +1,19 @@ +--- +title: "Ideas page for Google Summer of Code 2016" +show_main: false +--- + +# Ideas page for Google Summer of Code 2016 + +## Ideas page for GSoC 2016 + +Browse ideas for the following projects: + +- [IMS](../ideas_eras/) +- [CasaCore](../ideas_casacore/) +- [JuliaAstro](../ideas_juliaastro/) +- [yt](../ideas_yt/) +- [Astropy](../ideas_astropy/) +- [SunPy](../ideas_sunpy/) + +For each participating project, the ideas are organized from easiest to hardest. diff --git a/gsoc/gsoc2016/ideas_astropy.md b/src/content/pages/gsoc/2016/ideas_astropy.md similarity index 63% rename from gsoc/gsoc2016/ideas_astropy.md rename to src/content/pages/gsoc/2016/ideas_astropy.md index f02d4d2e..71e433ee 100644 --- a/gsoc/gsoc2016/ideas_astropy.md +++ b/src/content/pages/gsoc/2016/ideas_astropy.md @@ -1,82 +1,80 @@ --- -layout: default -title: "Ideas for Astropy" +title: "Ideas for Astropy" show_main: false ideas_team: Astropy --- +# Ideas for Astropy + If you are interested in one of the following Astropy Project ideas please see the [Astropy GSoC 2016 Guidelines](https://github.com/astropy/astropy/wiki/GSoC-2016-Guidelines) for additional information that is specific to Astropy. -### Implement Scheduling capabilities for Astroplan +## Implement Scheduling capabilities for Astroplan -*Suggested Mentor(s):* [Erik Tollerud](http://github.com/eteq), [Eric Jeschke](https://github.com/ejeschke), [Josh Walawender](https://github.com/joshwalawender) +_Suggested Mentor(s):_ [Erik Tollerud](http://github.com/eteq), [Eric Jeschke](https://github.com/ejeschke), [Josh Walawender](https://github.com/joshwalawender) -*Difficulty:* Beginner to Intermediate +_Difficulty:_ Beginner to Intermediate -*Astronomy knowledge needed:* Basic understanding of how astronomy observations work, practical experience a plus +_Astronomy knowledge needed:_ Basic understanding of how astronomy observations work, practical experience a plus -*Programming skills:* Python +_Programming skills:_ Python -#### Description +### Description The [astroplan](http://astroplan.readthedocs.org/en/latest/) affiliated package is an Astropy affiliated package that provides tools for planning observations. One valuable feature that astroplan could provide is basic scheduling capabilities for an observing run. Many large observatories have their own schedulers, but this package would be targeted at the needs of the typical individual or small-collaboration observing run. While some initial efforts have occurred, this project would involve expanding those efforts into a full-fledged API and implementing both the interface and the actual scheduler(s). +## Ephemerides for Solar System objects in Astropy -### Ephemerides for Solar System objects in Astropy - -*Suggested Mentor(s):* [Marten van Kerkwijk](http://github.com/mhvk), [Erik Tollerud](http://github.com/eteq) - -*Difficulty:* Beginner to Intermediate +_Suggested Mentor(s):_ [Marten van Kerkwijk](http://github.com/mhvk), [Erik Tollerud](http://github.com/eteq) -*Astronomy knowledge needed:* Some understanding of astronomical coordinate systems, basic knowledge of solar system dynamics (or ability to learn as-needed to implement the specific algorithms required) +_Difficulty:_ Beginner to Intermediate -*Programming skills:* Python, some knowledge of C might be helpful +_Astronomy knowledge needed:_ Some understanding of astronomical coordinate systems, basic knowledge of solar system dynamics (or ability to learn as-needed to implement the specific algorithms required) -#### Description +_Programming skills:_ Python, some knowledge of C might be helpful -An often-requested missing feature in Astropy is the ability to compute ephemerides: the on-sky location of Solar System objects like the planets, asteroids, or artificial satellites. This project would involve implementing just this feature. This will likely *start* with implementing a `get_moon` function similar to the existing `get_sun` to familiarize the student with the important concepts in the `astropy.coordinates` subpackage. The larger part of the project will likely involve using the orbital elements that the JPL Solar System dynamics group has already complied (there is already a package to read these files: [JPLEphem](https://pypi.python.org/pypi/jplephem)), and translate those into the Astropy coordinates framework. The student will implement these algorithms and also collaborate with the mentors and Astropy community to develop an API to access this machinery. +### Description +An often-requested missing feature in Astropy is the ability to compute ephemerides: the on-sky location of Solar System objects like the planets, asteroids, or artificial satellites. This project would involve implementing just this feature. This will likely _start_ with implementing a `get_moon` function similar to the existing `get_sun` to familiarize the student with the important concepts in the `astropy.coordinates` subpackage. The larger part of the project will likely involve using the orbital elements that the JPL Solar System dynamics group has already complied (there is already a package to read these files: [JPLEphem](https://pypi.python.org/pypi/jplephem)), and translate those into the Astropy coordinates framework. The student will implement these algorithms and also collaborate with the mentors and Astropy community to develop an API to access this machinery. -### Implement Public API for ERFA +## Implement Public API for ERFA -*Suggested Mentor(s):* [Erik Tollerud](http://github.com/eteq), [Tom Aldcroft](http://github.com/taldcroft) +_Suggested Mentor(s):_ [Erik Tollerud](http://github.com/eteq), [Tom Aldcroft](http://github.com/taldcroft) -*Difficulty:* Intermediate to Expert +_Difficulty:_ Intermediate to Expert -*Astronomy knowledge needed:* None required, but may be helpful for understanding ERFA functionality +_Astronomy knowledge needed:_ None required, but may be helpful for understanding ERFA functionality -*Programming skills:* Python, Cython, C +_Programming skills:_ Python, Cython, C -#### Description +### Description Some of the major functionality for Astropy uses the ERFA C library (adapted from the IAU SOFA library) as the back-end for -computational "heavy-lifting". Members of the community have expressed a desire to use this lower-level python wrapper -around ERFA for other purposes that may not be directly relevant for Astropy. So this project would involve making the -necessary changes to make the ERFA python API public. This includes: +computational "heavy-lifting". Members of the community have expressed a desire to use this lower-level python wrapper +around ERFA for other purposes that may not be directly relevant for Astropy. So this project would involve making the +necessary changes to make the ERFA python API public. This includes: -* Getting the documentation up to the astropy standard (currently it is mostly auto-generated verbatim from the C comments). -* Implementing a more complete test suite for the python side of the code. -* Possibly moving it to a separate package as part of the liberfa GitHub organization. This would also include making the necessary +- Getting the documentation up to the astropy standard (currently it is mostly auto-generated verbatim from the C comments). +- Implementing a more complete test suite for the python side of the code. +- Possibly moving it to a separate package as part of the liberfa GitHub organization. This would also include making the necessary changes to ensure everything continues to work in Astropy. -* Any other steps necessary to ensure the resulting package (or sub-package of Astropy) is stable and relatively easy to use. +- Any other steps necessary to ensure the resulting package (or sub-package of Astropy) is stable and relatively easy to use. +## Web development for Gammapy -### Web development for Gammapy +_Suggested Mentor(s):_ [Christoph Deil](https://github.com/cdeil), [Johannes King](https://github.com/joleroi) -*Suggested Mentor(s):* [Christoph Deil](https://github.com/cdeil), [Johannes King](https://github.com/joleroi) +_Difficulty:_ Intermediate to Expert -*Difficulty:* Intermediate to Expert +_Astronomy knowledge needed:_ None. -*Astronomy knowledge needed:* None. +_Programming skills:_ Scientific python (Numpy, Scipy, Astropy), Web development (Python backend, Javascript frontend) -*Programming skills:* Scientific python (Numpy, Scipy, Astropy), Web development (Python backend, Javascript frontend) - -#### Description +### Description [Gammapy](https://docs.gammapy.org/) is a Python package for professional gamma-ray astronomers. We are looking for a web developer with good @@ -94,21 +92,20 @@ or Python web apps that let us browse the gamma-ray data and analysis results, basically a web GUI for Gammapy. That project would mostly be Python web app development, and you have to learn a bit more about Gammapy before GSoC starts. +## Data analysis for Gammapy -### Data analysis for Gammapy - -*Suggested Mentor(s):* [Christoph Deil](https://github.com/cdeil), [Johannes King](https://github.com/joleroi) +_Suggested Mentor(s):_ [Christoph Deil](https://github.com/cdeil), [Johannes King](https://github.com/joleroi) -*Difficulty:* Intermediate to Expert +_Difficulty:_ Intermediate to Expert -*Astronomy knowledge needed:* Some, e.g. sky coordinates and projections. +_Astronomy knowledge needed:_ Some, e.g. sky coordinates and projections. Experience with X-ray or gamma-ray data analysis (e.g. Fermi-LAT) is a plus, but not a requirement. -*Method knowledge needed:* Some experience in data analysis (e.g. images, regions) and statistics (e.g. Poisson noise). +_Method knowledge needed:_ Some experience in data analysis (e.g. images, regions) and statistics (e.g. Poisson noise). -*Programming skills:* Python (including pytest and Sphinx) and scientific python (Numpy, Scipy, Astropy) +_Programming skills:_ Python (including pytest and Sphinx) and scientific python (Numpy, Scipy, Astropy) -#### Description +### Description [Gammapy](https://docs.gammapy.org/) is a Python package for professional gamma-ray astronomers. We are looking for someone that's interested @@ -121,21 +118,21 @@ and docs) as well as grunt work that's needed to go towards production quality and a Gammapy 1.0 release this fall (e.g. set up continuous integration for example IPython notebooks or adding more tests). To get an idea of what is going on in Gammapy and what still needs to be done, please check out the project on -Github (https://github.com/gammapy/gammapy) and browse the documentation a bit +Github () and browse the documentation a bit (or try out the examples) and if this looks interesting to you, send us an email and let us know what your skills and interests are. -### Implement PSF photometry for fitting several overlapping objects at once +## Implement PSF photometry for fitting several overlapping objects at once -*Suggested Mentor(s):* [Moritz Guenther](https://github.com/hamogu), [Brigitta Sipocz](https://github.com/bsipocz) +_Suggested Mentor(s):_ [Moritz Guenther](https://github.com/hamogu), [Brigitta Sipocz](https://github.com/bsipocz) -*Difficulty:* Intermediate to Expert +_Difficulty:_ Intermediate to Expert -*Astronomy knowledge needed:* basic understanding of what photometry is +_Astronomy knowledge needed:_ basic understanding of what photometry is -*Programming skills:* Python +_Programming skills:_ Python -#### Description +### Description The [photutils](http://photutils.readthedocs.org/en/latest/) package is an Astropy affiliated package that provides tools for photometry (measuring how bright a source is). @@ -143,23 +140,21 @@ There are several ways to do photometry and the package currently implements ape This project includes looking at other astronomy codes to see how they tackle the problem; select, modify and improve an algorithm that fits into the astropy modelling framework; implement this in python; and, if it turns out that speed is a problem, move speed-critical parts to Cython. To verify that the new code works, we will compare it to the solutions of established PSF photometry codes. -See https://github.com/OpenAstronomy/openastronomy.github.io/pull/27 for a discussion of some problems and possible solutions that will be addressed in this project. - +See for a discussion of some problems and possible solutions that will be addressed in this project. -### Bridge sherpa and astropy fitting +## Bridge sherpa and astropy fitting -*Suggested Mentor(s):* D. Burke, T. Aldcroft, H. M. Guenther +_Suggested Mentor(s):_ D. Burke, T. Aldcroft, H. M. Guenther -*Difficulty:* Expert or better +_Difficulty:_ Expert or better -*Astronomy knowledge needed:* fitting functions and statistics +_Astronomy knowledge needed:_ fitting functions and statistics -*Programming skills:* Python, C, Cython +_Programming skills:_ Python, C, Cython -#### Description +### Description - -Both astropy and Sherpa (https://github.com/sherpa/sherpa/) provide modelling and fitting capabilities; however, Sherpa's features are way +Both astropy and Sherpa () provide modelling and fitting capabilities; however, Sherpa's features are way more advanced. Sherpa provides far more build-in models, a larger choice of optimizers and a real variety of fit statistics. Unfortunately Sherpa is less well known and for historical reasons the object-oriented user interface is less polished than the functional state-based interface. @@ -173,43 +168,45 @@ This project requires the student to get proficient in two major packages (Not a just a few weeks of GSoC it will give astropy users access to fitting capabilites that required many years of developer time and that are unfeasable redevelop from scratch. +## Enhancements to Ginga, a Toolkit for Building Scientific Image Viewers -### Enhancements to Ginga, a Toolkit for Building Scientific Image Viewers - -*Suggested Mentor(s):* [Eric Jeschke](https://github.com/ejeschke), [Pey-Lian Lim](https://github.com/pllim), [Nabil Freij](https://github.com/nabobalis) +_Suggested Mentor(s):_ [Eric Jeschke](https://github.com/ejeschke), [Pey-Lian Lim](https://github.com/pllim), [Nabil Freij](https://github.com/nabobalis) -*Difficulty:* Beginning to Advanced, depending on project choices +_Difficulty:_ Beginning to Advanced, depending on project choices -*Astronomy knowledge needed:* Some, depending on project choices +_Astronomy knowledge needed:_ Some, depending on project choices -*Programming skills:* Python and scientific python (Numpy, Scipy, Astropy), git version control +_Programming skills:_ Python and scientific python (Numpy, Scipy, Astropy), git version control -*Desirable:* OpenCL, Javascript/web sockets, C/C++ programming, experience in image or array processing, concurrent programming, experience in using GUI toolkits, github-based workflow +_Desirable:_ OpenCL, Javascript/web sockets, C/C++ programming, experience in image or array processing, concurrent programming, experience in using GUI toolkits, github-based workflow -#### Description +### Description [Ginga](https://ejeschke.github.io/ginga/) is a toolkit for constructing scientific image viewers in Python, with an emphasis toward astronomy. Ginga is being used at a number of observatories and institutes for observation and instrument control, quick look, custom data reduction and analysis tasks. The general aim is to build upon this toolkit improving its current features and to expand this toolkit in order for scientists to be able to easily accomplish preliminary data analysis. We are looking for an individual to work on a few select project areas, depending on skill level and interest. Each project area itself would form a small part of the overall GSOC project. Essentially it would be a large pick and mix but do not let this put you off. This method would allow a range of different contributions to be made the Ginga toolkit that are for your choosing. Beginning-level: -* Improve and expand Ginga's unit test suite and coverage -* Improve documentation and tutorials, including via Jupyter notebooks and video voice-overs -* Improve our "native app" packaging for Mac, Unix and Windows -* Improving LineProfile and Slit plugins -* Enhance existing plugins by adding GUIs for some common tasks like configuring catalog sources, which are currently done by editing config files -* Add support for loading broken FITS files by ["fingerprinting" them] (https://github.com/ejeschke/ginga/issues/205) + +- Improve and expand Ginga's unit test suite and coverage +- Improve documentation and tutorials, including via Jupyter notebooks and video voice-overs +- Improve our "native app" packaging for Mac, Unix and Windows +- Improving LineProfile and Slit plugins +- Enhance existing plugins by adding GUIs for some common tasks like configuring catalog sources, which are currently done by editing config files +- Add support for loading broken FITS files by ["fingerprinting" them] () Intermediate-level: -* Improve Ginga backends for web browsers (native javascript/web sockets and/or Jupyter notebooks and/or Bokeh server) -* Enhancements to "traditional" GUI backends (e.g. add support for gtk3, AGG support for python 3, improvements to Qt-based widgets) -* Graft the astropy-helpers package into Ginga -* Adding support for calculating approximate line-of-sight velocities -* Enhance existing plugins for data analysis tasks, usually featuring astropy or affiliated packages + +- Improve Ginga backends for web browsers (native javascript/web sockets and/or Jupyter notebooks and/or Bokeh server) +- Enhancements to "traditional" GUI backends (e.g. add support for gtk3, AGG support for python 3, improvements to Qt-based widgets) +- Graft the astropy-helpers package into Ginga +- Adding support for calculating approximate line-of-sight velocities +- Enhance existing plugins for data analysis tasks, usually featuring astropy or affiliated packages Advanced-level: -* Implement an OpenCL module that leverages CPU and GPU resources for accelerating some common image processing operations (scaling, transformations, rotations) on numpy image arrays. Benchmark against current CPU based solutions. -* Improving IO speeds by optimizing use of astropy.fits.io/cfitsio/numpy, lazy reads, file caching hints, optimizing concurrency, etc. -* Adding support for a binary file format used by a very popular ground-based solar telescope and extending it to support Stokes data products + +- Implement an OpenCL module that leverages CPU and GPU resources for accelerating some common image processing operations (scaling, transformations, rotations) on numpy image arrays. Benchmark against current CPU based solutions. +- Improving IO speeds by optimizing use of astropy.fits.io/cfitsio/numpy, lazy reads, file caching hints, optimizing concurrency, etc. +- Adding support for a binary file format used by a very popular ground-based solar telescope and extending it to support Stokes data products If you are interested in working on any of these aspects, or want to propose some other work on Ginga, please sign in to Github and comment on [Assist the Ginga Project](https://github.com/ejeschke/ginga/issues/287). diff --git a/gsoc/gsoc2016/ideas_casacore.md b/src/content/pages/gsoc/2016/ideas_casacore.md similarity index 62% rename from gsoc/gsoc2016/ideas_casacore.md rename to src/content/pages/gsoc/2016/ideas_casacore.md index 1640edd8..dc42d2f7 100644 --- a/gsoc/gsoc2016/ideas_casacore.md +++ b/src/content/pages/gsoc/2016/ideas_casacore.md @@ -1,74 +1,75 @@ --- -layout: default -title: "Ideas for CasaCore" +title: "Ideas for CasaCore" show_main: false ideas_team: CasaCore --- -### Improve Python bindings to CasaCore measures +# Ideas for CasaCore -*Suggested Mentor(s):* [Ger van Diepen](http://github.com/gervandiepen), [Tammo Jan Dijkema](https://github.com/tammojan) +## Improve Python bindings to CasaCore measures -*Difficulty:* Intermediate +_Suggested Mentor(s):_ [Ger van Diepen](http://github.com/gervandiepen), [Tammo Jan Dijkema](https://github.com/tammojan) -*Astronomy knowledge needed:* Some understanding of astronomical coordinate systems and transformations +_Difficulty:_ Intermediate -*Programming skills:* Python, some C++ +_Astronomy knowledge needed:_ Some understanding of astronomical coordinate systems and transformations -#### Description +_Programming skills:_ Python, some C++ -CasaCore contains many features to perform astronomical coordinate transformations, for example from B1950 to J2000, or from J2000 to Azimuth-Elevation. Moreover, it can compute ephemerides, which may make it useful for many other projects. See http://casacore.github.io/casacore-notes/233 +### Description + +CasaCore contains many features to perform astronomical coordinate transformations, for example from B1950 to J2000, or from J2000 to Azimuth-Elevation. Moreover, it can compute ephemerides, which may make it useful for many other projects. See The current python binding [python-casacore](http://casacore.github.io/python-casacore/) contains a python binding to the measures library, but this is not a very programmer friendly binding, and thus not much used. An interface to measures exists within CasaCore that makes converting coordinates much easier. This interface was written with TaQL in mind. This project concerns modifying the TaQL measures interface to a python measures interface, thus making casacore measures easily accessible from Python +## Frequency conversions for TaQL / python-casacore -### Frequency conversions for TaQL / python-casacore - -*Suggested Mentor(s):* [Ger van Diepen](http://github.com/gervandiepen), [Tammo Jan Dijkema](http://github.com/tammojan) +_Suggested Mentor(s):_ [Ger van Diepen](http://github.com/gervandiepen), [Tammo Jan Dijkema](http://github.com/tammojan) -*Difficulty:* Beginner / Intermediate +_Difficulty:_ Beginner / Intermediate -*Astronomy knowledge needed:* Some understanding of use of astronomical frequencies (regarding Doppler shifts etc.) +_Astronomy knowledge needed:_ Some understanding of use of astronomical frequencies (regarding Doppler shifts etc.) -*Programming skills:* C++ +_Programming skills:_ C++ -#### Description +### Description -The casacore measures module contains code for converting frequencies between various reference frames (e.g. Rest frequency, Geocentric, Topocentric, Galacto centric). Having this module available in TaQL would make it much more convenient to perform these kind of conversions. Example code exists for other conversions, see e.g. http://casacore.github.io/casacore/group__MeasUDF__module.html +The casacore measures module contains code for converting frequencies between various reference frames (e.g. Rest frequency, Geocentric, Topocentric, Galacto centric). Having this module available in TaQL would make it much more convenient to perform these kind of conversions. Example code exists for other conversions, see e.g. This project concerns writing such a converter for the Doppler and Frequency conversions. It will require tweaking in boost-python, but since the example code is available for other measures, it should not be too hard. -### General python-casacore cleanup +## General python-casacore cleanup -*Suggested Mentor(s):* [Gijs Molenaar](http://github.com/gijzelaerr), [Ger van Diepen](http://github.com/gervandiepen) +_Suggested Mentor(s):_ [Gijs Molenaar](http://github.com/gijzelaerr), [Ger van Diepen](http://github.com/gervandiepen) -*Difficulty:* Intermediate +_Difficulty:_ Intermediate -*Astronomy knowledge needed:* none +_Astronomy knowledge needed:_ none -*Programming skills:* python +_Programming skills:_ python -#### Description +### Description The current [python-casacore](http://github.com/casacore/python-casacore) code is already much improved over the previous "pyrap" implementaion. This python binding to casacore is now python 3 compatible, contains some unit tests, etc. But some work remains to be done: - * Remove all compile warnings - * Modernise code, add missing features, maybe more 'pythonic'. - * Improve test coverage (24% at the moment) + +- Remove all compile warnings +- Modernise code, add missing features, maybe more 'pythonic'. +- Improve test coverage (24% at the moment) This is a typical project to learn making good code. -### Table plotting for python-casacore +## Table plotting for python-casacore -*Suggested Mentor(s):* [Ger van Diepen](http://github.com/gervandiepen), [Tammo Jan Dijkema](https://github.com/tammojan) +_Suggested Mentor(s):_ [Ger van Diepen](http://github.com/gervandiepen), [Tammo Jan Dijkema](https://github.com/tammojan) -*Difficulty:* Beginner +_Difficulty:_ Beginner -*Astronomy knowledge needed:* Some idea about astronomical units +_Astronomy knowledge needed:_ Some idea about astronomical units -*Programming skills:* Python +_Programming skills:_ Python -Radio interferometric data sets are almost always stored in casacore "Measurement Sets". These can be queried through TaQL, see e.g. http://casacore.github.io/casacore-notes/199 +Radio interferometric data sets are almost always stored in casacore "Measurement Sets". These can be queried through TaQL, see e.g. It would be nice to have a plotting routine in [python-casacore](http://github.com/casacore/python-casacore) to easily plot two columns against each other, which nicely formatted axes etc (possibly using wcsaxes). -This would, at the very least, make a nice extension to the taql jupyter kernel underneath http://taql.astron.nl +This would, at the very least, make a nice extension to the taql jupyter kernel underneath diff --git a/gsoc/gsoc2016/ideas_eras.md b/src/content/pages/gsoc/2016/ideas_eras.md similarity index 69% rename from gsoc/gsoc2016/ideas_eras.md rename to src/content/pages/gsoc/2016/ideas_eras.md index be6e8bf1..87fc60fd 100644 --- a/gsoc/gsoc2016/ideas_eras.md +++ b/src/content/pages/gsoc/2016/ideas_eras.md @@ -1,21 +1,22 @@ --- -layout: default -title: "Ideas for IMS - ERAS" +title: "Ideas for IMS - ERAS" show_main: false ideas_team: IMS --- -### Solar Storms forecasting server +# Ideas for IMS - ERAS -*Suggested Mentors:* [Antonio del Mastro](https://bitbucket.org/aldebran/) , [Olena Persianova](https://bitbucket.org/OPersian/) +## Solar Storms forecasting server -*Difficulty:* Intermediate to Hard +_Suggested Mentors:_ [Antonio del Mastro](https://bitbucket.org/aldebran/) , [Olena Persianova](https://bitbucket.org/OPersian/) -*Astronomy knowledge needed:* None beforehand, the student will be required to research relevant publications. +_Difficulty:_ Intermediate to Hard -*Programming skills:* advanced Python; basic Theano or TensorFlow; basic Django or Flask; experience with some ANN library, such as Keras, theanets or Lasagne. +_Astronomy knowledge needed:_ None beforehand, the student will be required to research relevant publications. -#### Description: +_Programming skills:_ advanced Python; basic Theano or TensorFlow; basic Django or Flask; experience with some ANN library, such as Keras, theanets or Lasagne. + +### Description Solar storms are responsible for disruption of satellite communication, and damage to space electronical equipments. The storms have to be taken into account also for EVA and habitat maintenance activities, as the higher levels of radiation brought by them have a detrimental effect on the crew member's health. @@ -23,17 +24,17 @@ Prediction of these storms are essential to prevent said damage. A lot of astron In this project, the student will be required to: -* Using a machine learning approach, predict the *duration* and *intensity* solar storms: - * The student should use preferably an artificial neural networks approach (although alternatives, such as random forests, SVM, bayesian models or HMMs, can be considered). - * The predictions should be given with 24-48 hs in advance of a storm (depending on viability). - * The student should evaluate training and test data provided by IMS, or find a suitable datasaet, if the data provided is unsuitable. - * The student should evaluate an approach suggested by the IMS to test the model's performance, or propose a testing procedure of his/her own. -* Provide information on a dynamically updated web page, using preferably Django or Flask, which should at least include: - * The real-time and historical sensor's values; as plots, when appropriate. - * Useful statistics about the sensors (TBD). - * The model's predictions. - * Useful statistics about the predictions (e.g. RMSE) -* Incorporate the prediciton model and the web page into the [ERAS ecosystem](https://eras.readthedocs.org/en/latest/), which means building [Tango](http://www.tango-controls.org/) device servers (at least one for the predictor, more if necessary). +- Using a machine learning approach, predict the _duration_ and _intensity_ solar storms: + - The student should use preferably an artificial neural networks approach (although alternatives, such as random forests, SVM, bayesian models or HMMs, can be considered). + - The predictions should be given with 24-48 hs in advance of a storm (depending on viability). + - The student should evaluate training and test data provided by IMS, or find a suitable datasaet, if the data provided is unsuitable. + - The student should evaluate an approach suggested by the IMS to test the model's performance, or propose a testing procedure of his/her own. +- Provide information on a dynamically updated web page, using preferably Django or Flask, which should at least include: + - The real-time and historical sensor's values; as plots, when appropriate. + - Useful statistics about the sensors (TBD). + - The model's predictions. + - Useful statistics about the predictions (e.g. RMSE) +- Incorporate the prediciton model and the web page into the [ERAS ecosystem](https://eras.readthedocs.org/en/latest/), which means building [Tango](http://www.tango-controls.org/) device servers (at least one for the predictor, more if necessary). Currently, a few features are being used for the prediction of solar storms, among others: diff --git a/gsoc/gsoc2016/ideas_juliaastro.md b/src/content/pages/gsoc/2016/ideas_juliaastro.md similarity index 81% rename from gsoc/gsoc2016/ideas_juliaastro.md rename to src/content/pages/gsoc/2016/ideas_juliaastro.md index ee705121..28b3fb2c 100644 --- a/gsoc/gsoc2016/ideas_juliaastro.md +++ b/src/content/pages/gsoc/2016/ideas_juliaastro.md @@ -1,21 +1,22 @@ --- -layout: default -title: "Ideas for Julia Astro" +title: "Ideas for Julia Astro" show_main: false ideas_team: JuliaAstro --- -### Image compression and efficient table reading in FITSIO.jl +# Ideas for Julia Astro -*Suggested Mentor(s):* [Kyle Barbary](http://github.com/kbarbary), [Ryan Giordan](https://github.com/rgiordan) +## Image compression and efficient table reading in FITSIO.jl -*Difficulty:* Intermediate to Expert +_Suggested Mentor(s):_ [Kyle Barbary](http://github.com/kbarbary), [Ryan Giordan](https://github.com/rgiordan) -*Astronomy knowledge needed:* none +_Difficulty:_ Intermediate to Expert -*Programming skills:* Julia, some C +_Astronomy knowledge needed:_ none -#### Description +_Programming skills:_ Julia, some C + +### Description FITS (Flexible Image Transport System) format files are the standard containers for imaging and tabular data in astronomy. The diff --git a/gsoc/gsoc2016/ideas_sunpy.md b/src/content/pages/gsoc/2016/ideas_sunpy.md similarity index 87% rename from gsoc/gsoc2016/ideas_sunpy.md rename to src/content/pages/gsoc/2016/ideas_sunpy.md index 21a62ccf..02e73c75 100644 --- a/gsoc/gsoc2016/ideas_sunpy.md +++ b/src/content/pages/gsoc/2016/ideas_sunpy.md @@ -1,21 +1,23 @@ --- -layout: default -title: "Ideas for SunPy" +title: "Ideas for SunPy" show_main: false ideas_team: SunPy --- -### Lightcurve Refactor +# Ideas for SunPy -*Suggested Mentor(s):* [Stuart Mumford](http://github.com/Cadair), [Dan Ryan](https://github.com/DanRyanIrish), [Andrew Inglis](https://github.com/aringlis), [Jack Ireland](https://github.com/wafels) +## Lightcurve Refactor -*Difficulty:* Beginner +_Suggested Mentor(s):_ [Stuart Mumford](http://github.com/Cadair), [Dan Ryan](https://github.com/DanRyanIrish), [Andrew Inglis](https://github.com/aringlis), [Jack Ireland](https://github.com/wafels) -*Astronomy knowledge needed:* None +_Difficulty:_ Beginner -*Programming skills:* Python +_Astronomy knowledge needed:_ None + +_Programming skills:_ Python + +### Description -#### Description The `Lightcurve` class is one of the three core datatypes in SunPy, along with Map and Spectra. `Lightcurve` is designed to read in, process and store meta data related to solar physics time series data. Currently, `Lightcurve` uses the pandas library as its underlying data structure, however, this is subject to change in the future. @@ -33,7 +35,7 @@ This leaves `lightcurve` in a similar position to `map` where the data acquisiti The objective of this project is to re-implement the core of the lightcurve submodule, such that it no longer contains the code to download data from the internet. The lightcurve module should be able to open file from disk that have been downloaded using the new UnifiedDownloader submodule. The lightcurve factory must be able to read files from multiple sources some of which will be able to be auto-detcted and some which will not. The lightcurve module must also be able to combine multiple files into a single timeseries. -**Expected Outcomes** +### Expected Outcomes Someone under taking this project will complete the following tasks: @@ -41,21 +43,19 @@ Someone under taking this project will complete the following tasks: 1. Write a factory class for `lightcurve` similar to the `sunpy.map.Map` class. This class will be a generic constructor for `lightcurve` allowing the user to instantiate any one of the many subclasses of `GenericLightcurve` present in `sunpy.lightcurve.sources`. The API design for the factory class is in [SEP 7](https://github.com/sunpy/sunpy-SEP/blob/master/SEP-0007.md). 1. Design and develop a robust method of dealing with lightcurve meta data, which can handle joining different parts of timeseries from different files, each with their own meta data. (See [#1122](https://github.com/sunpy/sunpy/issues/1122)) - A successful proposal for this project will demonstrate that the applicant has understood the mechanism behind the `Map` factory as already implemented in SunPy and presents a timeline of what things need to change in Lightcurve to mirror the design of `Map` and follow the design for Lightcurve in [SEP 7](https://github.com/sunpy/sunpy-SEP/blob/master/SEP-0007.md). +## Implementing AIA response functions in SunPy -### Implementing AIA response functions in SunPy +_Suggested Mentor(s):_ [Drew Leonard](https://github.com/SolarDrew), [Will Barnes](https://github.com/wtbarnes) -*Suggested Mentor(s):* [Drew Leonard](https://github.com/SolarDrew), [Will Barnes](https://github.com/wtbarnes) +_Difficulty:_ Beginner -*Difficulty:* Beginner +_Astronomy knowledge needed:_ Some knowledge of coronal emission processes would be beneficial. -*Astronomy knowledge needed:* Some knowledge of coronal emission processes would be beneficial. +_Programming skills:_ Python. -*Programming skills:* Python. - -#### Description +### Description The [CHIANTI](http://www.chiantidatabase.org/) atomic physics database is a valuable resource for solar physics. The CHIANTI database holds a large amount of information on the physical properties of different elements in different ionisation states and enables the calculation of various parameters from this information. @@ -76,23 +76,24 @@ Other potential applications of ChiantiPy in SunPy include: 1. Calculation of reponse functions for other instruments. 1. Conversion of ChiantiPy spectra objects to SunPy Spectra objects. -**Expected Outcomes**: This project would facilitate SunPy becoming independent from Solar SoftWare (SSW) for analysing AIA data, particularly with respect to inferring plasma properties such as temperature and density. +### Expected Outcomes + +This project would facilitate SunPy becoming independent from Solar SoftWare (SSW) for analysing AIA data, particularly with respect to inferring plasma properties such as temperature and density. A successful proposal will outline a schedule for implementing at least a single set of temperature and wavelength response functions for AIA, and the response functions for arbitrary plasma conditions would be a bonus. Familiarity with CHIANTI, ChiantiPy and SSW's implementation of the response functions will help to properly assess how long will be required to recreate them in SunPy. +## Real time data access and visualisation tools -### Real time data access and visualisation tools +_Suggested Mentor(s):_ [David Perez-Suarez](http://github.com/dpshelio), [Jack Ireland](https://github.com/wafels) -*Suggested Mentor(s):* [David Perez-Suarez](http://github.com/dpshelio), [Jack Ireland](https://github.com/wafels) +_Difficulty:_ Beginner-Intermediate -*Difficulty:* Beginner-Intermediate +_Astronomy knowledge needed:_ none -*Astronomy knowledge needed:* none +_Programming skills:_ Python -*Programming skills:* Python - -#### Description +### Description Real time data is very useful for [spaceweather operations](https://en.wikipedia.org/wiki/Space_weather), SunPy @@ -123,18 +124,17 @@ Familiarisation with the timeline on how much time will take to implement, test and document each part of the project. +## Improvements to the SunPy Database -### Improvements to the SunPy Database - -*Suggested Mentor(s):* [Stuart Mumford](http://github.com/Cadair), [Simon Liedtke](http://github.com/derdon), [Steven Christe](http://github.com/ehsteve) +_Suggested Mentor(s):_ [Stuart Mumford](http://github.com/Cadair), [Simon Liedtke](http://github.com/derdon), [Steven Christe](http://github.com/ehsteve) -*Difficulty:* Intermediate +_Difficulty:_ Intermediate -*Astronomy knowledge needed:* None +_Astronomy knowledge needed:_ None -*Programming skills:* Python, some database design knowledge would be helpful. +_Programming skills:_ Python, some database design knowledge would be helpful. -#### Description +### Description The `database` module provides functionality to users to manage collections of files on disk in a way not reliant upon folder structure and file name. The database allows users to find files on disk by either physical parameters, such as wavelength and time or properties of the instrument such as name and spacecraft. @@ -158,19 +158,22 @@ This project aims to achieve the following things: A successful proposal will schedule updates to the database package in small sections, rather than in one large pull request. The work should be understood and broken down into individual sections. -There are various other maintenance tasks which need undertaking (https://github.com/sunpy/sunpy/labels/Database) which would be a good way for someone interested in this project to familiarise themselves with the codebase. +There are various other maintenance tasks which need undertaking () which would be a good way for someone interested in this project to familiarise themselves with the codebase. + +## GUI to use LCT tools + +_Suggested Mentor(s):_ [Jose Iván Campos Rozo](https://github.com/Hypnus1803) (National Astronomical Observatory, National University of Colombia), Santiago Vargas Domínguez (National Astronomical Observatory, National University of Colombia), [David Pérez Suárez](https://github.com/dpshelio). +_Difficulty:_ Intermediate -### GUI to use LCT tools -*Suggested Mentor(s):* [Jose Iván Campos Rozo](https://github.com/Hypnus1803) (National Astronomical Observatory, National University of Colombia), Santiago Vargas Domínguez (National Astronomical Observatory, National University of Colombia), [David Pérez Suárez](https://github.com/dpshelio). +_Astronomy knowledge needed:_ None -*Difficulty:* Intermediate +_Programming skills:_ Python, basic knowledge of qt4, pyqt4, qt designer -*Astronomy knowledge needed:* None +### Description -*Programming skills:* Python, basic knowledge of qt4, pyqt4, qt designer +The Local Correlation Tracking (LCT, November & Simon, 1988) technique is a robust method used to study the dynamics of structures in a time series of images. By tracking pixel displacements, using a correlation window, LCT can determine proper motions and generate flow maps of horizontal velocities. This procedure is used to study the dynamics of plasma in the solar photosphere at different spatial scales, e.g the analysis of granular and supergranular convective cells, meridional flows, etc. A widget implemented in Python was developed. It generates a user-friendly graphical user interface (GUI) to control various parameters for the process of calculating flow maps of proper motions for a series of filtergrams (data cube). Our purpose is to implement this tool in Sunpy using its structure and to improve it with some more options, i.e. masks, statistics, histograms, contours and multi-plots. Although an initial version is already developed, our proposal is to focus on the efficient integration of the code in the SunPy libraries. The code (without widget files yet) is -#### Description: -The Local Correlation Tracking (LCT, November & Simon, 1988) technique is a robust method used to study the dynamics of structures in a time series of images. By tracking pixel displacements, using a correlation window, LCT can determine proper motions and generate flow maps of horizontal velocities. This procedure is used to study the dynamics of plasma in the solar photosphere at different spatial scales, e.g the analysis of granular and supergranular convective cells, meridional flows, etc. A widget implemented in Python was developed. It generates a user-friendly graphical user interface (GUI) to control various parameters for the process of calculating flow maps of proper motions for a series of filtergrams (data cube). Our purpose is to implement this tool in Sunpy using its structure and to improve it with some more options, i.e. masks, statistics, histograms, contours and multi-plots. Although an initial version is already developed, our proposal is to focus on the efficient integration of the code in the SunPy libraries. The code (without widget files yet) is https://github.com/Hypnus1803/flow_maps +### Expected Outcomes -*Expected Outcomes:* To integate efficiently the code in SunPy libraries. +To integate efficiently the code in SunPy libraries. diff --git a/gsoc/gsoc2016/ideas_yt.md b/src/content/pages/gsoc/2016/ideas_yt.md similarity index 72% rename from gsoc/gsoc2016/ideas_yt.md rename to src/content/pages/gsoc/2016/ideas_yt.md index 3c685daa..16b07afa 100644 --- a/gsoc/gsoc2016/ideas_yt.md +++ b/src/content/pages/gsoc/2016/ideas_yt.md @@ -1,10 +1,11 @@ --- -layout: default -title: "Ideas for yt" +title: "Ideas for yt" show_main: false ideas_team: yt --- +# Ideas for yt + If you are interested in one of the yt ideas, please see the [GSoC 2016 Guidelines](https://bitbucket.org/yt_analysis/yt/wiki/Google%20Summer%20of%20Code%202016%20Guidelines) on the yt bitbucket wiki. @@ -32,19 +33,19 @@ For more information about contributing to yt, take a look at our discussions about past yt projects, take a look at the yt enhancement proposal (YTEP) [listing](https://ytep.readthedocs.org). -### Integrate yt plots with interactive matplotlib backends +## Integrate yt plots with interactive matplotlib backends -*Suggested Mentor(s):* [Nathan Goldbaum](https://bitbucket.org/ngoldbaum), - [Matthew Turk](https://bitbucket.org/MatthewTurk/) +_Suggested Mentor(s):_ [Nathan Goldbaum](https://bitbucket.org/ngoldbaum), +[Matthew Turk](https://bitbucket.org/MatthewTurk/) -*Difficulty:* Intermediate +_Difficulty:_ Intermediate -*Knowledge needed:* Familiarity with matplotlib. Knowledge of matplotlib's - object oriented API a plus. +_Knowledge needed:_ Familiarity with matplotlib. Knowledge of matplotlib's +object oriented API a plus. -*Programming skills:* Python. GUI programming. +_Programming skills:_ Python. GUI programming. -#### Description +### Description Currently, all yt plotting objects have a `show()` method that displays [a version of the plot in Jupyter notebooks](https://gist.github.com/f36b29c340e8516eeae2). This works for the most @@ -66,43 +67,43 @@ This is constrained by maintaining backward compatibility: by default yt should not fail when generating plots on headless devices (e.g. when connecting over SSH to a supercomputer). -*Deliverables:* +_Deliverables:_ -* A proof of concept demonstrating how to hook into matplotlib's interactive +- A proof of concept demonstrating how to hook into matplotlib's interactive backends using the matplotlib object-oriented API, or a way to show how to gracefully fall back to using pyplot instead of the object oriented API. -* A [YTEP](https://ytep.readthedocs.org) describing the proposed approach for +- A [YTEP](https://ytep.readthedocs.org) describing the proposed approach for modifying yt's plotting infrastructure to support matplotlib's interactive plotting backends. -* The implementation for the YTEP submitted as a bitbucket pull request to the +- The implementation for the YTEP submitted as a bitbucket pull request to the main yt repository. -### Improve test coverage and test performance +## Improve test coverage and test performance -*Suggested Mentor(s):* [Kacper Kowalik](https://bitbucket.org/xarthisius), - [Nathan Goldbaum](https://bitbucket.org/ngoldbaum) +_Suggested Mentor(s):_ [Kacper Kowalik](https://bitbucket.org/xarthisius), +[Nathan Goldbaum](https://bitbucket.org/ngoldbaum) -*Difficulty:* Beginner to Advanced, depending on where the student takes the - project +_Difficulty:_ Beginner to Advanced, depending on where the student takes the +project -*Knowledge needed*: Familiarity with the `nose` testing package. +_Knowledge needed_: Familiarity with the `nose` testing package. -*Programming skills:* Python, Cython +_Programming skills:_ Python, Cython -#### Description +### Description Currently yt's test suite is split between unit tests (which take about 45 minutes to run) and answer tests, which are normally only run on a continuous integration server. Altogether the tests only cover about a third of the yt -codebase, so much of the code in yt needs test coverage. Additionally, the +codebase, so much of the code in yt needs test coverage. Additionally, the tests take a long time to run, and we would like to reduce the test runtime while simultaneously increasing code coverage. This project could go in a number of directions: -* Implement a way to retrofit the current tests for different geometries +- Implement a way to retrofit the current tests for different geometries (e.g. cartesian, cylindrical, and spherical coordinates) and data styles (e.g. particle data, as well as various kind of mesh data, including uniform resolution, octree, patch AMR, and unstructured meshes). Ideally this would @@ -110,79 +111,79 @@ This project could go in a number of directions: require learning and improving the "Stream" frontend, which allows the injestion of in-memory data into yt. -* Identify areas of the code that are not well tested and devise tests for +- Identify areas of the code that are not well tested and devise tests for them. This will require measuring the test coverage of yt's Python and Cython components. The student working on this will need to gain familiarity with untested or undertested parts of the codebase and add new tests. Optimally the new tests will make use of new reusable infrastructure that will be helpful for tests across the yt codebase. -* Improve volume rendering and visualization unit tests. Right now visualization +- Improve volume rendering and visualization unit tests. Right now visualization tests rely heavily on answer testing and image comparison. It would be more flexible and easier to understand when things go wrong if the tests instead compared with a predicted answer using some sort of simplified geometry or via introspection. -*Deliverables*: +_Deliverables_: -* Develop a framework for measuring test covering in yt's python and cython +- Develop a framework for measuring test covering in yt's python and cython components. Triage the reports to look for areas that are user facing and have poor test coverage. -* Make a number of pull requests adding tests across the yt codebase. +- Make a number of pull requests adding tests across the yt codebase. -* Modify existing testing infrastructure or develop new test infrastructure to +- Modify existing testing infrastructure or develop new test infrastructure to improve testing of yt functionality on different data types. -### Domain contexts and domain-specific fields +## Domain contexts and domain-specific fields -*Suggested Mentor(s):* [Britton Smith](https://bitbucket.org/brittonsmith), - [Matthew Turk](https://bitbucket.org/matthewturk) +_Suggested Mentor(s):_ [Britton Smith](https://bitbucket.org/brittonsmith), +[Matthew Turk](https://bitbucket.org/matthewturk) -*Difficulty:* Beginner to Intermediate +_Difficulty:_ Beginner to Intermediate -*Knowledge needed*: Undergrad level Physics knowledge. More specific - domain-specific knowledge of astronomy, hydrodynamics, finite-element methods, - GIS, meteorology, geophysics, oceanography a plus +_Knowledge needed_: Undergrad level Physics knowledge. More specific +domain-specific knowledge of astronomy, hydrodynamics, finite-element methods, +GIS, meteorology, geophysics, oceanography a plus -*Programming skills:* Python +_Programming skills:_ Python The original focus of yt was to analyze datasets from astrophysical -simulations. However, use of yt has been expanding to other +simulations. However, use of yt has been expanding to other scientific domains, such as nuclear physics, meteorology, and -geophysics. Still, much of the infrastructure within yt is built upon +geophysics. Still, much of the infrastructure within yt is built upon the assumption that the datasets being loaded are astrophysical and -hydrodynamic in nature. This assumption informs the choice of derived +hydrodynamic in nature. This assumption informs the choice of derived fields made available to the user as well as the default unit system. For example, fields such as "Jeans mass" and "X-ray emissivity" in CGS units are of little use to an earthquake simulation. The goal of this project is to develop a system for domain contexts, sets of fields and unit systems associated with specific scientific -domains. Rather than having all fields be made available to all +domains. Rather than having all fields be made available to all datasets, each dataset is given a domain context, which specifies the -relevant fields and most meaningful unit system. Domain contexts +relevant fields and most meaningful unit system. Domain contexts could also be subclassed to provide further specificity, for example, cosmology as a subclass of astrophysics. -*Deliverables:* +_Deliverables:_ -* For each of the existing frontends, identify the relevant field +- For each of the existing frontends, identify the relevant field plugins. Create a data structure to associate with each frontend that lists only the relevant plugins. Take the field plugin loading machinery, which currently just loops over all plugins, and have it only load plugins relevant to the loaded frontend. -* With the above as an example, identify and document all of the places in the +- With the above as an example, identify and document all of the places in the code where the domain is assumed to be astronomy. Use this to come up with a set of attributes that minimally describe a scientific domain, i.e., list of field plugins, unit system, etc. -* Write up a [YTEP](https://ytep.readthedocs.org) describing the proposed design +- Write up a [YTEP](https://ytep.readthedocs.org) describing the proposed design and ideas for implementation. Should identify an initial set of domain contexts, sort fields into domain contexts, and sketch how frontends should declare needed domain contexts. -* Create a domain context class with the identified attributes. Implement an +- Create a domain context class with the identified attributes. Implement an Base, astronomy, and possibly a nuclear engineering domain context and associate it with the existing frontends. diff --git a/_projects/2017/astropy/astroplan-speed.md b/src/content/pages/gsoc/2017/astropy/astroplan-speed.md similarity index 84% rename from _projects/2017/astropy/astroplan-speed.md rename to src/content/pages/gsoc/2017/astropy/astroplan-speed.md index c1544eeb..2f4892b9 100644 --- a/_projects/2017/astropy/astroplan-speed.md +++ b/src/content/pages/gsoc/2017/astropy/astroplan-speed.md @@ -2,30 +2,30 @@ name: Pedal to the metal for astroplan desc: Profiling and speeding up observation scheduling with astroplan and astropy requirements: - - Python - - Observational astronomy experience may be helpful, but not required + - Python + - Observational astronomy experience may be helpful, but not required difficulty: Intermediate -mentors: - - bmorris3 - - stuartlittlefair - - eteq +mentors: + - bmorris3 + - stuartlittlefair + - eteq initiatives: - - GSOC + - GSOC tags: - - python - - astroplan + - python + - astroplan collaborating_projects: - - astropy - - astroplan + - astropy + - astroplan --- #### Description You want to schedule observations of one thousand targets over the next month. You are given one hour. Can you help us make astroplan the tool that's up to the task? -Last summer's astroplan GSoC student began implementing a module for [scheduling astronomical observations](http://astroplan.readthedocs.io/en/latest/tutorials/scheduling.html). These scheduling operations require many calls to basic coordinate calculations – e.g. when does this target rise/set? – which can be optimized at several places within astropy core in the [`SkyCoord`](http://docs.astropy.org/en/stable/api/astropy.coordinates.SkyCoord.html) object and within the astroplan package to speed up astroplan's schedulers. Some goals of this project are to: +Last summer's astroplan GSoC student began implementing a module for [scheduling astronomical observations](http://astroplan.readthedocs.io/en/latest/tutorials/scheduling.html). These scheduling operations require many calls to basic coordinate calculations – e.g. when does this target rise/set? – which can be optimized at several places within astropy core in the [`SkyCoord`](http://docs.astropy.org/en/stable/api/astropy.coordinates.SkyCoord.html) object and within the astroplan package to speed up astroplan's schedulers. Some goals of this project are to: 1. Profile astroplan's rise/set functions and identify inefficiencies in the `SkyCoord` object 2. Make efficiency improvements wherever possible with the findings of Step 1 3. Design/implement an API for accessing simple trigonometric rise/set calculations within astroplan's schedulers (this is where some observational astronomy experience would be handy) -4. Test improved astroplan against some target use cases. We'd like to generate schedules for thousands of targets in a reasonable amounts of time, like those required by the [LCOGT](https://lco.global) operators. +4. Test improved astroplan against some target use cases. We'd like to generate schedules for thousands of targets in a reasonable amounts of time, like those required by the [LCOGT](https://lco.global) operators. diff --git a/_projects/2017/astropy/astroquery.md b/src/content/pages/gsoc/2017/astropy/astroquery.md similarity index 80% rename from _projects/2017/astropy/astroquery.md rename to src/content/pages/gsoc/2017/astropy/astroquery.md index 95f70a50..51e56291 100644 --- a/_projects/2017/astropy/astroquery.md +++ b/src/content/pages/gsoc/2017/astropy/astroquery.md @@ -2,24 +2,24 @@ name: Add additional archives to astroquery desc: Implement module(s) to access currently unsupported astronomical archives using astroquery. requirements: - - Python - - Basic understanding of web queries and APIs + - Python + - Basic understanding of web queries and APIs difficulty: low issues: - - https://github.com/astropy/astroquery/issues/226 -mentors: - - keflavich - - eteq - - bsipocz - - pllim + - https://github.com/astropy/astroquery/issues/226 +mentors: + - keflavich + - eteq + - bsipocz + - pllim initiatives: - - GSOC + - GSOC tags: - - python - - astropquery + - python + - astropquery collaborating_projects: - - astropy - - astroquery + - astropy + - astroquery --- #### Description @@ -32,12 +32,10 @@ A list of new services that have been suggested by our users [can be found here](https://github.com/astropy/astroquery/issues?q=is%3Aissue+is%3Aopen+label%3A%22New+Service%22) and in [this summary issue](https://github.com/astropy/astroquery/issues/226). - -A *possible* set of milestones for any particular one of these modules might be: +A _possible_ set of milestones for any particular one of these modules might be: 1. Research the web API for the archive sufficiently to determine what exactly astroquery should expose. 2. Determine the best interface to access the simplest subset of that archive that would be useful. 3. Create an astroquery module to actually implement that interface. 4. Add tests to ensure the module works correctly. 5. Generalize that architecture to extend to other data products from the archive - e.g. repeat 1-4 until all useful functionality in the module is complete. - diff --git a/_projects/2017/astropy/astrowidgets.md b/src/content/pages/gsoc/2017/astropy/astrowidgets.md similarity index 71% rename from _projects/2017/astropy/astrowidgets.md rename to src/content/pages/gsoc/2017/astropy/astrowidgets.md index e82a2351..34c6ef67 100644 --- a/_projects/2017/astropy/astrowidgets.md +++ b/src/content/pages/gsoc/2017/astropy/astrowidgets.md @@ -2,20 +2,20 @@ name: Jupyter widgets for Astropy desc: Create "astrowidgets" - Jupyter widgets for Astropy. requirements: - - Python - - Very basic knowledge of CSS. - - Basic understanding of javascript. + - Python + - Very basic knowledge of CSS. + - Basic understanding of javascript. difficulty: low to intermediate -mentors: - - mwcraig +mentors: + - mwcraig initiatives: - - GSOC + - GSOC tags: - - python - - javascript + - python + - javascript collaborating_projects: - - astropy - - astrowidgets + - astropy + - astrowidgets --- #### Description @@ -26,15 +26,15 @@ The final deliverable for the project will be a new package ready for applicatio Some of the deliverables for this project would be widget interfaces for: -+ A FITS image viewer utilizing the affiliated package [ginga](https://github.com/ejeschke/ginga) to handle the image display. This widget should allow for overlays of sources from catalogs (using [astroquery](https://github.com/astropy/astroquery)), selection of sources in the image using a mouse, and user-configurable key bindings. -+ Point source detection and photometry using either [photutils](https://github.com/astropy/photutils) or [sep](https://github.com/kbarbary/sep). -+ Observation planning using [astroplan](https://github.com/astropy/astroplan). +- A FITS image viewer utilizing the affiliated package [ginga](https://github.com/ejeschke/ginga) to handle the image display. This widget should allow for overlays of sources from catalogs (using [astroquery](https://github.com/astropy/astroquery)), selection of sources in the image using a mouse, and user-configurable key bindings. +- Point source detection and photometry using either [photutils](https://github.com/astropy/photutils) or [sep](https://github.com/kbarbary/sep). +- Observation planning using [astroplan](https://github.com/astropy/astroplan). In addition, these Jupyter notebooks will be developed: -+ Sample notebooks demonstrating how to compose the widgets into applications. -+ An image reduction notebook, similar to [reducer](https://github.com/mwcraig/reducer). -+ A photometry notebook for source detection and photometry. -+ A notebook for performing differential photometry on a time series of measurements. +- Sample notebooks demonstrating how to compose the widgets into applications. +- An image reduction notebook, similar to [reducer](https://github.com/mwcraig/reducer). +- A photometry notebook for source detection and photometry. +- A notebook for performing differential photometry on a time series of measurements. Preliminary development of this project is already underway, so some of the specific deliverables might have changed by the beginning of the summer of code. diff --git a/_projects/2017/astropy/coord-velocities.md b/src/content/pages/gsoc/2017/astropy/coord-velocities.md similarity index 75% rename from _projects/2017/astropy/coord-velocities.md rename to src/content/pages/gsoc/2017/astropy/coord-velocities.md index 9f640a8a..86be7df0 100644 --- a/_projects/2017/astropy/coord-velocities.md +++ b/src/content/pages/gsoc/2017/astropy/coord-velocities.md @@ -2,21 +2,21 @@ name: Velocities in Astropy coordinates desc: Implement framework for handling velocities and velocity transforms in astropy.coordinates. requirements: - - Python - - Some knowledge of coordinate transformations. - - Background in astronomical velocity frames and how they are used (helpful but not necessarily a strict requirement). + - Python + - Some knowledge of coordinate transformations. + - Background in astronomical velocity frames and how they are used (helpful but not necessarily a strict requirement). difficulty: Expert -mentors: - - mhvk - - eteq - - adrn +mentors: + - mhvk + - eteq + - adrn initiatives: - - GSOC + - GSOC tags: - - python - - astropy core + - python + - astropy core collaborating_projects: - - astropy + - astropy --- #### Description diff --git a/_projects/2017/astropy/ds9-regions.md b/src/content/pages/gsoc/2017/astropy/ds9-regions.md similarity index 90% rename from _projects/2017/astropy/ds9-regions.md rename to src/content/pages/gsoc/2017/astropy/ds9-regions.md index 485d632c..e4314b0a 100644 --- a/_projects/2017/astropy/ds9-regions.md +++ b/src/content/pages/gsoc/2017/astropy/ds9-regions.md @@ -3,18 +3,18 @@ name: Complete the ds9 region file reader/writer desc: Implement a reader and writer for the ds9 regions file format. # add a description of your project requirements: - - Python + - Python difficulty: low to intermediate -mentors: - - keflavich - - cdeil +mentors: + - keflavich + - cdeil initiatives: - - GSOC + - GSOC tags: - - python - - regions + - python + - regions collaborating_projects: - - astropy + - astropy --- #### Description diff --git a/_projects/2017/astropy/fits-table-wcs.md b/src/content/pages/gsoc/2017/astropy/fits-table-wcs.md similarity index 73% rename from _projects/2017/astropy/fits-table-wcs.md rename to src/content/pages/gsoc/2017/astropy/fits-table-wcs.md index 7f6c7bd7..adbb730c 100644 --- a/_projects/2017/astropy/fits-table-wcs.md +++ b/src/content/pages/gsoc/2017/astropy/fits-table-wcs.md @@ -1,28 +1,28 @@ --- name: Seamless Combination of SkyCoord, Table, WCS, and FITS -desc: +desc: requirements: - - Python - - Some familiarity with FITS files + - Python + - Some familiarity with FITS files difficulty: intermediate issues: - - https://github.com/astropy/astropy/issue/5626 -mentors: - - hamogu - - taldcroft - - eteq + - https://github.com/astropy/astropy/issue/5626 +mentors: + - hamogu + - taldcroft + - eteq initiatives: - - GSOC + - GSOC tags: - - python - - astropy core + - python + - astropy core collaborating_projects: - - astropy + - astropy --- #### Description -Here is a common astronomical problem: I have a table with objects on the sky, each of which has a flux and an observation time. I match them with some other photometric catalog and them compute certain values (e.g. the mass, the age and the accretion rate). I store all that in the table. Astropy offers a lot of classes to make this easier, for example coordinates that know how to transform between different coordinate systems. +Here is a common astronomical problem: I have a table with objects on the sky, each of which has a flux and an observation time. I match them with some other photometric catalog and them compute certain values (e.g. the mass, the age and the accretion rate). I store all that in the table. Astropy offers a lot of classes to make this easier, for example coordinates that know how to transform between different coordinate systems. Once I write my publication, I need to store that table as a fits file and print it out to LaTeX. This is where the problem comes: Each of the special objects (coordinates, times, units) has metadata that does not easily fit into the data column. Astropy grew out of several independent pacakges (pyfits, asciitable) that each did one thing well, but were not very easy to interoperate. Astropy has (mostly) unified the interface, but functionally components still work separately. In this project, you will makes things interoperable. For the example above, you need to develop a protocol that allows storage of coordinates and times in fits and ascii tables. @@ -33,6 +33,6 @@ This project the following stages: - Find breaks in the workflow as described in the example above. - Define protocols for meta data that make it work between different packages. - Solicit feedback from the community on those protocols. -- Implement code and test cases. +- Implement code and test cases. - Test and document the steps above. - Add an [astropy tutorials](http://tutorials.astropy.org) and update Astropy core package documentation to show the new capabilities. diff --git a/_projects/2017/astropy/hips.md b/src/content/pages/gsoc/2017/astropy/hips.md similarity index 86% rename from _projects/2017/astropy/hips.md rename to src/content/pages/gsoc/2017/astropy/hips.md index 6485caba..80396a35 100644 --- a/_projects/2017/astropy/hips.md +++ b/src/content/pages/gsoc/2017/astropy/hips.md @@ -2,24 +2,24 @@ name: HIPS to Py desc: Write a Python client for Hierarchical Progressive Surveys (HIPS) requirements: - - Have Python / Numpy / Astropy skills - - Know how to write tests with pytest and docs with Sphinx - - Some open source experience - - Some image processing experience - - Interest in spherical geometry and HEALPIX / HIPS + - Have Python / Numpy / Astropy skills + - Know how to write tests with pytest and docs with Sphinx + - Some open source experience + - Some image processing experience + - Interest in spherical geometry and HEALPIX / HIPS difficulty: Intermediate to high -mentors: - - cdeil - - tboch +mentors: + - cdeil + - tboch initiatives: - - GSOC + - GSOC tags: - - python - - regions - - web - - math + - python + - regions + - web + - math collaborating_projects: - - astropy + - astropy --- #### Description diff --git a/_projects/2017/astropy/performance.md b/src/content/pages/gsoc/2017/astropy/performance.md similarity index 78% rename from _projects/2017/astropy/performance.md rename to src/content/pages/gsoc/2017/astropy/performance.md index 9d88646f..26362b6c 100644 --- a/_projects/2017/astropy/performance.md +++ b/src/content/pages/gsoc/2017/astropy/performance.md @@ -2,33 +2,34 @@ name: Improve astropy performance in a sustainable way desc: Increase the air speed velocity of Astropy core. requirements: - - Python - - Cython - - C - - web + - Python + - Cython + - C + - web difficulty: Intermediate -mentors: - - taldcroft +mentors: + - taldcroft initiatives: - - GSOC + - GSOC tags: - - python - - astropy core + - python + - astropy core collaborating_projects: - - astropy + - astropy --- + #### Description The Astropy core package was designed and implemented with priority placed on -good code structure, long-term maintainability, and code correctness. Currently +good code structure, long-term maintainability, and code correctness. Currently the package is nearly six years old and this strategy has proved its merit. Nevertheless, development decisions along the way often sacrificed performance -in favor of clean or simple implementation. At this point as a relatively +in favor of clean or simple implementation. At this point as a relatively mature project with wide community adoption it makes sense to profile both the astronomical user community and the code to find areas where -performance issues need to be addressed. In many cases there is "low-hanging +performance issues need to be addressed. In many cases there is "low-hanging fruit" where simple solutions like caching or initialization fixes can -yield factors-of-many improvement. In other areas there may be need for +yield factors-of-many improvement. In other areas there may be need for more substantial changes and even reimplementation using Cython or C. One of the key available technologies for performance evaluation is the asv (Air @@ -41,8 +42,8 @@ prevent performance regressions from getting into the code base. This GSoC project thus has the following high-level steps: - Poll the astropy user community for their perspectives on performance - bottlenecks in astropy. Engage in discussion and develop a prioritized - list of areas to improve. A minimal list of known issues right now + bottlenecks in astropy. Engage in discussion and develop a prioritized + list of areas to improve. A minimal list of known issues right now includes coordinate initialization, iteration, and table / column creation. - Work on asv (performance testing suite) to make it easy to run relevant tests diff --git a/_projects/2017/astropy/test-helper.md b/src/content/pages/gsoc/2017/astropy/test-helper.md similarity index 82% rename from _projects/2017/astropy/test-helper.md rename to src/content/pages/gsoc/2017/astropy/test-helper.md index c702cc5e..3dc3d482 100644 --- a/_projects/2017/astropy/test-helper.md +++ b/src/content/pages/gsoc/2017/astropy/test-helper.md @@ -2,23 +2,23 @@ name: Astropy Test Helper as a Separate Package desc: Re-implement Astropy Test Helper as Separate Installable Package requirements: - - Python packaging experience. - - familiarity with pytest + - Python packaging experience. + - familiarity with pytest difficulty: Intermediate to Advanced issues: - - https://github.com/astropy/astropy/pull/5770 -mentors: - - pllim - - bsipocz - - Cadair + - https://github.com/astropy/astropy/pull/5770 +mentors: + - pllim + - bsipocz + - Cadair initiatives: - - GSOC + - GSOC tags: - - python - - astropy - - pytest + - python + - astropy + - pytest collaborating_projects: - - astropy + - astropy --- #### Description diff --git a/src/content/pages/gsoc/2017/casacore/testing.md b/src/content/pages/gsoc/2017/casacore/testing.md new file mode 100644 index 00000000..3d1347f9 --- /dev/null +++ b/src/content/pages/gsoc/2017/casacore/testing.md @@ -0,0 +1,30 @@ +--- +name: Casacore testing +desc: Improve the test coverage of the python wrappers around casacore, and possibly add some python functionality +# add a description of your project +requirements: + - Proficiency in Python +difficulty: intermediate +issues: + - https://github.com/casacore/python-casacore/issues/6 + - https://github.com/casacore/python-casacore/issues/60 +mentors: + - tammojan + - gijzelaerr +initiatives: + - GSOC +tags: + - python casacore testing +collaborating_projects: + - casacore +--- + +#### Description + +Python-casacore is a set of Python bindings for [casacore] (), a c++ library used in radio astronomy. This python binding to casacore is now python 3 compatible, contains some unit tests, etc. But some work remains to be done: + +- Remove all compile warnings +- Modernise code, add missing features, maybe more ‘pythonic’. +- Improve test coverage (24% at the moment) + +This is a typical project to learn making good code. diff --git a/_projects/2017/glue/notebook.md b/src/content/pages/gsoc/2017/glue/notebook.md similarity index 87% rename from _projects/2017/glue/notebook.md rename to src/content/pages/gsoc/2017/glue/notebook.md index c12e5480..1448e4b6 100644 --- a/_projects/2017/glue/notebook.md +++ b/src/content/pages/gsoc/2017/glue/notebook.md @@ -3,21 +3,22 @@ name: Glue notebook viewers desc: Make it possible to use glue from the Jupyter notebook by developing notebook-based data viewers. This will make it possible to also use glue remotely, and will be a widely used feature! # add a description of your project requirements: - - Proficiency in Python - - Familiarity with the Jupyter notebook + - Proficiency in Python + - Familiarity with the Jupyter notebook difficulty: high issues: - - https://github.com/glue-viz/glue/issues/1226 + - https://github.com/glue-viz/glue/issues/1226 mentors: - - astrofrog - - eteq + - astrofrog + - eteq initiatives: - - GSOC + - GSOC tags: - - python + - python collaborating_projects: - - glue + - glue --- + #### Description At the moment, the main way users use glue is via the Qt-based application. diff --git a/_projects/2018/glue/widgets.md b/src/content/pages/gsoc/2017/glue/widgets.md similarity index 54% rename from _projects/2018/glue/widgets.md rename to src/content/pages/gsoc/2017/glue/widgets.md index 51ed412c..779f9da5 100644 --- a/_projects/2018/glue/widgets.md +++ b/src/content/pages/gsoc/2017/glue/widgets.md @@ -3,34 +3,35 @@ name: New glue widgets desc: Expand the functionality of glue by developing a range of new widgets, including to better read in and edit data. # add a description of your project requirements: - - Proficiency in Python - - Familiarity with GUI programming, ideally Qt + - Proficiency in Python + - Familiarity with GUI programming, ideally Qt difficulty: medium issues: - - https://github.com/glue-viz/glue/issues/836 - - https://github.com/glue-viz/glue/issues/981 - - https://github.com/glue-viz/glue/issues/1073 + - https://github.com/glue-viz/glue/issues/836 + - https://github.com/glue-viz/glue/issues/981 + - https://github.com/glue-viz/glue/issues/1073 mentors: - - astrofrog + - astrofrog initiatives: - - GSOC + - GSOC tags: - - python + - python collaborating_projects: - - glue + - glue --- + #### Description This project is to develop new widgets/dialogs inside glue. Examples include: -* A dialog that would be useful beyond this project is a dialog for importing +- A dialog that would be useful beyond this project is a dialog for importing ASCII tables into glue, similar to the CSV import functionality in e.g. OpenOffice/LibreOffice or Excel. -* A dialog that allows the user to edit components of a datasets, including +- A dialog that allows the user to edit components of a datasets, including renaming them, sorting them, and changing datatypes. -* A dialog that can be used to re-order categorical components +- A dialog that can be used to re-order categorical components -* A dialog to visually create simple selections (for example that a specific +- A dialog to visually create simple selections (for example that a specific component should be in a certain range) diff --git a/src/content/pages/gsoc/2017/index.md b/src/content/pages/gsoc/2017/index.md new file mode 100644 index 00000000..51e590dc --- /dev/null +++ b/src/content/pages/gsoc/2017/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2017" +show_main: false +season: 2017 +--- diff --git a/_projects/2017/juliaastro/astrolib.md b/src/content/pages/gsoc/2017/juliaastro/astrolib.md similarity index 74% rename from _projects/2017/juliaastro/astrolib.md rename to src/content/pages/gsoc/2017/juliaastro/astrolib.md index 1a95bf1e..e63a5242 100644 --- a/_projects/2017/juliaastro/astrolib.md +++ b/src/content/pages/gsoc/2017/juliaastro/astrolib.md @@ -2,26 +2,26 @@ name: Porting the IDL Astronomy User's Library to Julia desc: Expand the ecosystem of astronomical routines in Julia language. requirements: - - Julia - - IDL - - Knowledge of astronomy is beneficial, but not required + - Julia + - IDL + - Knowledge of astronomy is beneficial, but not required difficulty: low to intermediate mentors: - - giordano - - kbarbary + - giordano + - kbarbary initiatives: - - GSOC + - GSOC tags: - - julia + - julia collaborating_projects: - - JuliaAstro + - JuliaAstro --- #### Description [Julia](http://julialang.org/) is a programming language designed for technical computing that combines ease-of-use of dynamical languages and high-performance -of statically-compiled languages like C. Its most notable feature +of statically-compiled languages like C. Its most notable feature is [multiple dispatch](http://en.wikipedia.org/wiki/Multiple_dispatch), which greatly simplifies the definition of complex functions whose behavior depends on the type of the arguments. @@ -35,24 +35,24 @@ The goal of this project is to expand the [AstroLib.jl](https://github.com/JuliaAstro/AstroLib.jl) package, which bundles generic astronomical and astrophysical functions, mainly ported from the [IDL Astronomy User's Library](https://idlastro.gsfc.nasa.gov/homepage.html) -(a.k.a. AstroLib). You should focus on porting the astronomical utilities -first. If you don't know where to start from, have a look at: +(a.k.a. AstroLib). You should focus on porting the astronomical utilities +first. If you don't know where to start from, have a look at: -* the +- the [AstroLib.jl manual](https://juliaastro.github.io/AstroLib.jl/latest/index.html) -* the [TODO list](https://github.com/JuliaAstro/AstroLib.jl/blob/master/TODO.md) - of the project, with the list of *all* functions in IDL AstroLib not yet +- the [TODO list](https://github.com/JuliaAstro/AstroLib.jl/blob/master/TODO.md) + of the project, with the list of _all_ functions in IDL AstroLib not yet ported -* the list +- the list of [Astronomical Utilities](https://idlastro.gsfc.nasa.gov/contents.html) in IDL AstroLib While an experience with programming in Julia would be helpful, this is not necessary, but you should get acquainted with the language before the coding -period. If you are a Julia newbie, check out +period. If you are a Julia newbie, check out the [Manual](http://docs.julialang.org/en/latest/index.html), in particular the [performance tips](https://docs.julialang.org/en/latest/manual/performance-tips/) and the [style guide](https://docs.julialang.org/en/latest/manual/style-guide/). -[Here](http://julialang.org/learning/) you may find other useful resources. +[Other Julia learning resources](http://julialang.org/learning/) are available as well. diff --git a/_projects/2017/sunpy/drms.md b/src/content/pages/gsoc/2017/sunpy/drms.md similarity index 69% rename from _projects/2017/sunpy/drms.md rename to src/content/pages/gsoc/2017/sunpy/drms.md index be257810..70e04d6b 100644 --- a/_projects/2017/sunpy/drms.md +++ b/src/content/pages/gsoc/2017/sunpy/drms.md @@ -2,24 +2,24 @@ name: DRMS Module for JSOC Downloads desc: Improve the drms package and the SunPy JSOC client, requirements: - - Familiarity with Python class development. + - Familiarity with Python class development. difficulty: medium issues: - - https://github.com/kbg/drms/issues/3 - - https://github.com/sunpy/sunpy/issues/1909 -mentors: - - Cadair - - kbg - - mbobra + - https://github.com/kbg/drms/issues/3 + - https://github.com/sunpy/sunpy/issues/1909 +mentors: + - Cadair + - kbg + - mbobra initiatives: - - GSOC - - SoCiS + - GSOC + - SoCiS tags: -- sunpy -- python + - sunpy + - python collaborating_projects: - - sunpy - - drms + - sunpy + - drms --- #### Description @@ -40,7 +40,7 @@ the majority of the drms functionality through the unified search API of SunPy. While the SunPy implementation would not need to provide all the features of the drms library, it would strive to provide a simple API for most queries supported by drms. One high-priority feature that should be availble in SunPy is the -ability to query drms series for which the prime key is not ``T_REC``, also it +ability to query drms series for which the prime key is not `T_REC`, also it should be possible to download only the metadata from drms without downloading the associated image data. @@ -48,26 +48,24 @@ Finally, documentation in SunPy should be improved to detail much more of the JSOC functionality. This should include API documentation, narrative documentation in the guide and examples in the gallery. - #### Milestones ##### GSOC 2017 CODING STARTS -* Have familiarised yourself with the drms module, the `sunpy.net.jsoc` and `sunpy.net.Fido` submodules. -* Become comfortable with writing tests in pytest, and using mock. +- Have familiarised yourself with the drms module, the `sunpy.net.jsoc` and `sunpy.net.Fido` submodules. +- Become comfortable with writing tests in pytest, and using mock. ##### GSOC 2017 MIDTERM -* Have developed a test suite for drms. -* Have worked with the mentors to enable CI testing and build a conda package for the drms library. - -##### GSOC 2017 FINAL +- Have developed a test suite for drms. +- Have worked with the mentors to enable CI testing and build a conda package for the drms library. -* Have completed a rework of the `sunpy.net.jsoc` module to use the features of drms. +##### GSOC 2017 FINAL +- Have completed a rework of the `sunpy.net.jsoc` module to use the features of drms. ##### Additional Resources -* [drms Tutorial](https://drms.readthedocs.io/en/stable/tutorial.html) -* [SHARP Example](https://nbviewer.jupyter.org/github/kbg/ipynbs/blob/master/hminuggets/sharp_imgdata.ipynb) -* [Metadata example](https://nbviewer.jupyter.org/github/mbobra/calculating-spaceweather-keywords/blob/master/plot_swx_d3.ipynb) +- [drms Tutorial](https://drms.readthedocs.io/en/stable/tutorial.html) +- [SHARP Example](https://nbviewer.jupyter.org/github/kbg/ipynbs/blob/master/hminuggets/sharp_imgdata.ipynb) +- [Metadata example](https://nbviewer.jupyter.org/github/mbobra/calculating-spaceweather-keywords/blob/master/plot_swx_d3.ipynb) diff --git a/_projects/2017/sunpy/iris.md b/src/content/pages/gsoc/2017/sunpy/iris.md similarity index 53% rename from _projects/2017/sunpy/iris.md rename to src/content/pages/gsoc/2017/sunpy/iris.md index 82f6d5e9..b8203d7e 100644 --- a/_projects/2017/sunpy/iris.md +++ b/src/content/pages/gsoc/2017/sunpy/iris.md @@ -2,21 +2,21 @@ name: SunPy IRIS Data class desc: Develop tools to read in and analyze IRIS image and spectral data using SunPy. requirements: - - Familiarity with Python class development. - - (Optional) A knowledge of the Interactive Data Language (IDL) would be useful, but not requried. + - Familiarity with Python class development. + - (Optional) A knowledge of the Interactive Data Language (IDL) would be useful, but not requried. difficulty: medium issues: -mentors: - - ehsteve - - DanRyanIrish +mentors: + - ehsteve + - DanRyanIrish initiatives: - - GSOC - - SoCiS + - GSOC + - SoCiS tags: -- sunpy -- python + - sunpy + - python collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -39,28 +39,28 @@ using SunPy. This includes the following tasks: and analyzed in a convenient way. 2. Develop and test an IRISRaster class to read in, combine and -analyze IRIS spectra from different raster positions. + analyze IRIS spectra from different raster positions. 3. Using the two classes developed above, build an IRISObservation container class to allow users to easily associate co-temporal slit-jaw images and spectra. -*Optional:* Although the IRIS instrument team has calibrated the - publicly available IRIS data, finer tuning of this calibration can be - helpful for advanced data analysis. Tools to do this have been - developed by the IRIS team in the Interactive Data Language (IDL), - but no such tools exist in Python. Depending on the progress and - preference of the student, these tools can be developed in Python as - part of this project. This would include the following tasks: +_Optional:_ Although the IRIS instrument team has calibrated the +publicly available IRIS data, finer tuning of this calibration can be +helpful for advanced data analysis. Tools to do this have been +developed by the IRIS team in the Interactive Data Language (IDL), +but no such tools exist in Python. Depending on the progress and +preference of the student, these tools can be developed in Python as +part of this project. This would include the following tasks: 1. Develop and test a function for residual wavelength calibration. -This already exists in IDL. + This already exists in IDL. 2. Develop and test a function to calculate the IRIS response -function. This already exists in IDL but not Python. + function. This already exists in IDL but not Python. 3. Using the IRIS response function code, develop a function to - convert IRIS data into physical units. This already exists in IDL + convert IRIS data into physical units. This already exists in IDL but not Python. A good proposal would demonstrate that the student is familiar with @@ -68,35 +68,34 @@ the Xarray package. ##### Expected Outcomes -* IRIS MapSequence class -* IRISRaster class -* IRISObservation class - +- IRIS MapSequence class +- IRISRaster class +- IRISObservation class #### Milestones ##### GSOC 2017 CODING STARTS -* Have familiarised yourself with the basics of IRIS data through the -resources below and Python classes nd the Xarray package. -* Have worked with the mentors to get the package repository setup on -GitHub. +- Have familiarised yourself with the basics of IRIS data through the + resources below and Python classes nd the Xarray package. +- Have worked with the mentors to get the package repository setup on + GitHub. ##### GSOC 2017 MIDTERM -* Have developed an IRISMapSequence object and submitted a PR. -* Have started work on an IRISRaster object. +- Have developed an IRISMapSequence object and submitted a PR. +- Have started work on an IRISRaster object. -##### GSOC 2017 FINAL +##### GSOC 2017 FINAL -* Have got IRISMapSequence PR accepted. -* Have completed development of an IRISRaster object and have a PR -ready submitted and ready to be accepted. -* Have completed development of an IRISObservation object and have -opened a PR. +- Have got IRISMapSequence PR accepted. +- Have completed development of an IRISRaster object and have a PR + ready submitted and ready to be accepted. +- Have completed development of an IRISObservation object and have + opened a PR. ##### Additional Resources -* [IRIS website](http://iris.lmsal.com/) -* [IRIS instrument paper](https://www.lmsal.com/iris_science/doc?cmd=dcur&proj_num=IS0196&file_type=pdf) -* [Guide to IRIS data analysis](http://iris.lmsal.com/itn26/itn26.pdf) +- [IRIS website](http://iris.lmsal.com/) +- [IRIS instrument paper](https://www.lmsal.com/iris_science/doc?cmd=dcur&proj_num=IS0196&file_type=pdf) +- [Guide to IRIS data analysis](http://iris.lmsal.com/itn26/itn26.pdf) diff --git a/_projects/2017/sunpy/mag_field.md b/src/content/pages/gsoc/2017/sunpy/mag_field.md similarity index 65% rename from _projects/2017/sunpy/mag_field.md rename to src/content/pages/gsoc/2017/sunpy/mag_field.md index 214ed3e4..72c2a999 100644 --- a/_projects/2017/sunpy/mag_field.md +++ b/src/content/pages/gsoc/2017/sunpy/mag_field.md @@ -3,33 +3,34 @@ name: 3D Map Class for Field Extrapolations in Spherical Coordinates desc: Generalize magnetic field extrapolation to spherical coordinates in `solarbextrapolation` package with a "coordinate-aware" 3D Map-like object. # add a short one line description of your project requirements: -# Student requirements: - - Knowledge of vector calculus and differential equations - - Familiar with numerical methods - - Some familiarity with electromagnetism, MHD, potential/force-free magnetic fields (optional) + # Student requirements: + - Knowledge of vector calculus and differential equations + - Familiar with numerical methods + - Some familiarity with electromagnetism, MHD, potential/force-free magnetic fields (optional) difficulty: intermediate issues: -# Related issues (if any) to this project. - - https://github.com/sunpy/solarbextrapolation/issues/12 + # Related issues (if any) to this project. + - https://github.com/sunpy/solarbextrapolation/issues/12 mentors: -# First person in contact; mentors may change before project starts. - - Alex-Ian-Hamilton - - wtbarnes + # First person in contact; mentors may change before project starts. + - Alex-Ian-Hamilton + - wtbarnes initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: - - python - - numba - - numpy + - python + - numba + - numpy collaborating_projects: -# suborganisation(s) to which this project belongs. - - sunpy + # suborganization(s) to which this project belongs. + - sunpy --- + #### Description Determining the 3D geometry of the tangled and dynamic coronal magnetic field is an open research problem in solar physics. -A common technique for deriving the 3D vector field from a photospheric magnetogram is to assume a *potential* field such that it can be derived by solving Laplace's equation. +A common technique for deriving the 3D vector field from a photospheric magnetogram is to assume a _potential_ field such that it can be derived by solving Laplace's equation. The SunPy-affiliated [`solarbextrapolation`](https://github.com/sunpy/solarbextrapolation) package solves Laplace's equation using the method of [Sakurai (1982)](http://adsabs.harvard.edu/abs/1982SoPh...76..301S). However, when constructing the 3D field from the magnetogram, the "small-angle" approximation is used such that the curvature of the Sun is ignored, a valid approximation on the scale of an active region. @@ -41,19 +42,22 @@ Currently, the `solarbextrapolation` package uses a Map3D class that is limited It is expected that this new object will serve as a prototype for a first-class data type in the core SunPy package. #### Primary Goals -* Develop a coordinate-aware 3D Map class -* Use 3D Map class for global field extrapolations + +- Develop a coordinate-aware 3D Map class +- Use 3D Map class for global field extrapolations #### Possible Secondary Goals -* Performance improvements -* Improvements to the documentation and examples -* Better visualization methods -* Addition of more advanced extrapolators, e.g. non-linear force-free field + +- Performance improvements +- Improvements to the documentation and examples +- Better visualization methods +- Addition of more advanced extrapolators, e.g. non-linear force-free field #### Additional Resources -* [`solarbextrapolation` package ](https://github.com/sunpy/solarbextrapolation) -* [Maps in SunPy](http://docs.sunpy.org/en/stable/code_ref/map.html) -* [Coordinates in SunPy](http://docs.sunpy.org/en/stable/code_ref/coordinates.html) -* [Coordinates for Solar Image Data -- Thompson (2006)](http://adsabs.harvard.edu/abs/2006A%26A...449..791T) -* [IDL package for global potential field extrapolations](http://www.lmsal.com/~derosa/pfsspack/) -* [Review of Magnetic Field Extrapolation Techniques -- T. Neukirch](http://adsabs.harvard.edu/abs/2005ESASP.596E..12N) + +- [`solarbextrapolation` package](https://github.com/sunpy/solarbextrapolation) +- [Maps in SunPy](http://docs.sunpy.org/en/stable/code_ref/map.html) +- [Coordinates in SunPy](http://docs.sunpy.org/en/stable/code_ref/coordinates.html) +- [Coordinates for Solar Image Data -- Thompson (2006)](http://adsabs.harvard.edu/abs/2006A%26A...449..791T) +- [IDL package for global potential field extrapolations](http://www.lmsal.com/~derosa/pfsspack/) +- [Review of Magnetic Field Extrapolation Techniques -- T. Neukirch](http://adsabs.harvard.edu/abs/2005ESASP.596E..12N) diff --git a/_projects/2017/sunpy/realtimesun.md b/src/content/pages/gsoc/2017/sunpy/realtimesun.md similarity index 72% rename from _projects/2017/sunpy/realtimesun.md rename to src/content/pages/gsoc/2017/sunpy/realtimesun.md index a6ffec36..c0062c15 100644 --- a/_projects/2017/sunpy/realtimesun.md +++ b/src/content/pages/gsoc/2017/sunpy/realtimesun.md @@ -3,32 +3,32 @@ name: Sun, Right now! desc: Build a website to display what the Sun looks like in real time # add a description of your project requirements: - - Familiarity with Python - - Understanding of databases - - Basic web development - - Familiarity with Flask + - Familiarity with Python + - Understanding of databases + - Basic web development + - Familiarity with Flask difficulty: Intermediate issues: - - https://github.com/sunpy/sunpy/issues/1442 - - https://github.com/sunpy/sunpy/pull/1852 -mentors: - - dpshelio - - Cadair + - https://github.com/sunpy/sunpy/issues/1442 + - https://github.com/sunpy/sunpy/pull/1852 +mentors: + - dpshelio + - Cadair initiatives: - - GSOC + - GSOC tags: - - sunpy + - sunpy collaborating_projects: - - sunpy + - sunpy --- #### Description -The project requires the combination of multiple parts of the sunpy +The project requires the combination of multiple parts of the sunpy library to combine them all and together with a flask (or similar) application to visualise real time and past images of the sun on a website. -The project should have three parts: +The project should have three parts: - Add missing data sources like [DISCOVR](http://www.swpc.noaa.gov/products/real-time-solar-wind) - Download, visualise (and probably annotate) and save real time data. diff --git a/_projects/2017/sunpy/roi.md b/src/content/pages/gsoc/2017/sunpy/roi.md similarity index 87% rename from _projects/2017/sunpy/roi.md rename to src/content/pages/gsoc/2017/sunpy/roi.md index 75c0278b..5f81384b 100644 --- a/_projects/2017/sunpy/roi.md +++ b/src/content/pages/gsoc/2017/sunpy/roi.md @@ -3,20 +3,20 @@ name: Region of Interest desc: Meta-Object creation for holding temporal and spatial features. # add a description of your project requirements: - - Familiarity with Python - - Understanding of design patterns + - Familiarity with Python + - Understanding of design patterns difficulty: High issues: - - https://github.com/sunpy/sunpy/issues/164 -mentors: - - dpshelio - - wafels + - https://github.com/sunpy/sunpy/issues/164 +mentors: + - dpshelio + - wafels initiatives: - - GSOC + - GSOC tags: - - sunpy + - sunpy collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -26,7 +26,7 @@ region of interest (ROI) in any physical dimension (such as spatial area, temporal range or spectral window) and interact with the rest of data types used in sunpy. -For example, a region of interest could be a particular area in the Sun +For example, a region of interest could be a particular area in the Sun at a particular moment in time. Therefore, that object should contain the extent of such area, its contour and the time when it was observed. It also needs other information, such as the coordinate system that it @@ -39,6 +39,5 @@ plotting the box containing such region and being aware of difference in time or observational point. So, it needs to be spatial and temporal aware. Additionally, the object needs to understand (be able to parse in) features and -events catalogued in the [HEK](http://www.lmsal.com/hek/hek_isolsearch.html) +events catalogued in the [HEK](http://www.lmsal.com/hek/hek_isolsearch.html) and [HELIO](http://hfc.helio-vo.eu/) databases. - diff --git a/_projects/2017/sunpy/sunkit-image.md b/src/content/pages/gsoc/2017/sunpy/sunkit-image.md similarity index 74% rename from _projects/2017/sunpy/sunkit-image.md rename to src/content/pages/gsoc/2017/sunpy/sunkit-image.md index 4e40579e..d5602b63 100644 --- a/_projects/2017/sunpy/sunkit-image.md +++ b/src/content/pages/gsoc/2017/sunpy/sunkit-image.md @@ -2,24 +2,24 @@ name: Develop sunkit-image desc: Create and develop a package for solar image analysis. requirements: - - Good understanding of Python. - - Enthusiasm to learn solar image processing. + - Good understanding of Python. + - Enthusiasm to learn solar image processing. difficulty: low issues: - - https://github.com/sunpy/sunpy/pull/1899 - - https://github.com/sunpy/sunpy/pull/1876 + - https://github.com/sunpy/sunpy/pull/1899 + - https://github.com/sunpy/sunpy/pull/1876 mentors: - - Cadair - - wafels - - Nabobalis + - Cadair + - wafels + - Nabobalis initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: - - python - - sunpy + - python + - sunpy collaborating_projects: - - sunpy + - sunpy --- In this project you would create the foundations of the 'sunkit-image' SunPy @@ -45,23 +45,22 @@ the following goals (roughly in this order): optional extras: -6. Refactor and write a Python wrapper for [FLCT](https://arxiv.org/abs/0712.4289) [code](http://solarmuri.ssl.berkeley.edu/overview/publicdownloads/software.html). -8. Implement image alignment using feature detection and tracking. [Example](http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_brief.html) - +1. Refactor and write a Python wrapper for [FLCT](https://arxiv.org/abs/0712.4289) [code](http://solarmuri.ssl.berkeley.edu/overview/publicdownloads/software.html). +2. Implement image alignment using feature detection and tracking. [Example](http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_brief.html) #### Milestones ##### GSOC 2017 CODING STARTS -* Have familiarised yourself with the algorithms and with Python packaging. Have worked with the mentors to get the package repository setup on GitHub and the CI and documentation running. +- Have familiarised yourself with the algorithms and with Python packaging. Have worked with the mentors to get the package repository setup on GitHub and the CI and documentation running. ##### GSOC 2017 MIDTERM -* Have copied in and documented and tested the MGN code. -* Have opened a PR to SunPy to convert the `sunpy.physics` module to use `sunpy.coordinates`. -* Have implemented the Map warping code. +- Have copied in and documented and tested the MGN code. +- Have opened a PR to SunPy to convert the `sunpy.physics` module to use `sunpy.coordinates`. +- Have implemented the Map warping code. -##### GSOC 2017 FINAL +##### GSOC 2017 FINAL -* Have got the SunPy PR for coordinates in `sunpy.physics` merged. -* Have implemented OCCULT-2. +- Have got the SunPy PR for coordinates in `sunpy.physics` merged. +- Have implemented OCCULT-2. diff --git a/_projects/2017/sunpy/theme.md b/src/content/pages/gsoc/2017/sunpy/theme.md similarity index 73% rename from _projects/2017/sunpy/theme.md rename to src/content/pages/gsoc/2017/sunpy/theme.md index 2ae9af13..d3df59c1 100644 --- a/_projects/2017/sunpy/theme.md +++ b/src/content/pages/gsoc/2017/sunpy/theme.md @@ -2,19 +2,19 @@ name: SunPy Website Improvements desc: Improve the SunPy website and documentation with a new look and new features. requirements: - - Experience with CSS and website design. - - Excellent English language writing skills. + - Experience with CSS and website design. + - Excellent English language writing skills. difficulty: low issues: -mentors: - - Cadair - - dpshelio +mentors: + - Cadair + - dpshelio initiatives: - - GSOC + - GSOC tags: - - sunpy + - sunpy collaborating_projects: - - sunpy + - sunpy --- The SunPy [website](http://sunpy.org) and the SunPy [documentation](http://docs.sunpy.org) do @@ -26,7 +26,7 @@ and as a sphinx theme for the documentation. This project will design a new look for the SunPy website, and implement this as a HTML/CSS theme which can be used by the current Jekyll website, and any future -technology used by the website. +technology used by the website. Once this is done a sphinx theme will be developed that has the same design as the SunPy website, and can be used by the main SunPy documentation and any SunPy @@ -34,12 +34,11 @@ affiliated packages. As extensions to this project any of the following things could be implemented: -* Implement a registry of SunPy Affiliated packages on the website. -* Move away from Jekyll to a Python based static site generator. (Sphinx, Nikola, Pelican etc.) -* Write a sphinx extension that maintains an up to date list on the main website +- Implement a registry of SunPy Affiliated packages on the website. +- Move away from Jekyll to a Python based static site generator. (Sphinx, Nikola, Pelican etc.) +- Write a sphinx extension that maintains an up to date list on the main website of the instruments and data products supported by the sunpy library. -* Improve the content of the SunPy website. - +- Improve the content of the SunPy website. As this project is quite open to be customised in any proposal, a good proposal will have taken the time to evaluate what can be achieved within the time frame @@ -52,12 +51,12 @@ undertake the project to a high standard. ##### GSOC 2017 CODING STARTS -* Have evaulated which tools will be used to undertake the project in collaboration with the mentors. +- Have evaulated which tools will be used to undertake the project in collaboration with the mentors. ##### GSOC 2017 MIDTERM -* Have designed and implemented the website theme. +- Have designed and implemented the website theme. ##### GSOC 2017 FINAL -* Have created the sphinx theme and finished any extensions to the base project. +- Have created the sphinx theme and finished any extensions to the base project. diff --git a/src/content/pages/gsoc/2018/astropy/astropy-learn-website.md b/src/content/pages/gsoc/2018/astropy/astropy-learn-website.md new file mode 100644 index 00000000..939ba902 --- /dev/null +++ b/src/content/pages/gsoc/2018/astropy/astropy-learn-website.md @@ -0,0 +1,52 @@ +--- +name: Astropy Learn Website +desc: Design and Implement landing page for Astropy Learn ecosystem. +# add a short one line description of your project +requirements: + # Student requirements: + - Web development knowledge + - User interface design and user experience + - Knowledge of the Sphinx documentation tool is a plus +difficulty: moderate +issues: +# Related issues (if any) to this project. +mentors: + # First person in contact; mentors may change before project starts. + - kelle + - eblur + - adrn + - eteq +initiatives: + - GSOC +tags: + # Different technologies needed + - Web design + - javascript + - python +collaborating_projects: + # suborganization(s) to which this project belongs. + - astropy +--- + +Design and Implement landing page for Astropy Learn ecosystem. + +#### Description + +This project is for the creation of a landing web page for the Astropy Learn ecosystem. The Learn ecosystems includes the Astropy documentation and associated examples, the Astropy tutorials, and guides (e.g., worked out science use cases). Implementing this likely also requires harmonizing the existing tutorials web site with the astropy documentation (which is generated by Sphinx). This project may also include indexing/tagging of the materials and searching for content (this is already possible to some extent, but the current capabilities are inadequate). + +#### Possible Milestones + +##### At start of coding for GSOC 2018 + +- Have a big-picture plan for how the learn landing page, astropy web site, astropy docs, and astropy tutorials link together. +- Have a general sense of what actual web page javascript code and sphinx extension changes might be necessary. + +##### GSOC 2018 Midterm + +- Have a draft design for the new web pages ready to get comment from the community. +- Have Pull Requests open for any changes necessary to the astropy documentation or tutorials page templates. + +##### GSOC 2018 Final + +- Have the completed landing page launched. +- (Stretch goal) Include in the landing page a search that works across all of the learn resources. diff --git a/_projects/2018/astropy/astroquery.md b/src/content/pages/gsoc/2018/astropy/astroquery.md similarity index 80% rename from _projects/2018/astropy/astroquery.md rename to src/content/pages/gsoc/2018/astropy/astroquery.md index 1ba6d2ac..be5ef9d6 100644 --- a/_projects/2018/astropy/astroquery.md +++ b/src/content/pages/gsoc/2018/astropy/astroquery.md @@ -2,26 +2,26 @@ name: Add additional archives to astroquery desc: Implement module(s) to access currently unsupported astronomical archives using astroquery. requirements: - - Python - - Basic understanding of web queries and APIs + - Python + - Basic understanding of web queries and APIs difficulty: low issues: - - https://github.com/astropy/astroquery/issues/226 + - https://github.com/astropy/astroquery/issues/226 mentors: - - keflavich - - bsipocz - - pllim - - migueldvb - - stargaser + - keflavich + - bsipocz + - pllim + - migueldvb + - stargaser initiatives: - - GSOC + - GSOC tags: - - python - - astroquery - - astropy + - python + - astroquery + - astropy collaborating_projects: - - astropy - - astroquery + - astropy + - astroquery --- #### Description @@ -34,8 +34,7 @@ A full list of new services that have been suggested by our users [can be found in these issues](https://github.com/astropy/astroquery/issues?q=is%3Aissue+is%3Aopen+label%3A%22New+Service%22), and a summary [in this issue](https://github.com/astropy/astroquery/issues/226). - -A *possible* set of milestones for any particular one of these modules might be: +A _possible_ set of milestones for any particular one of these modules might be: 1. Research the web API for the archive sufficiently to determine what exactly astroquery should expose. 2. Determine the best interface to access the simplest subset of that archive that would be useful. diff --git a/_projects/2018/astropy/astrowidgets.md b/src/content/pages/gsoc/2018/astropy/astrowidgets.md similarity index 73% rename from _projects/2018/astropy/astrowidgets.md rename to src/content/pages/gsoc/2018/astropy/astrowidgets.md index 97b6d956..52662cd0 100644 --- a/_projects/2018/astropy/astrowidgets.md +++ b/src/content/pages/gsoc/2018/astropy/astrowidgets.md @@ -2,21 +2,21 @@ name: Jupyter widgets for Astropy desc: Create "astrowidgets" - Jupyter widgets for Astropy. requirements: - - Python - - Very basic knowledge of CSS. - - Basic understanding of javascript. + - Python + - Very basic knowledge of CSS. + - Basic understanding of javascript. difficulty: intermediate mentors: - - mwcraig - - astrofrog + - mwcraig + - astrofrog initiatives: - - GSOC + - GSOC tags: - - python - - javascript + - python + - javascript collaborating_projects: - - astropy - - astrowidgets + - astropy + - astrowidgets --- #### Description @@ -27,15 +27,15 @@ The final deliverable for the project will be a new package ready for applicatio Some of the deliverables for this project would be widget interfaces for: -+ A FITS image viewer utilizing the affiliated package [ginga](https://github.com/ejeschke/ginga) to handle the image display. This widget should allow for overlays of sources from catalogs (using [astroquery](https://github.com/astropy/astroquery)), selection of sources in the image using a mouse, and user-configurable key bindings. An initial implementation, using [ipyevents](https://github.com/mwcraig/ipyevents), has been done in [ginga](https://github.com/ejeschke/ginga). -+ Point source detection and photometry using either [photutils](https://github.com/astropy/photutils) or [sep](https://github.com/kbarbary/sep). -+ Observation planning using [astroplan](https://github.com/astropy/astroplan). +- A FITS image viewer utilizing the affiliated package [ginga](https://github.com/ejeschke/ginga) to handle the image display. This widget should allow for overlays of sources from catalogs (using [astroquery](https://github.com/astropy/astroquery)), selection of sources in the image using a mouse, and user-configurable key bindings. An initial implementation, using [ipyevents](https://github.com/mwcraig/ipyevents), has been done in [ginga](https://github.com/ejeschke/ginga). +- Point source detection and photometry using either [photutils](https://github.com/astropy/photutils) or [sep](https://github.com/kbarbary/sep). +- Observation planning using [astroplan](https://github.com/astropy/astroplan). In addition, these Jupyter notebooks will be developed: -+ Sample notebooks demonstrating how to compose the widgets into applications. -+ An image reduction notebook, similar to [reducer](https://github.com/mwcraig/reducer). -+ A photometry notebook for source detection and photometry. -+ A notebook for performing differential photometry on a time series of measurements. +- Sample notebooks demonstrating how to compose the widgets into applications. +- An image reduction notebook, similar to [reducer](https://github.com/mwcraig/reducer). +- A photometry notebook for source detection and photometry. +- A notebook for performing differential photometry on a time series of measurements. Preliminary development of this project is already underway, so some of the specific deliverables might have changed by the beginning of the summer of code. diff --git a/_projects/2018/astropy/casa-regions.md b/src/content/pages/gsoc/2018/astropy/casa-regions.md similarity index 88% rename from _projects/2018/astropy/casa-regions.md rename to src/content/pages/gsoc/2018/astropy/casa-regions.md index c75c1126..ef718e6b 100644 --- a/_projects/2018/astropy/casa-regions.md +++ b/src/content/pages/gsoc/2018/astropy/casa-regions.md @@ -2,22 +2,22 @@ name: CASA CRTF region file handling desc: Implement a parser for CASA CRTF region files requirements: - - Python + - Python difficulty: low issues: - - https://github.com/astropy/regions/issues/119 + - https://github.com/astropy/regions/issues/119 mentors: - - keflavich - - migueldvb + - keflavich + - migueldvb initiatives: - - GSOC + - GSOC tags: - - python - - regions - - astropy + - python + - regions + - astropy collaborating_projects: - - astropy - - regions + - astropy + - regions --- #### Description @@ -28,7 +28,6 @@ CASA is the main package for radio interferometry data reduction and processing. CASA regions are mostly compatible with and translatable to ds9 regions and other formats, but the only parser that presently exists lives within CASA. Details about the CASA region parser are linked from the [associated issue](https://github.com/astropy/regions/issues/119). - Some milestones for this project will be: 1. Implementation of basic region reading without metadata diff --git a/_projects/2018/astropy/ccdproc-optimize.md b/src/content/pages/gsoc/2018/astropy/ccdproc-optimize.md similarity index 59% rename from _projects/2018/astropy/ccdproc-optimize.md rename to src/content/pages/gsoc/2018/astropy/ccdproc-optimize.md index ee717dc7..1fb0b750 100644 --- a/_projects/2018/astropy/ccdproc-optimize.md +++ b/src/content/pages/gsoc/2018/astropy/ccdproc-optimize.md @@ -3,25 +3,26 @@ name: Optimizing performance of ccdproc desc: Optimize speed and memory use of the package ccdproc. # add a short one line description of your project requirements: -# Student requirements: - - Familiar with the basics of astronomical image reduction + # Student requirements: + - Familiar with the basics of astronomical image reduction difficulty: medium mentors: -# First person in contact; mentors may change before project starts. - - mwcraig - - crawfordsm - - bsipocz + # First person in contact; mentors may change before project starts. + - mwcraig + - crawfordsm + - bsipocz initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - Cython (maybe) + # Different technologies needed + - python + - Cython (maybe) collaborating_projects: -# suborganisation(s) to which this project belongs. - - astropy - - ccdproc + # suborganization(s) to which this project belongs. + - astropy + - ccdproc --- + Optimizing performance of ccdproc #### Description @@ -32,14 +33,14 @@ The [ccdproc](https://ccdproc.readthedocs.io) package contains functions for red ##### GSOC 2018 CODING STARTS -* Perform developer install of `ccdproc` -* Install Python profiling tools -* Install and run `asv`. +- Perform developer install of `ccdproc` +- Install Python profiling tools +- Install and run `asv`. ##### GSOC 2018 Milestones -* Profile code to identify targets for performance (speed) optimization. -* Set up regular performance testing of `ccdproc` on CI. -* Propose fixes for each of the problems identified in previous milestone. -* Identify memory bottlenecks. -* Fix memory bottlenecks. +- Profile code to identify targets for performance (speed) optimization. +- Set up regular performance testing of `ccdproc` on CI. +- Propose fixes for each of the problems identified in previous milestone. +- Identify memory bottlenecks. +- Fix memory bottlenecks. diff --git a/_projects/2018/astropy/mcmc.md b/src/content/pages/gsoc/2018/astropy/mcmc.md similarity index 65% rename from _projects/2018/astropy/mcmc.md rename to src/content/pages/gsoc/2018/astropy/mcmc.md index 4fdb84d7..55b2caf2 100644 --- a/_projects/2018/astropy/mcmc.md +++ b/src/content/pages/gsoc/2018/astropy/mcmc.md @@ -2,22 +2,22 @@ name: A compatibility protocol for astropy models and emcee desc: Implement a protocol to enable astropy models to be used in emcee requirements: - - Python - - Solid understanding of probability (likelihood functions, Bayes' theorem, etc) - - Working knowledge on Markov Chain Monte Carlo + - Python + - Solid understanding of probability (likelihood functions, Bayes' theorem, etc) + - Working knowledge on Markov Chain Monte Carlo difficulty: medium mentors: - - mirca - - karllark - - eteq + - mirca + - karllark + - eteq initiatives: - - GSOC + - GSOC tags: - - python - - astropy - - emcee + - python + - astropy + - emcee collaborating_projects: - - astropy + - astropy --- #### Description @@ -30,29 +30,33 @@ on the other hand, offers a myriad of easy-to-use models. The goal of this project is to design and implement a protocol that enables astropy models to be used in emcee. -A *potential* list of milestones might be: +A _potential_ list of milestones might be: 1. Determine the best way to integrate an astropy model with -a posterior distribution. + a posterior distribution. 2. Design and implement classes to represent Likelihood Functions and -Prior distributions. + Prior distributions. 3. Determine the best interface to be exposed to the user. For example, -``` + +```python g = Gaussian1D() posterior = g.sample(likelihood='gaussian', prior='uniform', nwalkers=1000, kwargs) ``` + or -``` + +```python sampler = Sampler() posterior = sampler(model=Gaussian1D(), likelihood='gaussian', prior='uniform', nwalkers=1000, kwargs) ``` -4. Write unit tests and documentation (using the astropy affiliated package template) -to ensure the implementations are operational. -*Notes: a potential good start for any candidates would be to take an -extensive look at* +1. Write unit tests and documentation (using the astropy affiliated package template) + to ensure the implementations are operational. + +_Notes: a potential good start for any candidates would be to take an +extensive look at_ [this](https://github.com/astropy/astropy-model-ideas/blob/master/MCMCWithAstropyModels.ipynb) -*IPython notebook.* +_IPython notebook._ -*Might be worth to look at* [oktopus](https://github.com/KeplerGO/oktopus) -*for inspiration on step 2.* +_Might be worth to look at_ [oktopus](https://github.com/KeplerGO/oktopus) +_for inspiration on step 2._ diff --git a/src/content/pages/gsoc/2018/astropy/sphinx-example-index.md b/src/content/pages/gsoc/2018/astropy/sphinx-example-index.md new file mode 100644 index 00000000..faad1631 --- /dev/null +++ b/src/content/pages/gsoc/2018/astropy/sphinx-example-index.md @@ -0,0 +1,55 @@ +--- +name: Indexing examples in Astropy Sphinx documentation +desc: Write a Sphinx plugin to identify examples in the Astropy documentation, tag/index them, and build an example gallery from them +# add a short one line description of your project +requirements: + # Student requirements: + - Knowledge of [sphinx](http://www.sphinx-doc.org/en/stable/) + - Interest in user training +difficulty: moderate +issues: + # Related issues (if any) to this project. + - https://github.com/astropy/astropy/issues/6589 + - https://github.com/astropy/astropy-helpers/issues/371 +mentors: + # First person in contact; mentors may change before project starts. + - eteq + - adrn + - bsipocz +initiatives: + - GSOC +tags: + # Different technologies needed + - python + - sphinx +collaborating_projects: + # suborganization(s) to which this project belongs. + - astropy +--- + +Write a Sphinx plugin to identify examples in the Astropy documentation, tag/index them, and build an example gallery from them + +#### Description + +The [current astropy example gallery](http://docs.astropy.org/en/stable/generated/examples/) is problematic because it duplicates content from the astropy documentation and it is not clear which examples are "worthy" of the example gallery. It also overlaps with the [astropy tutorials](http://tutorials.astropy.org). Hence, this project is focused on developing the infrastructure to auto-generate the example gallery from examples _in_ the documentation. This will require building a Sphinx plugin to find tagged examples and generating links. It will also require coordinating moving of existing gallery examples to the documentation and tagging them appropriately. + +#### Possible Milestones + +##### At start of coding for GSOC 2018 + +- Identify what labeling technique is best for tagging the examples. +- Solicit authors of gallery examples to determine where they should be moved. Some may belong in the documentations, whil others might be better places as Astropy Tutorials. +- Determine where the plugin will go (either a standalone small package, in the astropy-helpers, or in astropy itself), in consultation with the Astropy documentation maintainers. + +##### GSOC 2018 Midterm + +- Have examples identified and ready to be moved out of the gallery and into their relevant locations in the astropy docs or tutorials. +- Have a first-draft working plugin ready for review by Astropy documentation maintainers. +- Determine how difficult it will be to have an example _gallery_ (as opposed to simply an index/list of the examples). + +##### GSOC 2018 Final + +- Release the plugin, with minimum functionality of generating the example list (or have it merged if it ends up as part of another project). +- (Stretch Goal) have the plugin generate an example gallery instead of a list. +- Complete a Pull Request to activate the (finished) plugin in the Astropy repository. +- Have a Pull Request to tag all the relevant examples which sucessfully generates the example _list_. diff --git a/src/content/pages/gsoc/2018/astropy/table-optimize.md b/src/content/pages/gsoc/2018/astropy/table-optimize.md new file mode 100644 index 00000000..fc6e8b33 --- /dev/null +++ b/src/content/pages/gsoc/2018/astropy/table-optimize.md @@ -0,0 +1,61 @@ +--- +name: Improving astropy Table performance +desc: Improve the speed of common Table operations like slicing +# add a short one line description of your project +requirements: + # Student requirements: + - Familiar with Cython and Python code profiling + - Familiar with Python speed optimization strategies +difficulty: medium +issues: +# Related issues (if any) to this project. +mentors: + # First person in contact; mentors may change before project starts. + - taldcroft +initiatives: + - GSOC +tags: + # Different technologies needed + - python + - Cython +collaborating_projects: + # suborganization(s) to which this project belongs. + - astropy +--- + +Improving astropy Table performance + +#### Description + +The astropy table sub-package defines a core Table class that is +used to store and manipulate tabular data within astropy. This class +was written with an emphasis on functionality, convenience for astronomers, +and code clarity. With the astropy table package now fairly mature +and with a strong set of regression tests in place, it is time to focus +on performance for basic operations like table creation and slicing. +For a simple operation like slicing, astropy Table is currently about +a factor of 10 slower than Pandas. This project will focus on identifying +performance bottlenecks, writing performance tests for astropy-benchmarks, +and then developing code to improve the performance. It is possible that +some fixes + +#### Milestones (if any) + +##### GSOC 2018 CODING STARTS + +- Perform developer install of `astropy`. +- Install Python profiling tools. +- Study astropy and the table package capabilities. + +##### GSOC 2018 MIDTERM + +- Install and run `asv`. +- Examine existing `asv` benchmarks and identify areas for improved benchmarking. +- Profile key parts of table code and identify performance bottlenecks. +- Identify strategies for improved speed performance. +- Implement initial performance improvements. + +##### GSOC 2018 FINAL + +- Continue and finalize implementation of performance improvements. +- Contine and finalize additional `asv` benchmark tests. diff --git a/_projects/2018/astropy/tutorials.md b/src/content/pages/gsoc/2018/astropy/tutorials.md similarity index 53% rename from _projects/2018/astropy/tutorials.md rename to src/content/pages/gsoc/2018/astropy/tutorials.md index 7a65ba20..62e5d61c 100644 --- a/_projects/2018/astropy/tutorials.md +++ b/src/content/pages/gsoc/2018/astropy/tutorials.md @@ -3,39 +3,40 @@ name: Develop Astropy Tutorials and/or Guides desc: Generate content used to demonstrate advanced functionality of Astropy # add a short one line description of your project requirements: -# Student requirements: - - Knowledge of Astropy and affiliated packages functionality. - - Interest in developing educational materials. - - Knowledge of Astronomy sufficient for developing selected tutorials on specific science cases. + # Student requirements: + - Knowledge of Astropy and affiliated packages functionality. + - Interest in developing educational materials. + - Knowledge of Astronomy sufficient for developing selected tutorials on specific science cases. difficulty: High issues: -# Related issues (if any) to this project. - - https://github.com/astropy/astropy-tutorials/issues?q=is%3Aissue+is%3Aopen+label%3Acontent-new + # Related issues (if any) to this project. + - https://github.com/astropy/astropy-tutorials/issues?q=is%3Aissue+is%3Aopen+label%3Acontent-new mentors: -# First person in contact; mentors may change before project starts. - - kelle - - eblur - - adrn - - eteq + # First person in contact; mentors may change before project starts. + - kelle + - eblur + - adrn + - eteq initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - Jupyter notebooks + # Different technologies needed + - python + - Jupyter notebooks collaborating_projects: -# suborganisation(s) to which this project belongs. - - astropy + # suborganization(s) to which this project belongs. + - astropy --- + Generate content used to demonstrate advanced functionality of Astropy #### Description -Create tutorials and/or guides which demonstrate more complex uses of astropy and affiliate package functionality. E.g., use of classes and object-oriented programming for astronomical data analysis with Astropy, usage of astroquery and ccdproc together to download and reduce an image, etc. +Create tutorials and/or guides which demonstrate more complex uses of astropy and affiliate package functionality. E.g., use of classes and object-oriented programming for astronomical data analysis with Astropy, usage of astroquery and ccdproc together to download and reduce an image, etc. Must would work closely with Astropy Tutorial Leads to identify tutorial topics, as well as a tutorial flow/narrative. The student will primarily be mostly responsible for writing the code, but not the pedagogy. #### Possible Milestones -* Have a list of possible tutorials to develop -* Have an outline of selected tutorial(s) for review by the Learn team and/or an astropy package maintainer. -* Complete the tutorial by getting it merged in the [astropy-tutorials repository](https://github.com/astropy/astropy-tutorials). +- Have a list of possible tutorials to develop +- Have an outline of selected tutorial(s) for review by the Learn team and/or an astropy package maintainer. +- Complete the tutorial by getting it merged in the [astropy-tutorials repository](https://github.com/astropy/astropy-tutorials). diff --git a/_projects/2017/glue/widgets.md b/src/content/pages/gsoc/2018/glue/widgets.md similarity index 54% rename from _projects/2017/glue/widgets.md rename to src/content/pages/gsoc/2018/glue/widgets.md index 51ed412c..779f9da5 100644 --- a/_projects/2017/glue/widgets.md +++ b/src/content/pages/gsoc/2018/glue/widgets.md @@ -3,34 +3,35 @@ name: New glue widgets desc: Expand the functionality of glue by developing a range of new widgets, including to better read in and edit data. # add a description of your project requirements: - - Proficiency in Python - - Familiarity with GUI programming, ideally Qt + - Proficiency in Python + - Familiarity with GUI programming, ideally Qt difficulty: medium issues: - - https://github.com/glue-viz/glue/issues/836 - - https://github.com/glue-viz/glue/issues/981 - - https://github.com/glue-viz/glue/issues/1073 + - https://github.com/glue-viz/glue/issues/836 + - https://github.com/glue-viz/glue/issues/981 + - https://github.com/glue-viz/glue/issues/1073 mentors: - - astrofrog + - astrofrog initiatives: - - GSOC + - GSOC tags: - - python + - python collaborating_projects: - - glue + - glue --- + #### Description This project is to develop new widgets/dialogs inside glue. Examples include: -* A dialog that would be useful beyond this project is a dialog for importing +- A dialog that would be useful beyond this project is a dialog for importing ASCII tables into glue, similar to the CSV import functionality in e.g. OpenOffice/LibreOffice or Excel. -* A dialog that allows the user to edit components of a datasets, including +- A dialog that allows the user to edit components of a datasets, including renaming them, sorting them, and changing datatypes. -* A dialog that can be used to re-order categorical components +- A dialog that can be used to re-order categorical components -* A dialog to visually create simple selections (for example that a specific +- A dialog to visually create simple selections (for example that a specific component should be in a certain range) diff --git a/_projects/2018/heliopy/heliopy-units.md b/src/content/pages/gsoc/2018/heliopy/heliopy-units.md similarity index 69% rename from _projects/2018/heliopy/heliopy-units.md rename to src/content/pages/gsoc/2018/heliopy/heliopy-units.md index 1a381771..2eef1c11 100644 --- a/_projects/2018/heliopy/heliopy-units.md +++ b/src/content/pages/gsoc/2018/heliopy/heliopy-units.md @@ -2,23 +2,24 @@ name: Using physical units with HelioPy desc: Convert HelioPy's data import methods to return data that has units attached. requirements: - - Some experience using python - - Some knowledge about different physical units and their use in science - (e.g. time, distance, velocity) + - Some experience using python + - Some knowledge about different physical units and their use in science + (e.g. time, distance, velocity) difficulty: low issues: - - https://github.com/heliopython/heliopy/issues/291 + - https://github.com/heliopython/heliopy/issues/291 mentors: - - dstansby - - dpshelio + - dstansby + - dpshelio initiatives: - - GSOC + - GSOC tags: - - python - - heliopy + - python + - heliopy collaborating_projects: - - heliopy + - heliopy --- + #### Description HelioPy is a relatively new python package, whose aim is to automate the @@ -39,22 +40,22 @@ Find more information about [HelioPy](http://docs.heliopy.org/en/stable/) and ##### GSOC 2018 CODING STARTS -* Have installed HelioPy and used it to download and plot some data to get a +- Have installed HelioPy and used it to download and plot some data to get a feel of how it currently works. -* Have read the documentation on astropy units and know how they work, +- Have read the documentation on astropy units and know how they work, and what their advantages are over using data without units. ##### GSOC 2018 1ST EVALUATION -* Have investigated a way of automatically extracting the correct units from +- Have investigated a way of automatically extracting the correct units from raw data files. ##### GSOC 2018 2ND EVALUATION -* Have written code to make at least one data import function return data +- Have written code to make at least one data import function return data with units attached. ##### GSOC 2018 FINAL EVALUATION -* Have expanded the new code to all of the data import functions, to make +- Have expanded the new code to all of the data import functions, to make HelioPy fully compatible with the astropy units system. diff --git a/src/content/pages/gsoc/2018/index.md b/src/content/pages/gsoc/2018/index.md new file mode 100644 index 00000000..56e38c80 --- /dev/null +++ b/src/content/pages/gsoc/2018/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2018" +show_main: false +season: 2018 +--- diff --git a/_projects/2018/juliaastro/astronomicaltime.md b/src/content/pages/gsoc/2018/juliaastro/astronomicaltime.md similarity index 83% rename from _projects/2018/juliaastro/astronomicaltime.md rename to src/content/pages/gsoc/2018/juliaastro/astronomicaltime.md index 6b895ae1..65979dff 100644 --- a/_projects/2018/juliaastro/astronomicaltime.md +++ b/src/content/pages/gsoc/2018/juliaastro/astronomicaltime.md @@ -2,26 +2,26 @@ name: Porting ERFA's Time Scale Conversion Functions to Julia desc: Expand the ecosystem of astronomical routines in the Julia language. requirements: - - Julia - - C - - Knowledge of astronomical time systems is beneficial, but not required + - Julia + - C + - Knowledge of astronomical time systems is beneficial, but not required difficulty: low to intermediate mentors: - - helgee - - giordano + - helgee + - giordano initiatives: - - GSOC + - GSOC tags: - - julia + - julia collaborating_projects: - - JuliaAstro + - JuliaAstro --- #### Description [Julia](http://julialang.org/) is a programming language designed for technical computing that combines ease-of-use of dynamical languages and high-performance -of statically-compiled languages like C. Its most notable feature +of statically-compiled languages like C. Its most notable feature is [multiple dispatch](http://en.wikipedia.org/wiki/Multiple_dispatch), which greatly simplifies the definition of complex functions whose behavior depends on the type of the arguments. @@ -41,11 +41,11 @@ packages's interoperability with the rest of the Julia ecosystem and validate the new implementation against ERFA. If you don't know where to start from, have a look at: -* the +- the [AstroTime.jl manual](https://juliaastro.github.io/AstroTime.jl/latest/index.html), -* the [TODO list](https://github.com/JuliaAstro/AstroTime.jl/issues/1) - of the project, with the list of *all* functions not yet ported, -* the [SOFA Time Scale and Calendar Tools](http://www.iausofa.org/2017_0420_C/sofa/sofa_ts_c.pdf) +- the [TODO list](https://github.com/JuliaAstro/AstroTime.jl/issues/1) + of the project, with the list of _all_ functions not yet ported, +- the [SOFA Time Scale and Calendar Tools](http://www.iausofa.org/2017_0420_C/sofa/sofa_ts_c.pdf) manual. While experience with programming in Julia would be helpful, it is not diff --git a/_projects/2018/plasmapy/plasma-object.md b/src/content/pages/gsoc/2018/plasmapy/plasma-object.md similarity index 85% rename from _projects/2018/plasmapy/plasma-object.md rename to src/content/pages/gsoc/2018/plasmapy/plasma-object.md index a0f621fe..9a4a4779 100644 --- a/_projects/2018/plasmapy/plasma-object.md +++ b/src/content/pages/gsoc/2018/plasmapy/plasma-object.md @@ -2,20 +2,20 @@ name: Plasma class desc: Devlop a new Plasma class for loading and storing multiple types of plasma physics data. requirements: - - Good knowledge of Python, including object-oriented programming - - Some background of physics preferred, especially electromagnetism, flulid mechanics and/or plasma physics - - Some experience with scientific data formats, especially plasma physics data formats, is preferred + - Good knowledge of Python, including object-oriented programming + - Some background of physics preferred, especially electromagnetism, flulid mechanics and/or plasma physics + - Some experience with scientific data formats, especially plasma physics data formats, is preferred difficulty: High mentors: - - SolarDrew - - namurphy - - StanczakDominik + - SolarDrew + - namurphy + - StanczakDominik initiatives: - - GSOC + - GSOC tags: - - python + - python collaborating_projects: - - PlasmaPy + - PlasmaPy --- #### Description diff --git a/_projects/2018/poliastro/benchmark-propagators.md b/src/content/pages/gsoc/2018/poliastro/benchmark-propagators.md similarity index 60% rename from _projects/2018/poliastro/benchmark-propagators.md rename to src/content/pages/gsoc/2018/poliastro/benchmark-propagators.md index 0362933a..97965539 100644 --- a/_projects/2018/poliastro/benchmark-propagators.md +++ b/src/content/pages/gsoc/2018/poliastro/benchmark-propagators.md @@ -2,25 +2,25 @@ name: Benchmark orbit propagators desc: Implement several orbit propagation algorithms to improve current error rates and performance requirements: - - Familiar with numerical analysis + - Familiar with numerical analysis difficulty: medium issues: - - https://github.com/poliastro/poliastro/issues/253 - - https://github.com/poliastro/poliastro/issues/265 - - https://github.com/poliastro/poliastro/issues/285 - - https://github.com/poliastro/poliastro/issues/286 - - https://github.com/poliastro/poliastro/issues/294 + - https://github.com/poliastro/poliastro/issues/253 + - https://github.com/poliastro/poliastro/issues/265 + - https://github.com/poliastro/poliastro/issues/285 + - https://github.com/poliastro/poliastro/issues/286 + - https://github.com/poliastro/poliastro/issues/294 mentors: - - astrojuanlu - - aunsiro + - astrojuanlu + - aunsiro initiatives: - - GSOC + - GSOC tags: - - python - - scipy - - numba + - python + - scipy + - numba collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -46,30 +46,30 @@ choose the best that suits their needs. ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and reproduced the existing propagation +- Have set up a development environment and reproduced the existing propagation issues. ##### 1st evaluation -* Fix [convergence problems (#265)](https://github.com/poliastro/poliastro/issues/265), +- Fix [convergence problems (#265)](https://github.com/poliastro/poliastro/issues/265), either with a new propagator or fixing the current one -* Have all code, tests and documentation in GitHub +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* Add time and accuracy benchmarks for the propagators that can be easily +- Add time and accuracy benchmarks for the propagators that can be easily reproducible -* Have all code, tests and documentation in GitHub +- Have all code, tests and documentation in GitHub ##### Final -* Have at least two new propagators -* Have all code, tests and documentation in GitHub +- Have at least two new propagators +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding propagation, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Give a talk about the work at some Python event +- Fix any bugs that might appear regarding propagation, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Give a talk about the work at some Python event diff --git a/_projects/2018/poliastro/export-czml.md b/src/content/pages/gsoc/2018/poliastro/export-czml.md similarity index 56% rename from _projects/2018/poliastro/export-czml.md rename to src/content/pages/gsoc/2018/poliastro/export-czml.md index e2ea826e..b3368b5a 100644 --- a/_projects/2018/poliastro/export-czml.md +++ b/src/content/pages/gsoc/2018/poliastro/export-czml.md @@ -2,22 +2,22 @@ name: Export to CZML desc: Implement export of Orbit objects to CZML to visualize in Cesium.js requirements: - - Familiar with the JSON format - - Basic experience with JavaScript or TypeScript + - Familiar with the JSON format + - Basic experience with JavaScript or TypeScript difficulty: medium issues: - - https://github.com/poliastro/poliastro/issues/117 - - https://github.com/poliastro/poliastro/issues/287 + - https://github.com/poliastro/poliastro/issues/117 + - https://github.com/poliastro/poliastro/issues/287 mentors: - - astrojuanlu - - newlawrence + - astrojuanlu + - newlawrence initiatives: - - GSOC + - GSOC tags: - - python - - javascript + - python + - javascript collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -38,33 +38,33 @@ understand our output. ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and get familiar with the Cesium +- Have set up a development environment and get familiar with the Cesium Sandcastle (see "Additional resources") ##### 1st evaluation -* Have basic export for an orbit around the Earth -* Have all code, tests and documentation in GitHub +- Have basic export for an orbit around the Earth +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* Have complex export that includes attractors and target bodies, if any -* Have all code, tests and documentation in GitHub +- Have complex export that includes attractors and target bodies, if any +- Have all code, tests and documentation in GitHub ##### Final -* Have created a Cesium application that understand the necessary metadata -* Have all code, tests and documentation in GitHub +- Have created a Cesium application that understand the necessary metadata +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Give a talk about the work at some Python event +- Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Give a talk about the work at some Python event #### Additional resources -* [Cesium Sandcastle](https://cesiumjs.org/Cesium/Build/Apps/Sandcastle/index.html?src=CZML.html&label=DataSources) -* [Sample data](https://github.com/AnalyticalGraphicsInc/cesium/blob/master/Apps/SampleData/simple.czml) +- [Cesium Sandcastle](https://cesiumjs.org/Cesium/Build/Apps/Sandcastle/index.html?src=CZML.html&label=DataSources) +- [Sample data](https://github.com/AnalyticalGraphicsInc/cesium/blob/master/Apps/SampleData/simple.czml) diff --git a/_projects/2018/poliastro/reference-frames.md b/src/content/pages/gsoc/2018/poliastro/reference-frames.md similarity index 64% rename from _projects/2018/poliastro/reference-frames.md rename to src/content/pages/gsoc/2018/poliastro/reference-frames.md index b33c6d22..bd7464eb 100644 --- a/_projects/2018/poliastro/reference-frames.md +++ b/src/content/pages/gsoc/2018/poliastro/reference-frames.md @@ -2,23 +2,23 @@ name: Add reference frames to Orbit objects desc: Make Orbit objects completely defined by adding a reference frame as a property requirements: - - Knowledge on kinematics - - A taste for API design + - Knowledge on kinematics + - A taste for API design difficulty: medium issues: - - https://github.com/poliastro/poliastro/issues/109 - - https://github.com/poliastro/poliastro/issues/257 - - https://github.com/poliastro/poliastro/issues/288 + - https://github.com/poliastro/poliastro/issues/109 + - https://github.com/poliastro/poliastro/issues/257 + - https://github.com/poliastro/poliastro/issues/288 mentors: - - astrojuanlu - - newlawrence + - astrojuanlu + - newlawrence initiatives: - - GSOC + - GSOC tags: - - python - - astropy + - python + - astropy collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -47,33 +47,33 @@ for instance using the SPICE toolkit by NASA. Check out ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and run a basic example using SPICE +- Have set up a development environment and run a basic example using SPICE kernels. ##### 1st evaluation -* Have all the current reference frames conversion validated against SpiceyPy -* Have all code, tests and documentation in GitHub +- Have all the current reference frames conversion validated against SpiceyPy +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* Have a working prototype on how to add reference frames to `Orbit` objects -* Have all code, tests and documentation in GitHub +- Have a working prototype on how to add reference frames to `Orbit` objects +- Have all code, tests and documentation in GitHub ##### Final -* Have finished the refactoring of `Orbit` objects to allow for reference frames, +- Have finished the refactoring of `Orbit` objects to allow for reference frames, using a default one if appropriate -* Have all code, tests and documentation in GitHub +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, reference frames and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Give a talk about the work at some Python event +- Fix any bugs that might appear regarding visualization, reference frames and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Give a talk about the work at some Python event #### Additional resources -* [USNO Circular 179](http://aa.usno.navy.mil/publications/docs/Circular_179.pdf) +- [USNO Circular 179](http://aa.usno.navy.mil/publications/docs/Circular_179.pdf) diff --git a/_projects/2018/poliastro/web-app-neos.md b/src/content/pages/gsoc/2018/poliastro/web-app-neos.md similarity index 66% rename from _projects/2018/poliastro/web-app-neos.md rename to src/content/pages/gsoc/2018/poliastro/web-app-neos.md index 84b1133c..3182902e 100644 --- a/_projects/2018/poliastro/web-app-neos.md +++ b/src/content/pages/gsoc/2018/poliastro/web-app-neos.md @@ -2,19 +2,19 @@ name: Web app to visualize asteroid trajectories desc: Create a web application so users can easily visualize Near Earth Object trajectories requirements: - - Experience in web or interface design + - Experience in web or interface design difficulty: medium mentors: - - astrojuanlu - - anhiga + - astrojuanlu + - anhiga initiatives: - - GSOC + - GSOC tags: - - python - - plotly - - dash + - python + - plotly + - dash collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -47,30 +47,30 @@ which recently became a NumFOCUS affiliated project. ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and tried to build some basic Dash +- Have set up a development environment and tried to build some basic Dash application ##### 1st evaluation -* Have a basic web application to display the 3D trajectory of one NEO of choice -* Have all code, tests and documentation in GitHub +- Have a basic web application to display the 3D trajectory of one NEO of choice +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* Allow the user to change the epoch and/or select a time period -* Add examples of popular NEOs and showcase some approaches from the news -* Have all code, tests and documentation in GitHub +- Allow the user to change the epoch and/or select a time period +- Add examples of popular NEOs and showcase some approaches from the news +- Have all code, tests and documentation in GitHub ##### Final -* Allow the user to display more than one NEO in the application -* Allow the user to export the result as a Python script -* Have all code, tests and documentation in GitHub +- Allow the user to display more than one NEO in the application +- Allow the user to export the result as a Python script +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Give a talk about the work at some Python event +- Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Give a talk about the work at some Python event diff --git a/_projects/2018/sunpy/mag_field.md b/src/content/pages/gsoc/2018/sunpy/mag_field.md similarity index 65% rename from _projects/2018/sunpy/mag_field.md rename to src/content/pages/gsoc/2018/sunpy/mag_field.md index 15599207..7f7f48af 100644 --- a/_projects/2018/sunpy/mag_field.md +++ b/src/content/pages/gsoc/2018/sunpy/mag_field.md @@ -3,32 +3,33 @@ name: 3D Map Class for Field Extrapolations in Spherical Coordinates desc: Generalize magnetic field extrapolation to spherical coordinates. # add a short one line description of your project requirements: -# Student requirements: - - Knowledge of vector calculus and differential equations - - Familiar with numerical methods - - Some familiarity with electromagnetism, MHD, potential/force-free magnetic fields (optional) + # Student requirements: + - Knowledge of vector calculus and differential equations + - Familiar with numerical methods + - Some familiarity with electromagnetism, MHD, potential/force-free magnetic fields (optional) difficulty: intermediate issues: -# Related issues (if any) to this project. - - https://github.com/sunpy/solarbextrapolation/issues/12 + # Related issues (if any) to this project. + - https://github.com/sunpy/solarbextrapolation/issues/12 mentors: -# First person in contact; mentors may change before project starts. - - Alex-Ian-Hamilton - - wtbarnes + # First person in contact; mentors may change before project starts. + - Alex-Ian-Hamilton + - wtbarnes initiatives: - - GSOC + - GSOC tags: - - python - - numba - - numpy + - python + - numba + - numpy collaborating_projects: -# suborganisation(s) to which this project belongs. - - sunpy + # suborganization(s) to which this project belongs. + - sunpy --- + #### Description Determining the 3D geometry of the tangled and dynamic coronal magnetic field is an open research problem in solar physics. -A common technique for deriving the 3D vector field from a photospheric magnetogram is to assume a *potential* field such that it can be derived by solving Laplace's equation. +A common technique for deriving the 3D vector field from a photospheric magnetogram is to assume a _potential_ field such that it can be derived by solving Laplace's equation. The SunPy-affiliated [`solarbextrapolation`](https://github.com/sunpy/solarbextrapolation) package solves Laplace's equation using the method of [Sakurai (1982)](http://adsabs.harvard.edu/abs/1982SoPh...76..301S). However, when constructing the 3D field from the magnetogram, the "small-angle" approximation is used such that the curvature of the Sun is ignored, a valid approximation on the scale of an active region. @@ -40,19 +41,22 @@ Currently, the `solarbextrapolation` package uses a Map3D class that is limited It is expected that this new object will serve as a prototype for a first-class data type in the core SunPy package. #### Primary Goals -* Develop a coordinate-aware 3D Map class -* Use 3D Map class for global field extrapolations + +- Develop a coordinate-aware 3D Map class +- Use 3D Map class for global field extrapolations #### Possible Secondary Goals -* Performance improvements -* Improvements to the documentation and examples -* Better visualization methods -* Addition of more advanced extrapolators, e.g. non-linear force-free field + +- Performance improvements +- Improvements to the documentation and examples +- Better visualization methods +- Addition of more advanced extrapolators, e.g. non-linear force-free field #### Additional Resources -* [`solarbextrapolation` package ](https://github.com/sunpy/solarbextrapolation) -* [Maps in SunPy](http://docs.sunpy.org/en/stable/code_ref/map.html) -* [Coordinates in SunPy](http://docs.sunpy.org/en/stable/code_ref/coordinates.html) -* [Coordinates for Solar Image Data -- Thompson (2006)](http://adsabs.harvard.edu/abs/2006A%26A...449..791T) -* [IDL package for global potential field extrapolations](http://www.lmsal.com/~derosa/pfsspack/) -* [Review of Magnetic Field Extrapolation Techniques -- T. Neukirch](http://adsabs.harvard.edu/abs/2005ESASP.596E..12N) + +- [`solarbextrapolation` package](https://github.com/sunpy/solarbextrapolation) +- [Maps in SunPy](http://docs.sunpy.org/en/stable/code_ref/map.html) +- [Coordinates in SunPy](http://docs.sunpy.org/en/stable/code_ref/coordinates.html) +- [Coordinates for Solar Image Data -- Thompson (2006)](http://adsabs.harvard.edu/abs/2006A%26A...449..791T) +- [IDL package for global potential field extrapolations](http://www.lmsal.com/~derosa/pfsspack/) +- [Review of Magnetic Field Extrapolation Techniques -- T. Neukirch](http://adsabs.harvard.edu/abs/2005ESASP.596E..12N) diff --git a/_projects/2018/sunpy/remote_data.md b/src/content/pages/gsoc/2018/sunpy/remote_data.md similarity index 61% rename from _projects/2018/sunpy/remote_data.md rename to src/content/pages/gsoc/2018/sunpy/remote_data.md index 7e125e6a..47e790b3 100644 --- a/_projects/2018/sunpy/remote_data.md +++ b/src/content/pages/gsoc/2018/sunpy/remote_data.md @@ -2,22 +2,22 @@ name: Remote Data in SunPy desc: Implement support for versioned, validated remote data handling in SunPy. requirements: - - Familiar with HTTP client libraries. - - Familiar with checksumming and caches. + - Familiar with HTTP client libraries. + - Familiar with checksumming and caches. difficulty: low issues: - - https://github.com/sunpy/sunpy/issues/1939 - - https://github.com/sunpy/sunpy/issues/1897 + - https://github.com/sunpy/sunpy/issues/1939 + - https://github.com/sunpy/sunpy/issues/1897 mentors: - - Cadair - - wtbarnes - - dpshelio + - Cadair + - wtbarnes + - dpshelio initiatives: - - GSOC + - GSOC tags: - - Python + - Python collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -40,21 +40,21 @@ See [issue #1939](https://github.com/sunpy/sunpy/issues/1939) for more details. ##### Coding Starts -* Engaged with the community and understand the motivation and challenges of the project. +- Engaged with the community and understand the motivation and challenges of the project. ##### Evaluation 1 -* Have evaluated and chosen the best approach for storing a local cache of data. -* Have implemented a basic cache and download system, including tests and documentation. +- Have evaluated and chosen the best approach for storing a local cache of data. +- Have implemented a basic cache and download system, including tests and documentation. ##### Evaluation 2 -* Have worked with your mentors and the community to design a simple and functional API. -* Have a working prototype of this API, including tests. +- Have worked with your mentors and the community to design a simple and functional API. +- Have a working prototype of this API, including tests. ##### Final -* Have finished implementation, testing and documentation. -* Have written examples for the gallery of how to use the functionality. -* Have written developer documentation. -* Have the Pull Request merged after review and feedback. +- Have finished implementation, testing and documentation. +- Have written examples for the gallery of how to use the functionality. +- Have written developer documentation. +- Have the Pull Request merged after review and feedback. diff --git a/_projects/2018/sunpy/roi.md b/src/content/pages/gsoc/2018/sunpy/roi.md similarity index 87% rename from _projects/2018/sunpy/roi.md rename to src/content/pages/gsoc/2018/sunpy/roi.md index 75c0278b..5f81384b 100644 --- a/_projects/2018/sunpy/roi.md +++ b/src/content/pages/gsoc/2018/sunpy/roi.md @@ -3,20 +3,20 @@ name: Region of Interest desc: Meta-Object creation for holding temporal and spatial features. # add a description of your project requirements: - - Familiarity with Python - - Understanding of design patterns + - Familiarity with Python + - Understanding of design patterns difficulty: High issues: - - https://github.com/sunpy/sunpy/issues/164 -mentors: - - dpshelio - - wafels + - https://github.com/sunpy/sunpy/issues/164 +mentors: + - dpshelio + - wafels initiatives: - - GSOC + - GSOC tags: - - sunpy + - sunpy collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -26,7 +26,7 @@ region of interest (ROI) in any physical dimension (such as spatial area, temporal range or spectral window) and interact with the rest of data types used in sunpy. -For example, a region of interest could be a particular area in the Sun +For example, a region of interest could be a particular area in the Sun at a particular moment in time. Therefore, that object should contain the extent of such area, its contour and the time when it was observed. It also needs other information, such as the coordinate system that it @@ -39,6 +39,5 @@ plotting the box containing such region and being aware of difference in time or observational point. So, it needs to be spatial and temporal aware. Additionally, the object needs to understand (be able to parse in) features and -events catalogued in the [HEK](http://www.lmsal.com/hek/hek_isolsearch.html) +events catalogued in the [HEK](http://www.lmsal.com/hek/hek_isolsearch.html) and [HELIO](http://hfc.helio-vo.eu/) databases. - diff --git a/_projects/2018/sunpy/sunkit-image.md b/src/content/pages/gsoc/2018/sunpy/sunkit-image.md similarity index 62% rename from _projects/2018/sunpy/sunkit-image.md rename to src/content/pages/gsoc/2018/sunpy/sunkit-image.md index cb7329d2..62b96fa0 100644 --- a/_projects/2018/sunpy/sunkit-image.md +++ b/src/content/pages/gsoc/2018/sunpy/sunkit-image.md @@ -2,23 +2,23 @@ name: Develop sunkit-image desc: Create and develop a package for solar image analysis. requirements: - - Good understanding of Python. - - Enthusiasm to learn solar image processing. + - Good understanding of Python. + - Enthusiasm to learn solar image processing. difficulty: medium to low issues: - - https://github.com/sunpy/sunpy/pull/1899 + - https://github.com/sunpy/sunpy/pull/1899 mentors: - - Cadair - - wafels - - nabobalis - - mbobra + - Cadair + - wafels + - nabobalis + - mbobra initiatives: - - GSOC + - GSOC tags: - - python - - sunpy + - python + - sunpy collaborating_projects: - - sunpy + - sunpy --- In this project you would create the foundations of the 'sunkit-image' SunPy @@ -39,32 +39,31 @@ the following goals (roughly in this order): 1. Implement the [normalizing-radial-graded filter (NRGF)](http://adsabs.harvard.edu/abs/2006SoPh..236..263M). 2. Port the Multi-Scale Gaussian Normalisation (MGN) code from [#1899](https://github.com/sunpy/sunpy/pull/1899). 3. Implement the [OCCULT-2 algorithm](http://arxiv.org/abs/1307.5046) for coronal loop tracing. -4. Implement image re-sampling as described [here](https://link.springer.com/content/pdf/10.1023/B:SOLA.0000021743.24248.b0.pdf) through updating [this pull request](https://github.com/astropy/reproject/pull/52) to the Astropy [image resampling](https://reproject.readthedocs.io/en/stable/) repository. +4. Implement image re-sampling as described in [this resampling paper](https://link.springer.com/content/pdf/10.1023/B:SOLA.0000021743.24248.b0.pdf) through updating [this pull request](https://github.com/astropy/reproject/pull/52) to the Astropy [image resampling](https://reproject.readthedocs.io/en/stable/) repository. Optional extras: -5. Implement the [soft morphological filtering of solar images](https://www.aanda.org/articles/aa/pdf/2006/38/aa4852-06.pdf) -6. Refactor and write a Python wrapper for [FLCT](https://arxiv.org/abs/0712.4289) [code](http://solarmuri.ssl.berkeley.edu/overview/publicdownloads/software.html). -7. Implement image alignment using feature detection and tracking. [Example](http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_brief.html) - +1. Implement the [soft morphological filtering of solar images](https://www.aanda.org/articles/aa/pdf/2006/38/aa4852-06.pdf) +2. Refactor and write a Python wrapper for [FLCT](https://arxiv.org/abs/0712.4289) [code](http://solarmuri.ssl.berkeley.edu/overview/publicdownloads/software.html). +3. Implement image alignment using feature detection and tracking. [Example](http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_brief.html) #### Milestones ##### GSOC 2018 Official Coding Start -* Have familiarised yourself with the algorithms and with Python packaging. Have worked with the mentors to get the package repository setup on GitHub and the CI and documentation running. +- Have familiarised yourself with the algorithms and with Python packaging. Have worked with the mentors to get the package repository setup on GitHub and the CI and documentation running. ##### To be completed by the GSOC 2018 Phase 1 Evaluation Deadline -* Have implemented, tested and documented the NRGF code. -* Have implemented, tested and documented the MGN code. +- Have implemented, tested and documented the NRGF code. +- Have implemented, tested and documented the MGN code. ##### To be completed by the GSOC 2018 Phase 2 Evaluation Deadline -* Have successfully merged the NRGF and MGN code. -* Have implemented OCCULT-2. +- Have successfully merged the NRGF and MGN code. +- Have implemented OCCULT-2. -##### To be completed by the end of the GSOC 2018 Final Week +##### To be completed by the end of the GSOC 2018 Final Week -* Have tested, documented and merged the OCCULT-2 code. -* Have developed an outline of the implementation of the image resampling code in the context of the Astropy reproject module. +- Have tested, documented and merged the OCCULT-2 code. +- Have developed an outline of the implementation of the image resampling code in the context of the Astropy reproject module. diff --git a/_projects/2018/sunpy/time_refactor.md b/src/content/pages/gsoc/2018/sunpy/time_refactor.md similarity index 68% rename from _projects/2018/sunpy/time_refactor.md rename to src/content/pages/gsoc/2018/sunpy/time_refactor.md index cb7b854e..c3ba2bd4 100644 --- a/_projects/2018/sunpy/time_refactor.md +++ b/src/content/pages/gsoc/2018/sunpy/time_refactor.md @@ -2,25 +2,25 @@ name: Transition to Astropy Time in SunPy desc: Convert the whole SunPy module to using astropy.time to represent time. requirements: - - Good general Python skills. - - Willingness to learn a little about a lot of SunPy. + - Good general Python skills. + - Willingness to learn a little about a lot of SunPy. difficulty: medium issues: - - https://github.com/sunpy/sunpy/issues/993 - - https://github.com/sunpy/sunpy/issues/994 - - https://github.com/sunpy/sunpy/issues/2383 - - https://github.com/sunpy/sunpy/issues/2155 - - https://github.com/sunpy/sunpy/pull/2260 + - https://github.com/sunpy/sunpy/issues/993 + - https://github.com/sunpy/sunpy/issues/994 + - https://github.com/sunpy/sunpy/issues/2383 + - https://github.com/sunpy/sunpy/issues/2155 + - https://github.com/sunpy/sunpy/pull/2260 mentors: - - Cadair - - nabobalis - - Punyaslok + - Cadair + - nabobalis + - Punyaslok initiatives: - - GSOC + - GSOC tags: - - Python + - Python collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -29,7 +29,7 @@ SunPy currently uses `datetime.datetime` objects as it's internal representation of time. The goal of this project is to transition every part of the SunPy codebase to using `astropy.time.Time` instead. The main motivation for this is that the `Time` object in Astropy supports much higher precision representations -of time as well as supporting time formats *e.g.* TAI time which are commonly +of time as well as supporting time formats _e.g._ TAI time which are commonly used by solar physicists. This transition is a major component of the planned SunPy 1.0 release, and will @@ -46,22 +46,21 @@ project will have done substantial research on the use of `parse_time` in the SunPy code and will appreciate the requirements for changes to this part of SunPy. - #### Milestones (if any) ##### Coding Starts -* Engaged with the community and understand the motivation and challenges of the project, especially the desired changes to `parse_time`. +- Engaged with the community and understand the motivation and challenges of the project, especially the desired changes to `parse_time`. ##### Evaluation 1 -* Have implemented a new version of `parse_time` including, tests and documentation. +- Have implemented a new version of `parse_time` including, tests and documentation. ##### Evaluation 2 -* Have transitioned `sunpy.net` to use `astropy.time.Time` +- Have transitioned `sunpy.net` to use `astropy.time.Time` ##### Final -* Have finished transitioning to `Time`, including increasing test coverage where required. -* Have written some narrative documentation to assist users in making the transition. +- Have finished transitioning to `Time`, including increasing test coverage where required. +- Have written some narrative documentation to assist users in making the transition. diff --git a/_projects/2018/timelab/XSPEC.md b/src/content/pages/gsoc/2018/timelab/XSPEC.md similarity index 66% rename from _projects/2018/timelab/XSPEC.md rename to src/content/pages/gsoc/2018/timelab/XSPEC.md index bddacc67..7da412e7 100644 --- a/_projects/2018/timelab/XSPEC.md +++ b/src/content/pages/gsoc/2018/timelab/XSPEC.md @@ -2,74 +2,75 @@ name: Python API for XSPEC desc: Develop a modular python API to use XSPEC (a popular X-ray astronomy tool) in python workflows requirements: -- Familiar with Fortran and/or C++ + - Familiar with Fortran and/or C++ difficulty: hard issues: -- https://github.com/StingraySoftware/stingray/issues/294 + - https://github.com/StingraySoftware/stingray/issues/294 mentors: - - dhuppenkothen - - abigailStev + - dhuppenkothen + - abigailStev initiatives: - - GSOC + - GSOC tags: - - python - - scipy + - python + - scipy collaborating_projects: - - timelab + - timelab --- #### Description -X-ray spectroscopy (measuring and understanding how the brightness of a black -hole source varies with wavelength of the light) is one of the most important -ways we learn about the physics of black holes and their companion stars. For -the past twenty years ago, the main package for X-ray spectroscopy has been -[XSPEC](https://heasarc.gsfc.nasa.gov/docs/xanadu/xspec/manual/XspecManual.html). -While other options exist (e.g., [Sherpa](https://github.com/sherpa/sherpa)), -all of them have one thing in common: -they provide a convenient, but very rigid user interface. This makes them hard -to modify or extend without having to change a large amount of the underlying -source code, something that few scientists are able or willing to do (especially -since XSPEC is mostly written in C++). However, astronomy is changing, and the -requirements we have for our software are changing, too! The current software -environment makes it extremely difficult to build new models and test new ideas, -and it is very hard to install XSPEC in a shared cluster environment due to a -legacy of complex software dependencies. This is especially important in the -context of [Stingray](https://github.com/StingraySoftware): while we have so -far focused on methods that help us -explore how the brightness of black hole sources changes with time, we would -ideally also want to connect this to how the brightness of black hole sources -changes with energy, and model both at the same time. At the same time, as our -data sets grow, it is becoming increasingly unrealistic that we will be able to -analyse our data on conventional desktop computers. None of the current software -packages allow the user to step outside the few, well-defined commands the user -interface allows, and installing these packages on large computer clusters is -exceptionally difficult. This means that successful completion of this project +X-ray spectroscopy (measuring and understanding how the brightness of a black +hole source varies with wavelength of the light) is one of the most important +ways we learn about the physics of black holes and their companion stars. For +the past twenty years ago, the main package for X-ray spectroscopy has been +[XSPEC](https://heasarc.gsfc.nasa.gov/docs/xanadu/xspec/manual/XspecManual.html). +While other options exist (e.g., [Sherpa](https://github.com/sherpa/sherpa)), +all of them have one thing in common: +they provide a convenient, but very rigid user interface. This makes them hard +to modify or extend without having to change a large amount of the underlying +source code, something that few scientists are able or willing to do (especially +since XSPEC is mostly written in C++). However, astronomy is changing, and the +requirements we have for our software are changing, too! The current software +environment makes it extremely difficult to build new models and test new ideas, +and it is very hard to install XSPEC in a shared cluster environment due to a +legacy of complex software dependencies. This is especially important in the +context of [Stingray](https://github.com/StingraySoftware): while we have so +far focused on methods that help us +explore how the brightness of black hole sources changes with time, we would +ideally also want to connect this to how the brightness of black hole sources +changes with energy, and model both at the same time. At the same time, as our +data sets grow, it is becoming increasingly unrealistic that we will be able to +analyse our data on conventional desktop computers. None of the current software +packages allow the user to step outside the few, well-defined commands the user +interface allows, and installing these packages on large computer clusters is +exceptionally difficult. This means that successful completion of this project would be a big step forward for the entire field of X-ray astrophysics. For a test of this project by one of our Stingray leads, see [(dhuppenkothen/clarsach)](https://github.com/dhuppenkothen/clarsach). #### Deliverables + Deliverables for this project will be: ##### To complete each milestone -+ Working unit tests for each piece of code +- Working unit tests for each piece of code -+ Documentation for each class, method and function implemented +- Documentation for each class, method and function implemented ##### Milestone 1 -+ Python bindings to the XSPEC models and an API for access +- Python bindings to the XSPEC models and an API for access ##### Milestone 2 -+ Installation files for the XSPEC models (fortran/C++) and the Python library +- Installation files for the XSPEC models (fortran/C++) and the Python library ##### Final -+ [Example/tutorial notebooks](https://github.com/StingraySoftware/notebooks) -connecting the models to the -[Stingray modeling API](https://github.com/StingraySoftware/stingray/tree/master/stingray/modeling) -(in progress) +- [Example/tutorial notebooks](https://github.com/StingraySoftware/notebooks) + connecting the models to the + [Stingray modeling API](https://github.com/StingraySoftware/stingray/tree/master/stingray/modeling) + (in progress) diff --git a/_projects/2018/timelab/optimize.md b/src/content/pages/gsoc/2018/timelab/optimize.md similarity index 75% rename from _projects/2018/timelab/optimize.md rename to src/content/pages/gsoc/2018/timelab/optimize.md index a38dfebd..b918f42c 100644 --- a/_projects/2018/timelab/optimize.md +++ b/src/content/pages/gsoc/2018/timelab/optimize.md @@ -2,24 +2,24 @@ name: Optimize Stingray for Large Datasets desc: Optimize tools in the Stingray library for use on large datasets from new X-ray space missions. requirements: -- Familiar with python optimization tools + - Familiar with python optimization tools difficulty: medium issues: -- https://github.com/StingraySoftware/stingray/issues/164 + - https://github.com/StingraySoftware/stingray/issues/164 mentors: - - matteobachetti - - pbalm - - abigailStev + - matteobachetti + - pbalm + - abigailStev initiatives: - - GSOC + - GSOC tags: - - python - - scipy - - numba - - dask - - memmap + - python + - scipy + - numba + - dask + - memmap collaborating_projects: - - timelab + - timelab --- #### Description @@ -34,12 +34,13 @@ practical use cases, make a thorough profiling of the code, single out bottlenecks, and find solutions. #### Deliverables + Deliverables for this project will be profiling and developing solutions for code bottlenecks and other hindrances to using Stingray library tools on large datasets. ##### To complete each milestone -+ Working unit tests for each piece of code +- Working unit tests for each piece of code -+ Documentation for each class, method and function implemented \ No newline at end of file +- Documentation for each class, method and function implemented diff --git a/_projects/2018/timelab/quasiperiodic.md b/src/content/pages/gsoc/2018/timelab/quasiperiodic.md similarity index 61% rename from _projects/2018/timelab/quasiperiodic.md rename to src/content/pages/gsoc/2018/timelab/quasiperiodic.md index bec0a114..7596cca4 100644 --- a/_projects/2018/timelab/quasiperiodic.md +++ b/src/content/pages/gsoc/2018/timelab/quasiperiodic.md @@ -2,64 +2,65 @@ name: Phase-resolved oscillations desc: Implement method to calculate the phase of oscillatory phenomena with non-constant frequency, and calculate phase-resolved spectra. requirements: - - Familiar with numerical analysis + - Familiar with numerical analysis difficulty: medium issues: - - https://github.com/StingraySoftware/stingray/issues/293 + - https://github.com/StingraySoftware/stingray/issues/293 mentors: - - abigailStev - - matteobachetti + - abigailStev + - matteobachetti initiatives: - - GSOC + - GSOC tags: - - python - - scipy - - numba + - python + - scipy + - numba collaborating_projects: - - timelab + - timelab --- #### Description -Quasi-periodic oscillations are the "heart-beat" of black holes and neutron stars: -oscillations with changing phase and frequency, probably due to the complicated motion of matter around these objects. -Besides characterizing how these frequencies evolve in time (accelerate, decelerate, for example, when the luminosity increases), -it is important to understand their exact physical meaning. A few examples in the literature use different approaches -to the problem, and calculate the different spectrum of the light emitted at different phases of these oscillations. -This is highly non-trivial: one cannot follow easily the single "heartbeat", but needs to apply a strong de-noising to -the signal first, and then calculate the average spectrum during the oscillation. +Quasi-periodic oscillations are the "heart-beat" of black holes and neutron stars: +oscillations with changing phase and frequency, probably due to the complicated motion of matter around these objects. +Besides characterizing how these frequencies evolve in time (accelerate, decelerate, for example, when the luminosity increases), +it is important to understand their exact physical meaning. A few examples in the literature use different approaches +to the problem, and calculate the different spectrum of the light emitted at different phases of these oscillations. +This is highly non-trivial: one cannot follow easily the single "heartbeat", but needs to apply a strong de-noising to +the signal first, and then calculate the average spectrum during the oscillation. The reward for this scientific approach can be very high, and people have implemented a few different approaches to the problem, e.g.: -+ [Ingram et al. 2016](http://adsabs.harvard.edu/cgi-bin/nph-data_query?bibcode=2016MNRAS.461.1967I&link_type=EJOURNAL) [open-access preprint](http://adsabs.harvard.edu/cgi-bin/nph-data_query?bibcode=2016MNRAS.461.1967I&link_type=PREPRINT) +- [Ingram et al. 2016](http://adsabs.harvard.edu/cgi-bin/nph-data_query?bibcode=2016MNRAS.461.1967I&link_type=EJOURNAL) [open-access preprint](http://adsabs.harvard.edu/cgi-bin/nph-data_query?bibcode=2016MNRAS.461.1967I&link_type=PREPRINT) -+ [Stevens & Uttley 2016](http://adsabs.harvard.edu/cgi-bin/nph-data_query?bibcode=2016MNRAS.460.2796S&link_type=ARTICLE) [open-access preprint](http://adsabs.harvard.edu/cgi-bin/nph-data_query?bibcode=2016MNRAS.460.2796S&link_type=PREPRINT) +- [Stevens & Uttley 2016](http://adsabs.harvard.edu/cgi-bin/nph-data_query?bibcode=2016MNRAS.460.2796S&link_type=ARTICLE) [open-access preprint](http://adsabs.harvard.edu/cgi-bin/nph-data_query?bibcode=2016MNRAS.460.2796S&link_type=PREPRINT) -In this Project, the student will work with the mentor to implement the full chain of de-noising and +In this Project, the student will work with the mentor to implement the full chain of de-noising and phase-resolved spectroscopy of quasi-periodic oscillations, in such a way that -+ Any user with proper data sets can easily get a result +- Any user with proper data sets can easily get a result -+ If datasets do not allow a solution (e.g., the modulation is not strong enough) warnings have to be sent. +- If datasets do not allow a solution (e.g., the modulation is not strong enough) warnings have to be sent. -+ Both methods can actually be used for pulsars too (it is the trivial case!). +- Both methods can actually be used for pulsars too (it is the trivial case!). #### Deliverables + Deliverables for this project will be ##### To complete each milestone -+ Working unit tests for each piece of code +- Working unit tests for each piece of code -+ Documentation for each class, method and function implemented +- Documentation for each class, method and function implemented ##### Milestone 1 -+ A semi-automated procedure to follow the frequency of oscillations as they vary +- A semi-automated procedure to follow the frequency of oscillations as they vary ##### Milestone 2 -+ The de-noising function that leads to the oscillation average profile ("heartbeat" shape) at different energies +- The de-noising function that leads to the oscillation average profile ("heartbeat" shape) at different energies ##### Final -+ A suite of scripts outlining workflows useful to scientists in practice +- A suite of scripts outlining workflows useful to scientists in practice diff --git a/_projects/2019/astropy/astroquery.md b/src/content/pages/gsoc/2019/astropy/astroquery.md similarity index 81% rename from _projects/2019/astropy/astroquery.md rename to src/content/pages/gsoc/2019/astropy/astroquery.md index 4fc208be..2f0a4231 100644 --- a/_projects/2019/astropy/astroquery.md +++ b/src/content/pages/gsoc/2019/astropy/astroquery.md @@ -2,23 +2,23 @@ name: Add additional archives to astroquery desc: Implement module(s) to access currently unsupported astronomical archives using astroquery. requirements: - - Python - - Basic understanding of web queries and APIs + - Python + - Basic understanding of web queries and APIs difficulty: low issues: - - https://github.com/astropy/astroquery/issues/226 + - https://github.com/astropy/astroquery/issues/226 mentors: - - keflavich - - bsipocz + - keflavich + - bsipocz initiatives: - - GSOC + - GSOC tags: - - python - - astroquery - - astropy + - python + - astroquery + - astropy collaborating_projects: - - astropy - - astroquery + - astropy + - astroquery --- #### Description @@ -31,8 +31,7 @@ A full list of new services that have been suggested by our users [can be found in these issues](https://github.com/astropy/astroquery/issues?q=is%3Aissue+is%3Aopen+label%3A%22New+Service%22), and a summary [in this issue](https://github.com/astropy/astroquery/issues/226). - -A *possible* set of milestones for any particular one of these modules might be: +A _possible_ set of milestones for any particular one of these modules might be: 1. Research the web API for the archive sufficiently to determine what exactly astroquery should expose. 2. Determine the best interface to access the simplest subset of that archive that would be useful. diff --git a/_projects/2019/astropy/astrowidgets.md b/src/content/pages/gsoc/2019/astropy/astrowidgets.md similarity index 70% rename from _projects/2019/astropy/astrowidgets.md rename to src/content/pages/gsoc/2019/astropy/astrowidgets.md index 711681be..ce02adc4 100644 --- a/_projects/2019/astropy/astrowidgets.md +++ b/src/content/pages/gsoc/2019/astropy/astrowidgets.md @@ -2,24 +2,24 @@ name: Jupyter widgets for Astropy desc: Create "astrowidgets" - Jupyter widgets for Astropy. requirements: - - Python - - Very basic knowledge of CSS. - - Basic understanding of javascript. - - Basic knowledge of astronomical images and photometry + - Python + - Very basic knowledge of CSS. + - Basic understanding of javascript. + - Basic knowledge of astronomical images and photometry difficulty: intermediate mentors: - - mwcraig - - astrofrog - - pllim - - eteq + - mwcraig + - astrofrog + - pllim + - eteq initiatives: - - GSOC + - GSOC tags: - - python - - javascript + - python + - javascript collaborating_projects: - - astropy - - astrowidgets + - astropy + - astrowidgets --- #### Description @@ -30,22 +30,22 @@ The final deliverable for the project will be a version of the [astrowidgets](ht Some of the deliverables for this project would be: -+ Development of the remaining unimplemented features in the +- Development of the remaining unimplemented features in the [target API](https://github.com/eteq/nb-astroimage-api) using ginga as the backend. -+ Develop an implementation using [bqplot](https://github.com/bloomberg/bqplot) and +- Develop an implementation using [bqplot](https://github.com/bloomberg/bqplot) and the [ipyastroimage](https://github.com/glue-viz/ipyastroimage) mark for [bqplot](https://github.com/bloomberg/bqplot) as the backend. -+ Explore development of a non-interactive version using matplotlib as the backend. +- Explore development of a non-interactive version using matplotlib as the backend. The non-interactive version would implement as much of the API as possible in a non-interactive format. -+ Develop a method for identifying the nearest point source to a click on an image +- Develop a method for identifying the nearest point source to a click on an image (very preliminary work on this is available) by combining the above with astropy and its affiliated packages (particularly photutils). -+ Documentation for the implemented backends. -+ More extensive test suite. +- Documentation for the implemented backends. +- More extensive test suite. In addition, these Jupyter notebooks will be developed: -+ Sample notebooks demonstrating each of the back ends. +- Sample notebooks demonstrating each of the back ends. Preliminary development of this project is already underway, so some of the specific deliverables might have changed by the beginning of the summer of code. diff --git a/_projects/2019/astropy/n-waymatch.md b/src/content/pages/gsoc/2019/astropy/n-waymatch.md similarity index 86% rename from _projects/2019/astropy/n-waymatch.md rename to src/content/pages/gsoc/2019/astropy/n-waymatch.md index 84f63b2f..162dffff 100644 --- a/_projects/2019/astropy/n-waymatch.md +++ b/src/content/pages/gsoc/2019/astropy/n-waymatch.md @@ -2,21 +2,20 @@ name: Developing an n-way matcher for Astropy desc: Develop an Astropy Table compatible n-way matcher of astronomical catalogues requirements: - - Python + - Python difficulty: medium issues: - - https://groups.google.com/forum/#!topic/astropy-dev/Y8qHC9_I0VI + - https://groups.google.com/forum/#!topic/astropy-dev/Y8qHC9_I0VI mentors: - - manodeep - - parejkoj + - manodeep + - parejkoj initiatives: - - GSOC + - GSOC tags: - - python - - astropy + - python + - astropy collaborating_projects: - - astropy - + - astropy --- #### Description diff --git a/_projects/2019/astropy/stcs_regions.md b/src/content/pages/gsoc/2019/astropy/stcs_regions.md similarity index 77% rename from _projects/2019/astropy/stcs_regions.md rename to src/content/pages/gsoc/2019/astropy/stcs_regions.md index 010f9ec0..44c26c0f 100644 --- a/_projects/2019/astropy/stcs_regions.md +++ b/src/content/pages/gsoc/2019/astropy/stcs_regions.md @@ -3,26 +3,26 @@ name: STC-S regions desc: Implement the STC-S regions standard in astropy/regions # add a short one line description of your project requirements: -# Student requirements: - - Python + # Student requirements: + - Python difficulty: low issues: -# Related issues (if any) to this project. - - https://github.com/astropy/regions/issues/21 + # Related issues (if any) to this project. + - https://github.com/astropy/regions/issues/21 mentors: -# First person in contact; mentors may change before project starts. - - keflavich + # First person in contact; mentors may change before project starts. + - keflavich initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - regions - - astropy + # Different technologies needed + - python + - regions + - astropy collaborating_projects: -# suborganisation(s) to which this project belongs. - - astropy - - regions + # suborganization(s) to which this project belongs. + - astropy + - regions --- #### Description diff --git a/src/content/pages/gsoc/2019/astropy/table-optimize.md b/src/content/pages/gsoc/2019/astropy/table-optimize.md new file mode 100644 index 00000000..e50dac98 --- /dev/null +++ b/src/content/pages/gsoc/2019/astropy/table-optimize.md @@ -0,0 +1,63 @@ +--- +name: Improving astropy Table performance +desc: Improve the speed of common Table operations like slicing +# add a short one line description of your project +requirements: + # Student requirements: + - Familiar with Cython and Python code profiling + - Familiar with Python speed optimization strategies +difficulty: medium +issues: +# Related issues (if any) to this project. +mentors: + # First person in contact; mentors may change before project starts. + - taldcroft + - mhvk +initiatives: + - GSOC +tags: + # Different technologies needed + - python + - Cython +collaborating_projects: + # suborganization(s) to which this project belongs. + - astropy +--- + +Improving astropy Table performance + +#### Description + +The astropy table sub-package defines a core Table class that is +used to store and manipulate tabular data within astropy. This class +was written with an emphasis on functionality, convenience for astronomers, +and code clarity. With the astropy table package now fairly mature +and with a strong set of regression tests in place, it is time to focus +on performance for basic operations like table creation and slicing. +For a simple operation like slicing, astropy Table is currently about +a factor of 10 slower than Pandas. This project will focus on identifying +performance bottlenecks, writing performance tests for astropy-benchmarks, +and then developing code to improve the performance. It is possible that +some fixes will require the use of Cython so previous experience is +desirable though not absolutely required. + +#### Milestones (if any) + +##### GSOC 2019 CODING STARTS + +- Perform developer install of `astropy`. +- Install Python profiling tools. +- Study astropy and the table package capabilities. + +##### GSOC 2019 MIDTERM + +- Install and run `asv`. +- Examine existing `asv` benchmarks and identify areas for improved benchmarking. +- Profile key parts of table code and identify performance bottlenecks. +- Identify strategies for improved speed performance. +- Implement initial performance improvements. + +##### GSOC 2019 FINAL + +- Continue and finalize implementation of performance improvements. +- Contine and finalize additional `asv` benchmark tests. diff --git a/src/content/pages/gsoc/2019/astropy/telescopy.md b/src/content/pages/gsoc/2019/astropy/telescopy.md new file mode 100644 index 00000000..1ad35718 --- /dev/null +++ b/src/content/pages/gsoc/2019/astropy/telescopy.md @@ -0,0 +1,50 @@ +--- +name: telescopy +desc: A generic API for telescope S/N calculations. +requirements: + # Student requirements: + - Observational astronomy +difficulty: medium +mentors: + # First person in contact; mentors may change before project starts. + - bmorris3 + - eteq +initiatives: + - GSOC +tags: + # Different technologies needed + - python +collaborating_projects: + # suborganization(s) to which this project belongs. + - astropy +--- + +Specify some telescope, filter, imager, and target properties, and estimate the photons or counts you’d measure + +#### Description + +The goal of this project is to create a simple API for performing signal-to-noise calculations +for telescopic observations using astropy. Users will specify an input source spectrum (e.g. a blackbody), +properties of the source (e.g. magnitude in one band, or a distance), properties of the telescope +(e.g. aperture, throughput), and properties of the imager (e.g. quantum efficiency, gain) in order to calculate +the expected photon flux and count rate. If time allows, the applicant will also develop a submodule for +signal-to-noise calculations of spectroscopic observations. + +#### Milestones (if any) + +##### GSOC CODING STARTS + +- Get to know the existing API, design strawman API +- Generalize the input spectrum object for objects other than blackbodies +- Work out scaling of magnitudes from one band to another + +##### GSOC MIDTERM + +- Write tests which will validate predictions against real data +- Write documentation which explains how to construct your own S/N calculations + +##### GSOC FINAL + +- Have _passing_ tests which validate the API for real observations +- Handle spectroscopic observations at arbitrary spectral resolution +- Write extensive documentation with examples for widely-used telescopes diff --git a/_projects/2019/ctlearn/3d-reconstruction.md b/src/content/pages/gsoc/2019/ctlearn/3d-reconstruction.md similarity index 69% rename from _projects/2019/ctlearn/3d-reconstruction.md rename to src/content/pages/gsoc/2019/ctlearn/3d-reconstruction.md index 60a8db74..53b9eab9 100644 --- a/_projects/2019/ctlearn/3d-reconstruction.md +++ b/src/content/pages/gsoc/2019/ctlearn/3d-reconstruction.md @@ -3,28 +3,28 @@ name: 3D Reconstruction/Convolutional Neural Networks desc: Implement a pipeline for reconstructing 3D inputs from multiple telescope images and training a 3D CNN on them. # add a short one line description of your project requirements: -# Student requirements: - - Python - - Moderate familiarity with neural networks (specifically 3D CNNs) - - Some familiarity with 3D geometry/linear algebra implementation in Python (optional) + # Student requirements: + - Python + - Moderate familiarity with neural networks (specifically 3D CNNs) + - Some familiarity with 3D geometry/linear algebra implementation in Python (optional) difficulty: hard issues: # Related issues (if any) to this project. mentors: -# First person in contact; mentors may change before project starts. - - aribrill - - bryankim96 - - qi-feng + # First person in contact; mentors may change before project starts. + - aribrill + - bryankim96 + - qi-feng initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - tensorflow - - pyeuclid (optional) + # Different technologies needed + - python + - tensorflow + - pyeuclid (optional) collaborating_projects: -# suborganisation(s) to which this project belongs. - - ctlearn + # suborganization(s) to which this project belongs. + - ctlearn --- #### Description @@ -33,25 +33,25 @@ One of the main goals of CTLearn is developing and implementing methods to perfo When it comes to event reconstruction with convolutional neural networks (CNNs), it likely that in order to improve noticeably on existing reconstruction methods, it will be necessary for CNN-based methods to make full use of this stereo information. The current methods implemented in CTLearn, like the convolutional recurrent neural network (CRNN) model do not take full advantage of this information, as they handle each input image of an event without any explicit reference to the geometrical relationship between all of the images. -The idea behind this project is to implement a pre-processing stage which does a preliminary geometric reconstruction before passing the data to a CNN. A purely geometric method, based on photon back-tracing coupled with information about the telescope positions and pointings, is used to reconstruct a 3D array input representing the shower. In this 3D array, unlike the original images (which is only a projection of the 3D shower onto the camera), locality is preserved, as information about the same part of the shower (in three dimensions) will be combined from all telescopes. Ideally, this should result in the locality and hierarchicality assumptions of CNNs being better satisfied, the CNN being better able to extract and use low-level shower information/features, and a more powerful classifier. - +The idea behind this project is to implement a pre-processing stage which does a preliminary geometric reconstruction before passing the data to a CNN. A purely geometric method, based on photon back-tracing coupled with information about the telescope positions and pointings, is used to reconstruct a 3D array input representing the shower. In this 3D array, unlike the original images (which is only a projection of the 3D shower onto the camera), locality is preserved, as information about the same part of the shower (in three dimensions) will be combined from all telescopes. Ideally, this should result in the locality and hierarchicality assumptions of CNNs being better satisfied, the CNN being better able to extract and use low-level shower information/features, and a more powerful classifier. + #### Milestones ##### GSOC CODING STARTS -* Install CTLearn and DL1 Data Handler and verify that shower images can be loaded and manipulated as numpy arrays. -* Read and understand the 3D geometric reconstruction method laid out in the Event Reconstruction for VERITAS note. -* Make a plan for implementation and a definition for the 3D input structure (how photon tracks will be converted into a voxel volume) +- Install CTLearn and DL1 Data Handler and verify that shower images can be loaded and manipulated as numpy arrays. +- Read and understand the 3D geometric reconstruction method laid out in the Event Reconstruction for VERITAS note. +- Make a plan for implementation and a definition for the 3D input structure (how photon tracks will be converted into a voxel volume) ##### GSOC MIDTERM -* Implement the 3D reconstruction method and present example outputs (w/ visualization so they can be validated). -* Present a design for a minimal 3D convolutional neural network for classification (based on a review of the literature). -* Have all code and documentation in GitHub. +- Implement the 3D reconstruction method and present example outputs (w/ visualization so they can be validated). +- Present a design for a minimal 3D convolutional neural network for classification (based on a review of the literature). +- Have all code and documentation in GitHub. ##### GSOC FINAL -* Preprocess a small dataset using the 3D reconstruction code and write code in TensorFlow to train the 3D model on it (should be based on the existing CTLearn framework and only involve definining a new model + any modifications to data loading code required to load 3D data). -* Further optimize/improve implementation of 3D reconstruction method. -* Prepare a report on method feasibility: training time/speed, dataset size/reduction factors, dataset processing time, GPU memory limitations, preliminary performance/observations about training. -* Have all code, documentation, and final configuration files and plots in GitHub. +- Preprocess a small dataset using the 3D reconstruction code and write code in TensorFlow to train the 3D model on it (should be based on the existing CTLearn framework and only involve definining a new model + any modifications to data loading code required to load 3D data). +- Further optimize/improve implementation of 3D reconstruction method. +- Prepare a report on method feasibility: training time/speed, dataset size/reduction factors, dataset processing time, GPU memory limitations, preliminary performance/observations about training. +- Have all code, documentation, and final configuration files and plots in GitHub. diff --git a/_projects/2019/ctlearn/hexagonal_convolution.md b/src/content/pages/gsoc/2019/ctlearn/hexagonal_convolution.md similarity index 62% rename from _projects/2019/ctlearn/hexagonal_convolution.md rename to src/content/pages/gsoc/2019/ctlearn/hexagonal_convolution.md index 09d368f2..6874fae5 100644 --- a/_projects/2019/ctlearn/hexagonal_convolution.md +++ b/src/content/pages/gsoc/2019/ctlearn/hexagonal_convolution.md @@ -3,28 +3,28 @@ name: Hexagonal convolution desc: Implement hexagonal convolution and pooling methods # add a short one line description of your project requirements: -# Student requirements: -- Python -- Basic familiarity with neural networks + # Student requirements: + - Python + - Basic familiarity with neural networks difficulty: medium issues: -# Related issues (if any) to this project. -- https://github.com/ctlearn-project/ctlearn/issues/88 -- https://github.com/ctlearn-project/ctlearn/issues/56 + # Related issues (if any) to this project. + - https://github.com/ctlearn-project/ctlearn/issues/88 + - https://github.com/ctlearn-project/ctlearn/issues/56 mentors: -# First person in contact; mentors may change before project starts. -- aribrill -- nietootein -- TjarkMiener + # First person in contact; mentors may change before project starts. + - aribrill + - nietootein + - TjarkMiener initiatives: -- GSOC + - GSOC tags: -# Different technologies needed -- python -- tensorflow + # Different technologies needed + - python + - tensorflow collaborating_projects: -# suborganisation(s) to which this project belongs. -- ctlearn + # suborganization(s) to which this project belongs. + - ctlearn --- #### Description @@ -39,18 +39,18 @@ In this project, the student will first study the different packages like [Index ##### GSOC CODING STARTS -* Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. -* Understand the technical and scientific goals of the project. +- Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. +- Understand the technical and scientific goals of the project. ##### GSOC MIDTERM -* Implement hexagonal convolution and pooling methods in CTLearn. -* Test/Train CTLearn default models using the new method. -* Have all code and documentation in GitHub. +- Implement hexagonal convolution and pooling methods in CTLearn. +- Test/Train CTLearn default models using the new method. +- Have all code and documentation in GitHub. ##### GSOC FINAL -* Complete the training and optimize the performance of the neural network for hexagonal convolution. -* Compare performance with previous benchmarks. -* Make/Edit configuration files and plots demonstrating the performance of hexagonal convolution. -* Have all code, documentation, and final configuration files and plots in GitHub. +- Complete the training and optimize the performance of the neural network for hexagonal convolution. +- Compare performance with previous benchmarks. +- Make/Edit configuration files and plots demonstrating the performance of hexagonal convolution. +- Have all code, documentation, and final configuration files and plots in GitHub. diff --git a/_projects/2019/ctlearn/optimization.md b/src/content/pages/gsoc/2019/ctlearn/optimization.md similarity index 61% rename from _projects/2019/ctlearn/optimization.md rename to src/content/pages/gsoc/2019/ctlearn/optimization.md index f8fa60de..cd6501a2 100644 --- a/_projects/2019/ctlearn/optimization.md +++ b/src/content/pages/gsoc/2019/ctlearn/optimization.md @@ -3,27 +3,27 @@ name: Optimization # add a short one line description of your project desc: Implement a framework for model optimization requirements: -# Student requirements: - - Python - - Basic familiarity with neural networks + # Student requirements: + - Python + - Basic familiarity with neural networks difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/ctlearn-project/ctlearn/issues/89 + # Related issues (if any) to this project. + - https://github.com/ctlearn-project/ctlearn/issues/89 mentors: -# First person in contact; mentors may change before project starts. - - nietootein - - bryankim96 - - rlopezcoto + # First person in contact; mentors may change before project starts. + - nietootein + - bryankim96 + - rlopezcoto initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - tensorflow + # Different technologies needed + - python + - tensorflow collaborating_projects: -# suborganisation(s) to which this project belongs. - - ctlearn + # suborganization(s) to which this project belongs. + - ctlearn --- #### Description @@ -39,7 +39,7 @@ distinguishing gamma-ray induced events from cosmic-ray induced events. The better our deep learning models are in telling these two populations apart the better our reach in the gamma-ray Universe will be. Therefore, optimizing our deep learning models has the potential -to make a difference in our view of the Universe at these energies. +to make a difference in our view of the Universe at these energies. In this project, the student will first learn how to use CTLearn to train classification models that tell gamma-ray images from cosmic-ray @@ -54,18 +54,18 @@ currently implemented models. ##### GSOC CODING STARTS -* Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. -* Understand the technical and scientific goals of the project. +- Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. +- Understand the technical and scientific goals of the project. ##### GSOC MIDTERM -* Implement the calculation of useful metrics from a prediction file. -* Implement iterative grid and random searches in (a)the hyperparameter (sub)space. -* Have all code and documentation in GitHub. +- Implement the calculation of useful metrics from a prediction file. +- Implement iterative grid and random searches in (a)the hyperparameter (sub)space. +- Have all code and documentation in GitHub. ##### GSOC FINAL -* Complete coarse iterative grid and random searches for the single_tel model. -* Complete coarse iterative grid and random searches for the cnn_rnn model. -* Implement other optimization searches, e.g., random search, genetic algorithms, Bayesian optimization, etc. (time permitting). -* Have all code, documentation, and plots in GitHub. +- Complete coarse iterative grid and random searches for the single_tel model. +- Complete coarse iterative grid and random searches for the cnn_rnn model. +- Implement other optimization searches, e.g., random search, genetic algorithms, Bayesian optimization, etc. (time permitting). +- Have all code, documentation, and plots in GitHub. diff --git a/_projects/2019/ctlearn/regression.md b/src/content/pages/gsoc/2019/ctlearn/regression.md similarity index 62% rename from _projects/2019/ctlearn/regression.md rename to src/content/pages/gsoc/2019/ctlearn/regression.md index 93dc1330..2a614f33 100644 --- a/_projects/2019/ctlearn/regression.md +++ b/src/content/pages/gsoc/2019/ctlearn/regression.md @@ -3,28 +3,28 @@ name: Regression desc: Implement regression for energy estimation and angular reconstruction # add a short one line description of your project requirements: -# Student requirements: - - Python - - Basic familiarity with neural networks + # Student requirements: + - Python + - Basic familiarity with neural networks difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/ctlearn-project/ctlearn/issues/67 - - https://github.com/ctlearn-project/ctlearn/issues/82 + # Related issues (if any) to this project. + - https://github.com/ctlearn-project/ctlearn/issues/67 + - https://github.com/ctlearn-project/ctlearn/issues/82 mentors: -# First person in contact; mentors may change before project starts. - - aribrill - - bryankim96 - - TjarkMiener + # First person in contact; mentors may change before project starts. + - aribrill + - bryankim96 + - TjarkMiener initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - tensorflow + # Different technologies needed + - python + - tensorflow collaborating_projects: -# suborganisation(s) to which this project belongs. - - ctlearn + # suborganization(s) to which this project belongs. + - ctlearn --- #### Description @@ -39,20 +39,20 @@ In this project, the student will first implement the ability to load continuous ##### GSOC CODING STARTS -* Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. -* Understand the technical and scientific goals of the project. +- Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. +- Understand the technical and scientific goals of the project. ##### GSOC MIDTERM -* Implement loading continuous variables in CTLearn. -* Make a neural network for energy estimation based on the single telescope model in CTLearn and begin training it. -* Have all code and documentation in GitHub. +- Implement loading continuous variables in CTLearn. +- Make a neural network for energy estimation based on the single telescope model in CTLearn and begin training it. +- Have all code and documentation in GitHub. ##### GSOC FINAL -* Complete the training and optimize the performance of the neural network for energy estimation. -* Add the capability for angular reconstruction to the neural network (time permitting). -* Create and train a neural network for energy estimation using multiple images based on the CNN-RNN model in CTLearn (time permitting). -* Make configuration files and plots demonstrating the performance of the neural network(s). -* Evaluating the energy bias and point spread function with the regression network. -* Have all code, documentation, and final configuration files and plots in GitHub. +- Complete the training and optimize the performance of the neural network for energy estimation. +- Add the capability for angular reconstruction to the neural network (time permitting). +- Create and train a neural network for energy estimation using multiple images based on the CNN-RNN model in CTLearn (time permitting). +- Make configuration files and plots demonstrating the performance of the neural network(s). +- Evaluating the energy bias and point spread function with the regression network. +- Have all code, documentation, and final configuration files and plots in GitHub. diff --git a/_projects/2019/ctlearn/rootinput.md b/src/content/pages/gsoc/2019/ctlearn/rootinput.md similarity index 63% rename from _projects/2019/ctlearn/rootinput.md rename to src/content/pages/gsoc/2019/ctlearn/rootinput.md index 730ee90a..be2f2152 100644 --- a/_projects/2019/ctlearn/rootinput.md +++ b/src/content/pages/gsoc/2019/ctlearn/rootinput.md @@ -1,28 +1,28 @@ --- name: ROOT input -desc: Enable input of data in ROOT format from current-generation imaging atmospheric Cherenkov telescopes +desc: Enable input of data in ROOT format from current-generation imaging atmospheric Cherenkov telescopes # add a short one line description of your project requirements: -# Student requirements - - Python - - Basic familiarity with neural networks + # Student requirements + - Python + - Basic familiarity with neural networks difficulty: medium mentors: -# First person in contact; mentors may change before project starts. - - rlopezcoto - - aribrill - - qi-feng + # First person in contact; mentors may change before project starts. + - rlopezcoto + - aribrill + - qi-feng initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - tensorflow - - uproot - - dl1-data-handler + # Different technologies needed + - python + - tensorflow + - uproot + - dl1-data-handler collaborating_projects: -# suborganisation(s) to which this project belongs. - - ctlearn + # suborganization(s) to which this project belongs. + - ctlearn --- #### Description @@ -54,18 +54,18 @@ from current-generation IACTs. ##### GSOC CODING STARTS -* Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. -* Understand the technical and scientific goals of the project. +- Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. +- Understand the technical and scientific goals of the project. ##### GSOC MIDTERM -* Implement input of generic data in ROOT format using the packages uproot and Dl1-data-handler. -* Enable input of data in ROOT format from a specific IACT using the packages uproot and Dl1-data-handler. -* Have all code and documentation in GitHub. +- Implement input of generic data in ROOT format using the packages uproot and Dl1-data-handler. +- Enable input of data in ROOT format from a specific IACT using the packages uproot and Dl1-data-handler. +- Have all code and documentation in GitHub. ##### GSOC FINAL -* Enable input of data in ROOT format from a given collection of IACTs. -* Train single_tel classification model on data from a specific IACT. -* Train cnn_rnn classification model on data from a specific IACT. -* Have all code, documentation, and plots in GitHub. +- Enable input of data in ROOT format from a given collection of IACTs. +- Train single_tel classification model on data from a specific IACT. +- Train cnn_rnn classification model on data from a specific IACT. +- Have all code, documentation, and plots in GitHub. diff --git a/src/content/pages/gsoc/2019/index.md b/src/content/pages/gsoc/2019/index.md new file mode 100644 index 00000000..55dfb44b --- /dev/null +++ b/src/content/pages/gsoc/2019/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2019" +show_main: false +season: 2019 +--- diff --git a/_projects/2019/juliaastro/astroimages.md b/src/content/pages/gsoc/2019/juliaastro/astroimages.md similarity index 65% rename from _projects/2019/juliaastro/astroimages.md rename to src/content/pages/gsoc/2019/juliaastro/astroimages.md index 547404d3..5c2573b0 100644 --- a/_projects/2019/juliaastro/astroimages.md +++ b/src/content/pages/gsoc/2019/juliaastro/astroimages.md @@ -2,29 +2,29 @@ name: Visualization of astronomical images in Julia desc: Expand the capabilities of the AstroImages.jl package requirements: - - Familiarity with FITS files - - Julia + - Familiarity with FITS files + - Julia difficulty: medium issues: - - https://github.com/JuliaAstro/AstroImages.jl/issues/1 - - https://github.com/JuliaAstro/AstroImages.jl/issues/2 - - https://github.com/JuliaAstro/FITSIO.jl/issues/90 + - https://github.com/JuliaAstro/AstroImages.jl/issues/1 + - https://github.com/JuliaAstro/AstroImages.jl/issues/2 + - https://github.com/JuliaAstro/FITSIO.jl/issues/90 mentors: - - giordano - - dpshelio + - giordano + - dpshelio initiatives: - - GSOC + - GSOC tags: - - julia + - julia collaborating_projects: - - JuliaAstro + - JuliaAstro --- #### Description [Julia](http://julialang.org/) is a programming language designed for technical computing that combines ease-of-use of dynamical languages, like Python, and -high-performance of statically-compiled languages, like C. Its most notable +high-performance of statically-compiled languages, like C. Its most notable feature is [multiple dispatch](https://en.wikipedia.org/wiki/Multiple_dispatch), which greatly simplifies the definition of complex functions whose behavior depends on the type of the arguments. @@ -37,33 +37,33 @@ calculations, time system conversions, and computation of dust extinction laws. One of the latest packages is [`AstroImages.jl`](https://github.com/JuliaAstro/AstroImages.jl), which will allow researchers to visualize astronomical images coming from [FITS -files](https://en.wikipedia.org/wiki/FITS). This package is now in its infancy +files](https://en.wikipedia.org/wiki/FITS). This package is now in its infancy and has very basic features, the goal of this project is to expand it and make -it more useful. `AstroImages.jl` has not been officially registered yet, thus +it more useful. `AstroImages.jl` has not been officially registered yet, thus you will be able to freely make any breaking change. #### Expected Outcomes -* Design and implement the user interface -* Support visualization of multiple extensions (e.g., three extensions combined +- Design and implement the user interface +- Support visualization of multiple extensions (e.g., three extensions combined with RGB) -* Integrate with WCS info (accessible via +- Integrate with WCS info (accessible via [`WCS.jl`](https://github.com/JuliaAstro/WCS.jl)) -* Integrate with common visualization and plotting frameworks in Julia, like +- Integrate with common visualization and plotting frameworks in Julia, like [`Images.jl`](https://github.com/JuliaImages/Images.jl), [`Plots.jl`](https://github.com/JuliaPlots/Plots.jl), and optionally [`Makie.jl`](https://github.com/JuliaPlots/Makie.jl) -* Ensure smooth integration with Jupyter notebooks (basic integration is already +- Ensure smooth integration with Jupyter notebooks (basic integration is already in place) -* Write documentation and tests +- Write documentation and tests #### Additional resources -* [Presentation of +- [Presentation of `AstroImages.jl`](https://giordano.github.io/blog/2018-03-22-astroimages/) -* [Preparing Red‐Green‐Blue Images from CCD +- [Preparing Red‐Green‐Blue Images from CCD Data](http://dx.doi.org/10.1086/382245) -* [Making plots with world coordinates in +- [Making plots with world coordinates in Astropy](http://docs.astropy.org/en/stable/visualization/wcsaxes/) -* [Image reprojection (resampling) in +- [Image reprojection (resampling) in Python](https://reproject.readthedocs.io/en/stable/) diff --git a/_projects/2019/poliastro/earth-specific-capabilities.md b/src/content/pages/gsoc/2019/poliastro/earth-specific-capabilities.md similarity index 54% rename from _projects/2019/poliastro/earth-specific-capabilities.md rename to src/content/pages/gsoc/2019/poliastro/earth-specific-capabilities.md index 5c4ff1e3..936ca3d0 100644 --- a/_projects/2019/poliastro/earth-specific-capabilities.md +++ b/src/content/pages/gsoc/2019/poliastro/earth-specific-capabilities.md @@ -2,18 +2,18 @@ name: Earth-specific capabilities desc: Add more Earth-specific capabilities to poliastro to make it more attractive for non-interplanetary use cases requirements: - - Basic notions of orbital mechanics + - Basic notions of orbital mechanics difficulty: easy mentors: - - astrojuanlu - - AunSiro + - astrojuanlu + - AunSiro initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: - - python + - python collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -23,21 +23,21 @@ of which are only present in commercial-off-the-shelf alternatives, such as predefined low-thrust guidance laws, flybys analysis, and more. In fact, the scope of poliastro explicitly mentions interplanetary applications, and we started there because -* It is fun -* There were scripts here and there, but some of them didn't work well for attractors other than the Earth -* We were too lazy to learn SPICE +- It is fun +- There were scripts here and there, but some of them didn't work well for attractors other than the Earth +- We were too lazy to learn SPICE However, most potential poliastro users (including commercial companies) are interested in Earth-bound trajectory analysis. This includes: -* Launch windows and orbit injection -* Station-keeping and orbit correction maneuvers -* Precise propagation using high-order gravitational and atmospheric models -* Two-Line Element (TLE) usage -* Orbit determination -* Observation scheduling -* Groundtrack plotting -* And more! +- Launch windows and orbit injection +- Station-keeping and orbit correction maneuvers +- Precise propagation using high-order gravitational and atmospheric models +- Two-Line Element (TLE) usage +- Orbit determination +- Observation scheduling +- Groundtrack plotting +- And more! The goal of the project is open-ended and involves improving poliastro for some or all of the above use cases. @@ -45,29 +45,27 @@ The goal of the project is open-ended and involves improving poliastro for some ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment +- Have set up a development environment ##### 1st evaluation -* TBD -* Have all code, tests and documentation in GitHub +- TBD +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* TBD -* Have all code, tests and documentation in GitHub +- TBD +- Have all code, tests and documentation in GitHub ##### Final -* TBD -* Have all code, tests and documentation in GitHub +- TBD +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Give a talk about the work at some Python event - - +- Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Give a talk about the work at some Python event diff --git a/_projects/2019/poliastro/export-czml.md b/src/content/pages/gsoc/2019/poliastro/export-czml.md similarity index 56% rename from _projects/2019/poliastro/export-czml.md rename to src/content/pages/gsoc/2019/poliastro/export-czml.md index 6c2a922f..b209dbd2 100644 --- a/_projects/2019/poliastro/export-czml.md +++ b/src/content/pages/gsoc/2019/poliastro/export-czml.md @@ -2,22 +2,22 @@ name: Export to CZML desc: Implement export of Orbit objects to CZML to visualize in Cesium.js requirements: - - Familiar with the JSON format - - Basic experience with JavaScript or TypeScript + - Familiar with the JSON format + - Basic experience with JavaScript or TypeScript difficulty: medium issues: - - https://github.com/poliastro/poliastro/issues/117 - - https://github.com/poliastro/poliastro/issues/287 + - https://github.com/poliastro/poliastro/issues/117 + - https://github.com/poliastro/poliastro/issues/287 mentors: - - astrojuanlu - - AunSiro + - astrojuanlu + - AunSiro initiatives: - - GSOC + - GSOC tags: - - python - - javascript + - python + - javascript collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -38,33 +38,33 @@ understand our output. ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and get familiar with the Cesium +- Have set up a development environment and get familiar with the Cesium Sandcastle (see "Additional resources") ##### 1st evaluation -* Have basic export for an orbit around the Earth -* Have all code, tests and documentation in GitHub +- Have basic export for an orbit around the Earth +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* Have complex export that includes attractors and target bodies, if any -* Have all code, tests and documentation in GitHub +- Have complex export that includes attractors and target bodies, if any +- Have all code, tests and documentation in GitHub ##### Final -* Have created a Cesium application that understand the necessary metadata -* Have all code, tests and documentation in GitHub +- Have created a Cesium application that understand the necessary metadata +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Give a talk about the work at some Python event +- Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Give a talk about the work at some Python event #### Additional resources -* [Cesium Sandcastle](https://cesiumjs.org/Cesium/Build/Apps/Sandcastle/index.html?src=CZML.html&label=DataSources) -* [Sample data](https://github.com/AnalyticalGraphicsInc/cesium/blob/master/Apps/SampleData/simple.czml) +- [Cesium Sandcastle](https://cesiumjs.org/Cesium/Build/Apps/Sandcastle/index.html?src=CZML.html&label=DataSources) +- [Sample data](https://github.com/AnalyticalGraphicsInc/cesium/blob/master/Apps/SampleData/simple.czml) diff --git a/_projects/2019/poliastro/poliastro-as-a-service.md b/src/content/pages/gsoc/2019/poliastro/poliastro-as-a-service.md similarity index 61% rename from _projects/2019/poliastro/poliastro-as-a-service.md rename to src/content/pages/gsoc/2019/poliastro/poliastro-as-a-service.md index 874ce5d6..0dd09204 100644 --- a/_projects/2019/poliastro/poliastro-as-a-service.md +++ b/src/content/pages/gsoc/2019/poliastro/poliastro-as-a-service.md @@ -2,24 +2,24 @@ name: poliastro-as-a-Service desc: Deploy poliastro in one or more serverless cloud providers requirements: - - Basic experience with cloud, serverless - - Basic experience with Docker + - Basic experience with cloud, serverless + - Basic experience with Docker difficulty: medium issues: - - https://github.com/poliastro/poliastro/issues/168 - - https://github.com/poliastro/poliastro/issues/444 + - https://github.com/poliastro/poliastro/issues/168 + - https://github.com/poliastro/poliastro/issues/444 mentors: - - astrojuanlu - - AunSiro + - astrojuanlu + - AunSiro initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: - - python - - javascript - - docker + - python + - javascript + - docker collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -43,30 +43,29 @@ and if time permits create a demo REST API. ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and get familiar with poliastro dependencies and usage of external data +- Have set up a development environment and get familiar with poliastro dependencies and usage of external data ##### 1st evaluation -* Identified poliastro heaviest dependencies (probably SciPy) and implemented proper alternatives, warnings and error messages when they are not installed -* Have all code, tests and documentation in GitHub +- Identified poliastro heaviest dependencies (probably SciPy) and implemented proper alternatives, warnings and error messages when they are not installed +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* Created a Dockerfile for poliastro -* Deployed poliastro in Amazon Web Services Lambda -* Have all code, tests and documentation in GitHub +- Created a Dockerfile for poliastro +- Deployed poliastro in Amazon Web Services Lambda +- Have all code, tests and documentation in GitHub ##### Final -* Deployed poliastro in a second cloud or PaaS -* Created a demo REST API covering some basic functionality -* Have all code, tests and documentation in GitHub +- Deployed poliastro in a second cloud or PaaS +- Created a demo REST API covering some basic functionality +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Give a talk about the work at some Python event - +- Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Give a talk about the work at some Python event diff --git a/_projects/2019/poliastro/validation-framework.md b/src/content/pages/gsoc/2019/poliastro/validation-framework.md similarity index 54% rename from _projects/2019/poliastro/validation-framework.md rename to src/content/pages/gsoc/2019/poliastro/validation-framework.md index 31375fa3..67abd9e1 100644 --- a/_projects/2019/poliastro/validation-framework.md +++ b/src/content/pages/gsoc/2019/poliastro/validation-framework.md @@ -2,21 +2,21 @@ name: Validation framework desc: Create a validation framework that compares poliastro with other similar software requirements: - - Experience automating processes with Python - - Basic notions of numerical analysis + - Experience automating processes with Python + - Basic notions of numerical analysis difficulty: medium issues: - - https://github.com/poliastro/poliastro/issues/109 + - https://github.com/poliastro/poliastro/issues/109 mentors: - - astrojuanlu - - AunSiro + - astrojuanlu + - AunSiro initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: - - python + - python collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -26,8 +26,8 @@ _Validation is hard._ The current approach in poliastro is to add unit tests tha However, poliastro is now a mature project and validating against textbook examples is not enough anymore, for several reasons: -* It is being used more and more in companies and professional settings, which cannot afford failure -* It has grown in feature set and can do more complicated things, which are out of the scope of undergraduate textbooks +- It is being used more and more in companies and professional settings, which cannot afford failure +- It has grown in feature set and can do more complicated things, which are out of the scope of undergraduate textbooks One example of this is the tests covering perturbations and low-thrust guidance laws (see [last year results](https://blog.poliastro.space/2018/08/05/2018-08-05-google-summer-of-code-2018/) @@ -44,40 +44,39 @@ much further than that. ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and get familiar with either SPICE, GMAT, STK, or all of them +- Have set up a development environment and get familiar with either SPICE, GMAT, STK, or all of them ##### 1st evaluation -* Have settled on one of the tools for reference frame validation -* Have a basic understanding of reference frames -* Have converted the `Body` rotational elements to proper reference frames -* Have all code, tests and documentation in GitHub +- Have settled on one of the tools for reference frame validation +- Have a basic understanding of reference frames +- Have converted the `Body` rotational elements to proper reference frames +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* Have produced a table similar to [astropy's](http://www.astropy.org/coordinates-benchmark/summary.html) for our planetary reference frames -* Have all code, tests and documentation in GitHub +- Have produced a table similar to [astropy's](http://www.astropy.org/coordinates-benchmark/summary.html) for our planetary reference frames +- Have all code, tests and documentation in GitHub ##### Final -* Have used a second method to validate the reference frames -* Have started a conversation in Astropy to integrate our code upstream -* Have all code, tests and documentation in GitHub +- Have used a second method to validate the reference frames +- Have started a conversation in Astropy to integrate our code upstream +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Maintain [poliastro benchmarks](https://blog.poliastro.space/poliastro-benchmarks/) -* Give a talk about the work at some Python event +- Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Maintain [poliastro benchmarks](https://blog.poliastro.space/poliastro-benchmarks/) +- Give a talk about the work at some Python event #### Additional resources -* [Wiki page on Validation](https://github.com/poliastro/poliastro/wiki/Validation) -* [SpiceyPy](http://spiceypy.readthedocs.io/) (Python wrappers for SPICE) -* [GMAT](http://www.gmatcentral.org/) -* [STK](https://agi.com/products/engineering-tools) -* [Discussion about ecliptic reference frames in Astropy](https://github.com/astropy/astropy/pull/6508) - +- [Wiki page on Validation](https://github.com/poliastro/poliastro/wiki/Validation) +- [SpiceyPy](http://spiceypy.readthedocs.io/) (Python wrappers for SPICE) +- [GMAT](http://www.gmatcentral.org/) +- [STK](https://agi.com/products/engineering-tools) +- [Discussion about ecliptic reference frames in Astropy](https://github.com/astropy/astropy/pull/6508) diff --git a/src/content/pages/gsoc/2019/sunpy/featuresevents.md b/src/content/pages/gsoc/2019/sunpy/featuresevents.md new file mode 100644 index 00000000..a61dfbb5 --- /dev/null +++ b/src/content/pages/gsoc/2019/sunpy/featuresevents.md @@ -0,0 +1,74 @@ +--- +name: Feature and Event Objects in SunPy +desc: Implements a feature/event object in SunPy. +requirements: + - Familiar with methods for creating classes, objects and subclasses. +difficulty: medium +issues: + - https://github.com/sunpy/sunpy/pull/2759 + - https://github.com/sunpy/sunpy/issues/1792 + - https://github.com/sunpy/sunpy/issues/1398 + - https://github.com/sunpy/sunpy/issues/164 +mentors: + - wafels + - Cadair + - dpshelio +initiatives: + - GSOC +tags: + - Python +collaborating_projects: + - SunPy +--- + +#### Description + +The Sun displays many different features and events (FEs). These are +detected and described either automatically by algorithm, or by visual +inspection by human, or by a combination of both. There are many +different repositories of these FEs online. SunPy provides access to +two large FE repositories, the Heliophysics Event Knowledgebase (HEK) and +the Helio Event Catalogue (HEC). + +The aim of this project is to create a SunPy object that normalizes +input from both the HEK and HEC and creates a SunPy FE object. The +SunPy FE object should take advantage of existing SunPy capabilities +such as SunPy spatial co-ordinates and SunPy time. This will make FE +data much more useful to SunPy users. + +The SunPy FE object should interact intuitively with existing SunPy +objects such as the SunPy maps and timeseries. For example, it should +be simple for a FE with a spatial extent property to be overplotted +on SunPy map; similarly, it should be simple for a FE with a temporal +duration to be overplotted on a SunPy timeseries. + +#### Milestones + +##### Coding Starts + +- Engaged with the community and understand the motivation and + challenges of the project. + +##### Evaluation 1 + +- Have understood what a FE is in the context of solar physics + research and why their interaction with existing SunPy objects is + important. +- Have evaluated and chosen an approach to the design of a SunPy FE + object. +- Have implemented a basic SunPy FE object. + +##### Evaluation 2 + +- Have worked with your mentors and the community to design a simple + and functional API. +- Have a working prototype of the SunPy FE object that normalizes + input from both the HEK and HEC. +- Have tests for the working prototype. + +##### Final + +- Have finished implementation, testing and documentation. +- Have written examples for the gallery of how to use the functionality. +- Have written developer documentation. +- Have the Pull Request merged after review and feedback. diff --git a/_projects/2019/sunpy/helioviewer.md b/src/content/pages/gsoc/2019/sunpy/helioviewer.md similarity index 58% rename from _projects/2019/sunpy/helioviewer.md rename to src/content/pages/gsoc/2019/sunpy/helioviewer.md index 53ae2828..733338c8 100644 --- a/_projects/2019/sunpy/helioviewer.md +++ b/src/content/pages/gsoc/2019/sunpy/helioviewer.md @@ -2,23 +2,23 @@ name: HelioViewer Python API Wrapper desc: Creating a full Python wrapper for the Unirest Helioviewer API requirements: - - Familiarity with Python - - Some familiarity with Unirest/HTTP requests (ideally) + - Familiarity with Python + - Some familiarity with Unirest/HTTP requests (ideally) difficulty: medium issues: - - https://github.com/sunpy/sunpy/issues/2860 - - https://github.com/sunpy/sunpy/issues/2762 - - https://github.com/sunpy/sunpy/issues/2878 + - https://github.com/sunpy/sunpy/issues/2860 + - https://github.com/sunpy/sunpy/issues/2762 + - https://github.com/sunpy/sunpy/issues/2878 mentors: - - wafels - - Cadair - - Helioviewer-Kirill + - wafels + - Cadair + - Helioviewer-Kirill initiatives: - - GSOC + - GSOC tags: - - python + - python collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -26,7 +26,7 @@ collaborating_projects: This project aims to design and implement a low level Python wrapper around the unirest API provided by the HelioViewer Project. This would create a new affiliated SunPy package (name up for suggestions). Currently SunPy has a `HelioviewerClient` that implements only a handful of the available API. -They are `getClosestImage`, `getJP2Image`, `getJP2Header (in an open pull request as of writing)` and `takeScreenshot` from the Helioviewer API and you can see our code [here.](https://github.com/sunpy/sunpy/blob/master/sunpy/net/helioviewer.py) +They are `getClosestImage`, `getJP2Image`, `getJP2Header (in an open pull request as of writing)` and `takeScreenshot` from the Helioviewer API and you can see our code in [the current SunPy client implementation](https://github.com/sunpy/sunpy/blob/master/sunpy/net/helioviewer.py). What we want to do is to create a new Python package that will lightly wrap every aspect of the HelioViewer API allowing anyone to create their own helioviewer.org like GUI in Python (this could be part of the project but will depend on the progress). To facilitate this, we will need to remove the current code from SunPy and move it to the new affiliated package. @@ -34,25 +34,25 @@ What we want to do is to create a new Python package that will lightly wrap ever ##### Coding starts -* Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment. -* Helped to setup the new package. +- Engaged with the community and understand the motivation and challenges of the project. +- Have set up a development environment. +- Helped to setup the new package. ##### To be completed by the Phase 1 Evaluation Deadline -* Have 33% of the API wrapped. -* Have all code, tests and documentation in GitHub. +- Have 33% of the API wrapped. +- Have all code, tests and documentation in GitHub. ##### To be completed by the Phase 2 Evaluation Deadline -* Have 66% of the API wrapped. -* Have all code, tests and documentation in GitHub. +- Have 66% of the API wrapped. +- Have all code, tests and documentation in GitHub. ##### To be completed by the end of GSoC -* All of the API is wrapped within the package. -* Have all code, tests and documentation in GitHub. +- All of the API is wrapped within the package. +- Have all code, tests and documentation in GitHub. ##### Additional Aims (time permitting) -* Start on a GUI-like interface for the new package, if time permits. +- Start on a GUI-like interface for the new package, if time permits. diff --git a/_projects/2019/sunpy/irispy_response.md b/src/content/pages/gsoc/2019/sunpy/irispy_response.md similarity index 59% rename from _projects/2019/sunpy/irispy_response.md rename to src/content/pages/gsoc/2019/sunpy/irispy_response.md index 64d25ccc..805c5482 100644 --- a/_projects/2019/sunpy/irispy_response.md +++ b/src/content/pages/gsoc/2019/sunpy/irispy_response.md @@ -3,25 +3,25 @@ name: Add Time-dependent Instrument Response Function to IRISpy desc: Enable IRISpy users to derive the relationship between instrument and physical intensity unitsbased in the time at which observations were taken. # add a short one line description of your project requirements: -# Student requirements: - - Python + # Student requirements: + - Python difficulty: beginner issues: -# Related issues (if any) to this project. - - https://github.com/sunpy/irispy/issues/27 - - https://github.com/sunpy/irispy/pull/102 + # Related issues (if any) to this project. + - https://github.com/sunpy/irispy/issues/27 + - https://github.com/sunpy/irispy/pull/102 mentors: -# First person in contact; mentors may change before project starts. - - DanRyanIrish - - asainz-solarphysics + # First person in contact; mentors may change before project starts. + - DanRyanIrish + - asainz-solarphysics initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python + # Different technologies needed + - python collaborating_projects: -# suborganisation(s) to which this project belongs. - - SunPy + # suborganization(s) to which this project belongs. + - SunPy --- #### Description @@ -30,31 +30,31 @@ The Interface Region Imaging Spectrograph (IRIS) is a NASA Small Explorer satell to make spectroscopic and imaging observations of the solar chromosphere and transition region. An important tool in interpreting these observations is the instrument response function which expresses the relationship between the physical intensity of light entering the instrument and -the data number (DN) recorded by the CCD detectors. The response function was carefully measured +the data number (DN) recorded by the CCD detectors. The response function was carefully measured by the IRIS team before launch and this is currently available to IRISpy users for their analysis. -However, due to time-dependent factors like degradation, it is known that the response function -evolves with time in orbit. For this reason the IRIS team has developed a fitting algorithm based on -calibration flights that predicts the response function as a function of time. A direct translation +However, due to time-dependent factors like degradation, it is known that the response function +evolves with time in orbit. For this reason the IRIS team has developed a fitting algorithm based on +calibration flights that predicts the response function as a function of time. A direct translation of this algorithm from its original language, IDL (Interactive Data Langauage), into Python has already been performed but requires more work before it can be merged into IRISpy. In this project, the following tasks must be performed: -* The time-dependent instrument function response code must be rewritten to be more efficient and Python-friendly; -* Formal benchmarking between the results it produces and those found using the original IDL code must be performed; -* Tests for the Python version must be written; -* This software must be incoporated into methods and functions in IRISpy that depend on the instrument response function. + +- The time-dependent instrument function response code must be rewritten to be more efficient and Python-friendly; +- Formal benchmarking between the results it produces and those found using the original IDL code must be performed; +- Tests for the Python version must be written; +- This software must be incoporated into methods and functions in IRISpy that depend on the instrument response function. These new feaures will give scientists far greater power and abilty to perform IRIS data analysis in Python and make new discoveries regarding the energetics and dynamics of the solar chromosphere and transition region. #### Expected Outcomes -* A function for deriving the time-dependent IRIS reponse function. -* Benchmarking and unit tests so this new software can be reliably maintained. -* Updated intensity conversion methods between intrument and physical units that correct for -the time observations were taken. - +- A function for deriving the time-dependent IRIS reponse function. +- Benchmarking and unit tests so this new software can be reliably maintained. +- Updated intensity conversion methods between intrument and physical units that correct for + the time observations were taken. #### Milestones (if any) diff --git a/_projects/2019/sunpy/mag_field.md b/src/content/pages/gsoc/2019/sunpy/mag_field.md similarity index 67% rename from _projects/2019/sunpy/mag_field.md rename to src/content/pages/gsoc/2019/sunpy/mag_field.md index b8f6eb0a..8d696310 100644 --- a/_projects/2019/sunpy/mag_field.md +++ b/src/content/pages/gsoc/2019/sunpy/mag_field.md @@ -2,25 +2,25 @@ name: Expand the scope of solarbextrapolation. desc: Add more numerical models and generalize magnetic field extrapolation to spherical coordinates. requirements: - - Knowledge of vector calculus and differential equations - - Familiar with numerical methods - - Some familiarity with electromagnetism, MHD, potential/force-free magnetic fields (optional) + - Knowledge of vector calculus and differential equations + - Familiar with numerical methods + - Some familiarity with electromagnetism, MHD, potential/force-free magnetic fields (optional) difficulty: intermediate issues: - - https://groups.google.com/forum/#!topic/sunpy/ZLu_HoX_lbc - - https://github.com/sunpy/solarbextrapolation/issues/12 + - https://groups.google.com/forum/#!topic/sunpy/ZLu_HoX_lbc + - https://github.com/sunpy/solarbextrapolation/issues/12 mentors: - - Alex-Ian-Hamilton - - Cadair + - Alex-Ian-Hamilton + - Cadair initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: - - python - - cython - - numpy + - python + - cython + - numpy collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -41,28 +41,28 @@ Though this idea is for SOCIS, [same GSOC rules apply](https://github.com/sunpy/ ##### Coding starts -* Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment. -* Some understanding of what `solarbextrapolation` does and how. +- Engaged with the community and understand the motivation and challenges of the project. +- Have set up a development environment. +- Some understanding of what `solarbextrapolation` does and how. ##### To be completed by the Phase 1 Evaluation Deadline -* Add PFSS modelling to the package. -* Have all code, tests and documentation in GitHub. +- Add PFSS modelling to the package. +- Have all code, tests and documentation in GitHub. ##### To be completed by the Phase 2 Evaluation Deadline -* Develop a coordinate-aware 3D Map class -* Have all code, tests and documentation in GitHub. +- Develop a coordinate-aware 3D Map class +- Have all code, tests and documentation in GitHub. ##### To be completed by the end of GSoC -* Use 3D Map class for global field extrapolations -* Have all code, tests and documentation in GitHub. -* Improvements to the documentation and examples +- Use 3D Map class for global field extrapolations +- Have all code, tests and documentation in GitHub. +- Improvements to the documentation and examples ##### Additional Aims (time permitting) -* Performance improvements -* Better visualization methods -* Addition of more advanced extrapolators, e.g. non-linear force-free field +- Performance improvements +- Better visualization methods +- Addition of more advanced extrapolators, e.g. non-linear force-free field diff --git a/_projects/2019/sunpy/ndcube_ape14.md b/src/content/pages/gsoc/2019/sunpy/ndcube_ape14.md similarity index 56% rename from _projects/2019/sunpy/ndcube_ape14.md rename to src/content/pages/gsoc/2019/sunpy/ndcube_ape14.md index 499ca658..5e36ed6d 100644 --- a/_projects/2019/sunpy/ndcube_ape14.md +++ b/src/content/pages/gsoc/2019/sunpy/ndcube_ape14.md @@ -3,31 +3,31 @@ name: Incorporate Powerful New WCS API into ndcube desc: Incorporating the AstroPy APE 14 API into ndcube. # add a short one line description of your project requirements: -# Student requirements: - - Python + # Student requirements: + - Python difficulty: intermediate issues: -# Related issues (if any) to this project. - - https://github.com/sunpy/ndcube/projects/1 - - https://zenodo.org/record/1188875#.XBE3S1JRcWo + # Related issues (if any) to this project. + - https://github.com/sunpy/ndcube/projects/1 + - https://zenodo.org/record/1188875#.XBE3S1JRcWo mentors: -# First person in contact; mentors may change before project starts. - - DanRyanIrish - - Cadair + # First person in contact; mentors may change before project starts. + - DanRyanIrish + - Cadair initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python + # Different technologies needed + - python collaborating_projects: -# suborganisation(s) to which this project belongs. - - SunPy + # suborganization(s) to which this project belongs. + - SunPy --- #### Description ndcube is a SunPy-affiliated package for generalized handling, -manipulating and visualizing N-dimensional astronomical data. The +manipulating and visualizing N-dimensional astronomical data. The translations between the array indices and the real world coordinates is described by the FITS-standard World Coordinate System (FITS-WCS). However, other WCS frameworks exist such as generalized WCS (gWCS) @@ -36,24 +36,23 @@ JWST. In order to support both FITS-WCS and gWCS and hence support more future and current missions, this project aims to convert the ndcube -package to a common WCS API. The new API has already been outlined by +package to a common WCS API. The new API has already been outlined by astropy's [APE 14](https://zenodo.org/record/1188875#.XBE3S1JRcWo). Implementing support for APE 14 will enable ndcube to use FITS-WCS and gWCS agnostically -and hence increase the power and scope of the ndcube package. With +and hence increase the power and scope of the ndcube package. With this new feature ndcube will become better placed to serve a wider array of n-dimensional data analysis needs from multiple astronomical communities. #### Expected Outcomes -* Replace usage in NDCube of `.wcs`, `.pixel_to_world` and `.world_to_pixel` -methods with APE 14 API. -* Replace implementation `NDCube.world_axis_physical_types` with that -of APE 14 -* Generalize slicing of the `NDCube.wcs` attribute so that it works -for both FITS-WCS and gWCS. -* Reimplement the ndcube visualization mixins to use APE 14. - +- Replace usage in NDCube of `.wcs`, `.pixel_to_world` and `.world_to_pixel` + methods with APE 14 API. +- Replace implementation `NDCube.world_axis_physical_types` with that + of APE 14 +- Generalize slicing of the `NDCube.wcs` attribute so that it works + for both FITS-WCS and gWCS. +- Reimplement the ndcube visualization mixins to use APE 14. #### Milestones (if any) diff --git a/_projects/2019/sunpy/remote_data.md b/src/content/pages/gsoc/2019/sunpy/remote_data.md similarity index 62% rename from _projects/2019/sunpy/remote_data.md rename to src/content/pages/gsoc/2019/sunpy/remote_data.md index 92fea3cb..878f8b6c 100644 --- a/_projects/2019/sunpy/remote_data.md +++ b/src/content/pages/gsoc/2019/sunpy/remote_data.md @@ -2,21 +2,21 @@ name: Remote Data in SunPy desc: Implement support for versioned, validated remote data handling in SunPy. requirements: - - Familiar with HTTP client libraries. - - Familiar with checksumming and caches. + - Familiar with HTTP client libraries. + - Familiar with checksumming and caches. difficulty: low issues: - - https://github.com/sunpy/sunpy/issues/1939 - - https://github.com/sunpy/sunpy/issues/1897 + - https://github.com/sunpy/sunpy/issues/1939 + - https://github.com/sunpy/sunpy/issues/1897 mentors: - - Cadair - - dpshelio + - Cadair + - dpshelio initiatives: - - GSOC + - GSOC tags: - - Python + - Python collaborating_projects: - - SunPy + - SunPy --- #### Description @@ -39,22 +39,22 @@ See [issue #1939](https://github.com/sunpy/sunpy/issues/1939) for more details. ##### Coding Starts -* Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment. +- Engaged with the community and understand the motivation and challenges of the project. +- Have set up a development environment. ##### To be completed by the Phase 1 Evaluation Deadline -* Have evaluated and chosen the best approach for storing a local cache of data. -* Have implemented a basic cache and download system, including tests and documentation. +- Have evaluated and chosen the best approach for storing a local cache of data. +- Have implemented a basic cache and download system, including tests and documentation. ##### To be completed by the Phase 2 Evaluation Deadline -* Have worked with your mentors and the community to design a simple and functional API. -* Have a working prototype of this API, including tests. +- Have worked with your mentors and the community to design a simple and functional API. +- Have a working prototype of this API, including tests. ##### To be completed by the end of GSoC -* Have finished implementation, testing and documentation. -* Have written examples for the gallery of how to use the functionality. -* Have written developer documentation. -* Have the Pull Request merged after review and feedback. +- Have finished implementation, testing and documentation. +- Have written examples for the gallery of how to use the functionality. +- Have written developer documentation. +- Have the Pull Request merged after review and feedback. diff --git a/_projects/2019/sunpy/sunkit_image.md b/src/content/pages/gsoc/2019/sunpy/sunkit_image.md similarity index 53% rename from _projects/2019/sunpy/sunkit_image.md rename to src/content/pages/gsoc/2019/sunpy/sunkit_image.md index 2e2cc07d..81da82db 100644 --- a/_projects/2019/sunpy/sunkit_image.md +++ b/src/content/pages/gsoc/2019/sunpy/sunkit_image.md @@ -2,30 +2,30 @@ name: Develop sunkit-image desc: Add features to a new package for solar image analysis. requirements: - - Good understanding of Python. - - Some understanding of mathematics. - - Enthusiasm to learn image processing. + - Good understanding of Python. + - Some understanding of mathematics. + - Enthusiasm to learn image processing. difficulty: medium issues: - - https://github.com/sunpy/sunkit-image/issues/1 - - https://github.com/sunpy/sunkit-image/issues/3 - - https://github.com/sunpy/sunkit-image/issues/5 - - https://github.com/sunpy/sunkit-image/issues/6 - - https://github.com/sunpy/sunkit-image/issues/7 - - https://github.com/sunpy/sunkit-image/issues/9 - - https://github.com/sunpy/sunkit-image/issues/10 - - https://github.com/sunpy/sunkit-image/issues/13 + - https://github.com/sunpy/sunkit-image/issues/1 + - https://github.com/sunpy/sunkit-image/issues/3 + - https://github.com/sunpy/sunkit-image/issues/5 + - https://github.com/sunpy/sunkit-image/issues/6 + - https://github.com/sunpy/sunkit-image/issues/7 + - https://github.com/sunpy/sunkit-image/issues/9 + - https://github.com/sunpy/sunkit-image/issues/10 + - https://github.com/sunpy/sunkit-image/issues/13 mentors: - - nabobalis - - wafels + - nabobalis + - wafels initiatives: - - GSOC + - GSOC tags: - - python - - numpy - - cython + - python + - numpy + - cython collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -45,29 +45,29 @@ This project should achieve most or all of the following goals (roughly in this There are more complex features we would like but will only be looked at once the previous features have been implemented. -5. Refactor and write a Python wrapper for [FLCT](https://arxiv.org/abs/0712.4289) [code](http://solarmuri.ssl.berkeley.edu/overview/publicdownloads/software.html). -6. Implement image alignment using feature detection and tracking. [Example](http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_brief.html) -7. Implement image re-sampling as described [here](https://link.springer.com/content/pdf/10.1023/B:SOLA.0000021743.24248.b0.pdf) through updating [this pull request](https://github.com/astropy/reproject/pull/52) to the Astropy [image resampling](https://reproject.readthedocs.io/en/stable/) repository. +1. Refactor and write a Python wrapper for [FLCT](https://arxiv.org/abs/0712.4289) [code](http://solarmuri.ssl.berkeley.edu/overview/publicdownloads/software.html). +2. Implement image alignment using feature detection and tracking. [Example](http://scikit-image.org/docs/dev/auto_examples/features_detection/plot_brief.html) +3. Implement image re-sampling as described in [this resampling paper](https://link.springer.com/content/pdf/10.1023/B:SOLA.0000021743.24248.b0.pdf) through updating [this pull request](https://github.com/astropy/reproject/pull/52) to the Astropy [image resampling](https://reproject.readthedocs.io/en/stable/) repository. #### Milestones ##### Coding starts -* Have familiarized yourself with the algorithms. -* Have set up a development environment. -* Understand of what is currently in `sunkit-image`. +- Have familiarized yourself with the algorithms. +- Have set up a development environment. +- Understand of what is currently in `sunkit-image`. ##### To be completed by the Phase 1 Evaluation Deadline -* Have implemented, tested and documented the NRGF code. -* Have implemented, tested and documented the MGN code. +- Have implemented, tested and documented the NRGF code. +- Have implemented, tested and documented the MGN code. ##### To be completed by the Phase 2 Evaluation Deadline -* Have successfully merged the NRGF and MGN code. -* Have implemented OCCULT-2. +- Have successfully merged the NRGF and MGN code. +- Have implemented OCCULT-2. ##### To be completed by the end of GSoC -* Have implemented, tested and documented soft morphological filtering code. -* Have tested, documented and merged the OCCULT-2 code. +- Have implemented, tested and documented soft morphological filtering code. +- Have tested, documented and merged the OCCULT-2 code. diff --git a/_projects/2019/sunpy/sunspotter.md b/src/content/pages/gsoc/2019/sunpy/sunspotter.md similarity index 68% rename from _projects/2019/sunpy/sunspotter.md rename to src/content/pages/gsoc/2019/sunpy/sunspotter.md index 6d102c0c..27556af2 100644 --- a/_projects/2019/sunpy/sunspotter.md +++ b/src/content/pages/gsoc/2019/sunpy/sunspotter.md @@ -2,21 +2,21 @@ name: Space Weather forecasting using machine learning desc: Create a model to forecast solar flare events of new solar active regions images. requirements: - - Familiar with methods for creating classes, objects and subclasses. - - Confident with machine learning methods. + - Familiar with methods for creating classes, objects and subclasses. + - Confident with machine learning methods. difficulty: medium issues: mentors: - - dpshelio - - drsophiemurray - - samaloney - - mbobra + - dpshelio + - drsophiemurray + - samaloney + - mbobra initiatives: - - SOCIS + - SOCIS tags: - - Python + - Python collaborating_projects: - - SunPy + - SunPy --- #### Description @@ -45,33 +45,32 @@ Though this idea is for SOCIS, [same GSOC rules apply](https://github.com/sunpy/ ##### 1st Month -* Familiarisation with the dataset. Read and visualise the different type of +- Familiarisation with the dataset. Read and visualise the different type of data (images, classifications, …) -* Have evaluated and chosen an approach to the design of a SunPy search events +- Have evaluated and chosen an approach to the design of a SunPy search events object based on the images using [HEK or HELIO](https://docs.sunpy.org/en/latest/guide/acquiring_data/hek.html). -* Implementation of a basic machine learning model to understand the steps +- Implementation of a basic machine learning model to understand the steps needed for this problem -* Write up notebook for the sunpy gallery that exemplifies an analysis of this +- Write up notebook for the sunpy gallery that exemplifies an analysis of this dataset ##### 2nd Month -* Experiment with different machine learning methods to find the best model. -* Write up as blog posts the different attempts tried. +- Experiment with different machine learning methods to find the best model. +- Write up as blog posts the different attempts tried. ##### 3rd Month -* Check the accuracy of the model with SDO/HMI images from HEK -* Create notebook for the sunpy gallery explaining how to use the model +- Check the accuracy of the model with SDO/HMI images from HEK +- Create notebook for the sunpy gallery explaining how to use the model #### Resources -* [Predicting Coronal Mass Ejections Using Machine Learning Methods]( -https://doi.org/10.3847/0004-637X/821/2/127) -* [Sunspotter: Using Citizen Science to Determine the Complexity of +- [Predicting Coronal Mass Ejections Using Machine Learning Methods](https://doi.org/10.3847/0004-637X/821/2/127) +- [Sunspotter: Using Citizen Science to Determine the Complexity of Sunspots](https://doi.org/10.6084/m9.figshare.1050569.v1) -* [Machine Learning, Statistics, and Data Mining for +- [Machine Learning, Statistics, and Data Mining for Heliophysics](https://helioml.github.io/HelioML/title.html) -* [A Comparison of Flare Forecasting Methods. I. Results from the "All-Clear" +- [A Comparison of Flare Forecasting Methods. I. Results from the "All-Clear" Workshop](https://doi.org/10.3847/0004-637X/829/2/89) diff --git a/_projects/2020/astronomy-commons/spark-jupyter-widget.md b/src/content/pages/gsoc/2020/astronomy-commons/spark-jupyter-widget.md similarity index 67% rename from _projects/2020/astronomy-commons/spark-jupyter-widget.md rename to src/content/pages/gsoc/2020/astronomy-commons/spark-jupyter-widget.md index fb5d8fa5..7d562903 100644 --- a/_projects/2020/astronomy-commons/spark-jupyter-widget.md +++ b/src/content/pages/gsoc/2020/astronomy-commons/spark-jupyter-widget.md @@ -2,22 +2,22 @@ name: Jupyter Widgets for Spark desc: Create Jupyter notebook extensions and lab widgets to interface with Apache Spark clusters requirements: - - Python - - JavaScript + - Python + - JavaScript difficulty: medium mentors: - - stevenstetzler - - mjuric + - stevenstetzler + - mjuric initiatives: - - GSOC + - GSOC tags: - - python - - javascript - - jupyter - - spark - - UI / UX + - python + - javascript + - jupyter + - spark + - UI / UX collaborating_projects: - - astronomy-commons + - astronomy-commons --- #### Description @@ -28,19 +28,19 @@ Within the Astronomy Data Commons group, we use Apache Spark for distributed com ##### GSOC CODING STARTS -* Work with users in the Astronomy Commons community to understand User Interface and User Experience constraints for this project -* Investigate how Jupyter notebooks and the Jupyter lab system work, if required -* Obtain access to local and remote computing resources and development environments as needed +- Work with users in the Astronomy Commons community to understand User Interface and User Experience constraints for this project +- Investigate how Jupyter notebooks and the Jupyter lab system work, if required +- Obtain access to local and remote computing resources and development environments as needed ##### GSOC MIDTERM -* A sketch interface is made of the final product that incorporates feedback from community and guidance from mentors -* Progress has been made toward a working prototype -* The working prototype interface contains several browser element and the layout resembles the final interface -* The working prototype back-end links at least one interaction with a browser element to the Spark API +- A sketch interface is made of the final product that incorporates feedback from community and guidance from mentors +- Progress has been made toward a working prototype +- The working prototype interface contains several browser element and the layout resembles the final interface +- The working prototype back-end links at least one interaction with a browser element to the Spark API ##### GSOC FINAL -* A user is able to launch and connect to a local Spark cluster using just browser interactions -* A user is able to launch and connect to a remote Spark cluster using just browser interactions -* Code is documented and exists on a GitHub repository under the Astronomy Data Commons organization +- A user is able to launch and connect to a local Spark cluster using just browser interactions +- A user is able to launch and connect to a remote Spark cluster using just browser interactions +- Code is documented and exists on a GitHub repository under the Astronomy Data Commons organization diff --git a/_projects/2020/ctlearn/rootinput.md b/src/content/pages/gsoc/2020/ctlearn/rootinput.md similarity index 63% rename from _projects/2020/ctlearn/rootinput.md rename to src/content/pages/gsoc/2020/ctlearn/rootinput.md index 2fcc1f6e..df325333 100644 --- a/_projects/2020/ctlearn/rootinput.md +++ b/src/content/pages/gsoc/2020/ctlearn/rootinput.md @@ -1,28 +1,28 @@ --- name: ROOT input -desc: Enable input of data in ROOT format from current-generation imaging atmospheric Cherenkov telescopes +desc: Enable input of data in ROOT format from current-generation imaging atmospheric Cherenkov telescopes # add a short one line description of your project requirements: -# Student requirements - - Python - - Basic familiarity with neural networks + # Student requirements + - Python + - Basic familiarity with neural networks difficulty: medium mentors: -# First person in contact; mentors may change before project starts. - - nietootein - - TjarkMiener - - aribrill + # First person in contact; mentors may change before project starts. + - nietootein + - TjarkMiener + - aribrill initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - tensorflow - - uproot - - dl1-data-handler + # Different technologies needed + - python + - tensorflow + - uproot + - dl1-data-handler collaborating_projects: -# suborganisation(s) to which this project belongs. - - ctlearn + # suborganization(s) to which this project belongs. + - ctlearn --- #### Description @@ -54,18 +54,18 @@ from current-generation IACTs. ##### GSOC CODING STARTS -* Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. -* Understand the technical and scientific goals of the project. +- Install CTLearn and train a pre-existing benchmark model to verify that it runs correctly. +- Understand the technical and scientific goals of the project. ##### GSOC MIDTERM -* Implement input of generic data in ROOT format using the packages uproot and Dl1-data-handler. -* Enable input of data in ROOT format from a specific IACT using the packages uproot and Dl1-data-handler. -* Have all code and documentation in GitHub. +- Implement input of generic data in ROOT format using the packages uproot and Dl1-data-handler. +- Enable input of data in ROOT format from a specific IACT using the packages uproot and Dl1-data-handler. +- Have all code and documentation in GitHub. ##### GSOC FINAL -* Enable input of data in ROOT format from a given collection of IACTs. -* Train single_tel classification model on data from a specific IACT. -* Train cnn_rnn classification model on data from a specific IACT. -* Have all code, documentation, and plots in GitHub. +- Enable input of data in ROOT format from a given collection of IACTs. +- Train single_tel classification model on data from a specific IACT. +- Train cnn_rnn classification model on data from a specific IACT. +- Have all code, documentation, and plots in GitHub. diff --git a/src/content/pages/gsoc/2020/einsteinpy/Null-geodesics-for-Schwarzschild-and-Kerr-Geometries..md b/src/content/pages/gsoc/2020/einsteinpy/Null-geodesics-for-Schwarzschild-and-Kerr-Geometries..md new file mode 100644 index 00000000..2e9da94f --- /dev/null +++ b/src/content/pages/gsoc/2020/einsteinpy/Null-geodesics-for-Schwarzschild-and-Kerr-Geometries..md @@ -0,0 +1,98 @@ +--- +name: Null geodesics for Schwarzschild and Kerr Geometries +desc: The project aims at adding functionality of ray-tracing to EinsteinPy +# add a short one line description of your project +requirements: + # Student requirements: + - Knowledge on ODEs, basic mathematics + - Some Familiarity with General Relativity, or the will to read about it. + - Basic knowledge of differential geometry +difficulty: medium +issues: + # Related issues (if any) to this project. + - https://github.com/einsteinpy/einsteinpy/issues/105 + - https://github.com/einsteinpy/einsteinpy/issues/106 + - https://github.com/einsteinpy/einsteinpy/issues/275 + - https://github.com/einsteinpy/einsteinpy/issues/144 + - https://github.com/einsteinpy/einsteinpy/issues/145 +mentors: + # First person in contact; mentors may change before project starts. + # GitHub handles + - ritzvik + - OVSofia + - rishi-s8 +initiatives: + - GSOC + - SOCIS +tags: + # Different technologies needed + - python + - C++ +collaborating_projects: + # suborganization(s) to which this project belongs. + - einsteinpy +--- + +#### Description + +Null-geodesics is the path traced by light rays in 4-D space-time. We aim to calculate null geodesics around non-rotating (Schwarzschild) and rotating (Kerr) massive bodies given the initial conditions. + +The project has roughly the following objectives : + +- Calculating null trajectories around a rotating/non-rotating black hole. +- Use those trajectories to raytrace a bundle of photon rays, to visualize how space-time gets distorted in presence of black holes. +- Calculate redshifts in photon rays due to space-time curvature. +- Visualization of Keplerian disc/shell in around it. +- In short, we aim to replicate one of the few papers available with proper coding paradigms like OOPs, good documentation and unit tests. +- If required due to performance issues, python wrappers over native C/C++ have to be written. + +This project also aims at fixing the problem of natural units introduced due to the research papers and books and to give native support to MKS units. + +##### Papers we intend to replicate + +- Odyssey: +- YNOGK: + +##### Links to other relevant papers + +- +- +- + +#### Milestones (if any) + +##### Coding starts + +- Engaged with the community and understand the motivation and challenges of + the project. +- Have set up a development environment and get familiar with einsteinpy dependencies. +- Have read relevant literature/codes required for the project. + +##### 1st evaluation + +- Null geodesic in Kerr space-time +- Null geodesic in Schwarzschild space-time (It can be implemented by creating a class inheriting from Kerr null geodesics and setting a=0. However, it would lead to unnecessary calculation and therefore, seperate Schwarzschild-Null class is necessary.) +- If possible, basic raytracing using the newly created classes. +- Have all code, tests and documentation in GitHub. + +##### 2nd evaluation + +- Plotting class for both Kerr and Schwarzschild null geodesics. +- Improvement in raytracing, along with simulation of a photon sheet around a black hole. +- Calculation of redshifts along the null trajectory. +- Have all code, tests and documentation in GitHub. + +##### Final + +- Good-enough implementation of any of the relavent papers. +- Complete any chores left out during the 1st and 2nd phase. +- Fix the Natural Units Problem in Kerr-Newman time-like geodesics. +- Fix the Natural Units Problem in Hypersurface Module. +- Have all code, tests and documentation in GitHub. + +#### Secondary goals + +- Fix any bugs that might appear regarding visualization, symbolic module and so forth. +- Review pull requests from other einsteinpy contributors, including the mentor. +- Give a talk about the work at some Python event. +- EinsteinPy is nothing without its community. Therefore, getting integrated deeply within the community and oversee future development of EinsteinPy. diff --git a/_projects/2020/einsteinpy/Performance-Improvements-in-EinsteinPy.md b/src/content/pages/gsoc/2020/einsteinpy/Performance-Improvements-in-EinsteinPy.md similarity index 60% rename from _projects/2020/einsteinpy/Performance-Improvements-in-EinsteinPy.md rename to src/content/pages/gsoc/2020/einsteinpy/Performance-Improvements-in-EinsteinPy.md index f8fde1c4..d7f065d4 100644 --- a/_projects/2020/einsteinpy/Performance-Improvements-in-EinsteinPy.md +++ b/src/content/pages/gsoc/2020/einsteinpy/Performance-Improvements-in-EinsteinPy.md @@ -3,35 +3,35 @@ name: Performance Improvements in EinsteinPy desc: The project aims at making EinsteinPy high-performace computation ready. # add a short one line description of your project requirements: -# Student requirements: - - Knowledge on ODEs, basic mathematics - - Familiarity with multithreading, Rust or C++ - - Some experience with CUDA + # Student requirements: + - Knowledge on ODEs, basic mathematics + - Familiarity with multithreading, Rust or C++ + - Some experience with CUDA difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/einsteinpy/einsteinpy/issues/316 - - https://github.com/einsteinpy/einsteinpy/issues/233 - - https://github.com/einsteinpy/einsteinpy/issues/223 - - https://github.com/einsteinpy/einsteinpy/issues/164 + # Related issues (if any) to this project. + - https://github.com/einsteinpy/einsteinpy/issues/316 + - https://github.com/einsteinpy/einsteinpy/issues/233 + - https://github.com/einsteinpy/einsteinpy/issues/223 + - https://github.com/einsteinpy/einsteinpy/issues/164 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - shreyasbapat - - shilpi1958 - - spino17 + # First person in contact; mentors may change before project starts. + # GitHub handles + - shreyasbapat + - shilpi1958 + - spino17 initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: -# Different technologies needed - - python - - CUDA - - Rust - - C++ + # Different technologies needed + - python + - CUDA + - Rust + - C++ collaborating_projects: -# suborganisation(s) to which this project belongs. - - einsteinpy + # suborganization(s) to which this project belongs. + - einsteinpy --- #### Description @@ -42,7 +42,7 @@ There are multiple ways of accelerating the codebase. We would like to slowly tr After profiling is done, we can have two backend type model (like tensorflow). For the low performance codebase too, we will need to replace certain Python snippets with either less complex pyton code snippets (accelerated with numba) wherever possible, or with some sort of compiled fast language (C++ / Rust). -However the GPU backend is not a hard and fast requirement from this project as per the current state of the codebase. The coordinate conversions in EinsteinPy are not the best in the industry right now. We aim to fix the problem of coordinate conversion. This fix can give a significance boost to the computation speed. +However the GPU backend is not a hard and fast requirement from this project as per the current state of the codebase. The coordinate conversions in EinsteinPy are not the best in the industry right now. We aim to fix the problem of coordinate conversion. This fix can give a significance boost to the computation speed. Some modules like, shadow do not scale well. Also there are some theoretical issues which make the whole module slow. We would like to simulate black hole shadows of real sized black holes rather than M=1 Black holes which have no practical significance. @@ -50,34 +50,32 @@ Some modules like, shadow do not scale well. Also there are some theoretical iss ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and get familiar with einsteinpy dependencies. - +- Have set up a development environment and get familiar with einsteinpy dependencies. ##### 1st evaluation -* Have done the profiling of the codebase, found the bottlenecks. -* Fixed the ODE Solver as it is too slow. -* Fixed the coordinate conversions. -* Have all code, tests and documentation in GitHub. +- Have done the profiling of the codebase, found the bottlenecks. +- Fixed the ODE Solver as it is too slow. +- Fixed the coordinate conversions. +- Have all code, tests and documentation in GitHub. ##### 2nd evaluation -* Work on shadow and hypersurface modules, find the reason why they do not scale well (possibly because of the integrator) -* Publish the performance comparisons. -* Have all code, tests and documentation in GitHub. +- Work on shadow and hypersurface modules, find the reason why they do not scale well (possibly because of the integrator) +- Publish the performance comparisons. +- Have all code, tests and documentation in GitHub. ##### Final -* Complete the Rust/C++ backend for the project and publish it on GitHub. -* Complete the coordinate conversion issue and add an easy way to introduce new coordinate systems. -* Have all code, tests and documentation in GitHub. +- Complete the Rust/C++ backend for the project and publish it on GitHub. +- Complete the coordinate conversion issue and add an easy way to introduce new coordinate systems. +- Have all code, tests and documentation in GitHub. #### Secondary goals -* Fix any bugs that might appear regarding visualization, symbolic module and so forth -* Make the code work on GPU too. -* Review pull requests from other einsteinpy contributors, including the mentor -* Give a talk about the work at some Python event. - +- Fix any bugs that might appear regarding visualization, symbolic module and so forth +- Make the code work on GPU too. +- Review pull requests from other einsteinpy contributors, including the mentor +- Give a talk about the work at some Python event. diff --git a/src/content/pages/gsoc/2020/index.md b/src/content/pages/gsoc/2020/index.md new file mode 100644 index 00000000..4427c371 --- /dev/null +++ b/src/content/pages/gsoc/2020/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2020" +show_main: false +season: 2020 +--- diff --git a/_projects/2020/juliaastro/ccd_data_reduction.md b/src/content/pages/gsoc/2020/juliaastro/ccd_data_reduction.md similarity index 71% rename from _projects/2020/juliaastro/ccd_data_reduction.md rename to src/content/pages/gsoc/2020/juliaastro/ccd_data_reduction.md index c2bcf577..55bff7eb 100644 --- a/_projects/2020/juliaastro/ccd_data_reduction.md +++ b/src/content/pages/gsoc/2020/juliaastro/ccd_data_reduction.md @@ -3,29 +3,29 @@ name: CCD Processing Package desc: Develop a CCD data reduction package in Julia # add a short one line description of your project requirements: -# Student requirements: - - Basic knowledge of CCD data - - Familiarity with Julia and Julia packaging + # Student requirements: + - Basic knowledge of CCD data + - Familiarity with Julia and Julia packaging difficulty: low issues: # Related issues (if any) to this project. mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - mileslucas - - giordano - - yashrsharma44 + # First person in contact; mentors may change before project starts. + # GitHub handles + - mileslucas + - giordano + - yashrsharma44 initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - Julia + # Different technologies needed + - Julia collaborating_projects: -# suborganisation(s) to which this project belongs. - - JuliaAstro + # suborganization(s) to which this project belongs. + - JuliaAstro --- -For a good background on astronomical data, check out [this paper](https://arxiv.org/abs/1905.13189). +For a good background on astronomical data, check out [this paper](https://arxiv.org/abs/1905.13189). #### Description diff --git a/_projects/2020/poliastro/earth-specific-capabilities.md b/src/content/pages/gsoc/2020/poliastro/earth-specific-capabilities.md similarity index 54% rename from _projects/2020/poliastro/earth-specific-capabilities.md rename to src/content/pages/gsoc/2020/poliastro/earth-specific-capabilities.md index e213afba..57e29d3b 100644 --- a/_projects/2020/poliastro/earth-specific-capabilities.md +++ b/src/content/pages/gsoc/2020/poliastro/earth-specific-capabilities.md @@ -2,18 +2,18 @@ name: Earth-specific capabilities desc: Add more Earth-specific capabilities to poliastro to make it more attractive for non-interplanetary use cases requirements: - - Basic notions of orbital mechanics + - Basic notions of orbital mechanics difficulty: medium mentors: - - astrojuanlu - - jorgepiloto + - astrojuanlu + - jorgepiloto initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: - - python + - python collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -23,21 +23,21 @@ of which are only present in commercial-off-the-shelf alternatives, such as predefined low-thrust guidance laws, flybys analysis, and more. In fact, the scope of poliastro explicitly mentions interplanetary applications, and we started there because -* It is fun -* There were scripts here and there, but some of them didn't work well for attractors other than the Earth -* We were too lazy to learn SPICE +- It is fun +- There were scripts here and there, but some of them didn't work well for attractors other than the Earth +- We were too lazy to learn SPICE However, most potential poliastro users (including commercial companies) are interested in Earth-bound trajectory analysis. This includes: -* Launch windows and orbit injection -* Station-keeping and orbit correction maneuvers -* Precise propagation using high-order gravitational and atmospheric models -* Two-Line Element (TLE) usage -* Orbit determination -* Observation scheduling -* Groundtrack plotting -* And more! +- Launch windows and orbit injection +- Station-keeping and orbit correction maneuvers +- Precise propagation using high-order gravitational and atmospheric models +- Two-Line Element (TLE) usage +- Orbit determination +- Observation scheduling +- Groundtrack plotting +- And more! The goal of the project is open-ended and involves improving poliastro for some or all of the above use cases. @@ -45,27 +45,27 @@ The goal of the project is open-ended and involves improving poliastro for some ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment +- Have set up a development environment ##### 1st evaluation -* TBD -* Have all code, tests and documentation in GitHub +- TBD +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* TBD -* Have all code, tests and documentation in GitHub +- TBD +- Have all code, tests and documentation in GitHub ##### Final -* TBD -* Have all code, tests and documentation in GitHub +- TBD +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Give a talk about the work at some Python event +- Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Give a talk about the work at some Python event diff --git a/_projects/2020/poliastro/poliastro-as-a-service.md b/src/content/pages/gsoc/2020/poliastro/poliastro-as-a-service.md similarity index 61% rename from _projects/2020/poliastro/poliastro-as-a-service.md rename to src/content/pages/gsoc/2020/poliastro/poliastro-as-a-service.md index 127acd6c..b240abfe 100644 --- a/_projects/2020/poliastro/poliastro-as-a-service.md +++ b/src/content/pages/gsoc/2020/poliastro/poliastro-as-a-service.md @@ -2,24 +2,24 @@ name: poliastro-as-a-Service desc: Deploy poliastro in one or more serverless cloud providers requirements: - - Basic experience with cloud, serverless - - Basic experience with Docker + - Basic experience with cloud, serverless + - Basic experience with Docker difficulty: medium issues: - - https://github.com/poliastro/poliastro/issues/168 - - https://github.com/poliastro/poliastro/issues/444 + - https://github.com/poliastro/poliastro/issues/168 + - https://github.com/poliastro/poliastro/issues/444 mentors: - - astrojuanlu - - jorgepiloto + - astrojuanlu + - jorgepiloto initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: - - python - - javascript - - docker + - python + - javascript + - docker collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -43,29 +43,29 @@ and if time permits create a demo REST API. ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and get familiar with poliastro dependencies and usage of external data +- Have set up a development environment and get familiar with poliastro dependencies and usage of external data ##### 1st evaluation -* Identified poliastro heaviest dependencies (probably SciPy) and implemented proper alternatives, warnings and error messages when they are not installed -* Have all code, tests and documentation in GitHub +- Identified poliastro heaviest dependencies (probably SciPy) and implemented proper alternatives, warnings and error messages when they are not installed +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* Created a Dockerfile for poliastro -* Deployed poliastro in Amazon Web Services Lambda -* Have all code, tests and documentation in GitHub +- Created a Dockerfile for poliastro +- Deployed poliastro in Amazon Web Services Lambda +- Have all code, tests and documentation in GitHub ##### Final -* Deployed poliastro in a second cloud or PaaS -* Created a demo REST API covering some basic functionality -* Have all code, tests and documentation in GitHub +- Deployed poliastro in a second cloud or PaaS +- Created a demo REST API covering some basic functionality +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Give a talk about the work at some Python event +- Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Give a talk about the work at some Python event diff --git a/_projects/2020/poliastro/validation-framework.md b/src/content/pages/gsoc/2020/poliastro/validation-framework.md similarity index 56% rename from _projects/2020/poliastro/validation-framework.md rename to src/content/pages/gsoc/2020/poliastro/validation-framework.md index cb72d850..2e396c9a 100644 --- a/_projects/2020/poliastro/validation-framework.md +++ b/src/content/pages/gsoc/2020/poliastro/validation-framework.md @@ -2,21 +2,21 @@ name: Validation framework desc: Create a validation framework that compares poliastro with other similar software requirements: - - Experience automating processes with Python - - Basic notions of numerical analysis + - Experience automating processes with Python + - Basic notions of numerical analysis difficulty: medium issues: - - https://github.com/poliastro/poliastro/issues/109 + - https://github.com/poliastro/poliastro/issues/109 mentors: - - astrojuanlu - - jorgepiloto + - astrojuanlu + - jorgepiloto initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: - - python + - python collaborating_projects: - - poliastro + - poliastro --- #### Description @@ -26,8 +26,8 @@ _Validation is hard._ The current approach in poliastro is to add unit tests tha However, poliastro is now a mature project and validating against textbook examples is not enough anymore, for several reasons: -* It is being used more and more in companies and professional settings, which cannot afford failure -* It has grown in feature set and can do more complicated things, which are out of the scope of undergraduate textbooks +- It is being used more and more in companies and professional settings, which cannot afford failure +- It has grown in feature set and can do more complicated things, which are out of the scope of undergraduate textbooks One example of this is the tests covering perturbations and low-thrust guidance laws (see [GSOC 2018 results](https://blog.poliastro.space/2018/08/05/2018-08-05-google-summer-of-code-2018/) @@ -46,39 +46,39 @@ with a basic structure and a simple test case, but we want to expand it much fur ##### Coding starts -* Engaged with the community and understand the motivation and challenges of +- Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment and get familiar with either SPICE, GMAT, STK, or all of them +- Have set up a development environment and get familiar with either SPICE, GMAT, STK, or all of them ##### 1st evaluation -* Have settled on one of the tools for reference frame validation -* Have a basic understanding of reference frames -* Have converted the `Body` rotational elements to proper reference frames -* Have all code, tests and documentation in GitHub +- Have settled on one of the tools for reference frame validation +- Have a basic understanding of reference frames +- Have converted the `Body` rotational elements to proper reference frames +- Have all code, tests and documentation in GitHub ##### 2nd evaluation -* Have produced a table similar to [astropy's](http://www.astropy.org/coordinates-benchmark/summary.html) for our planetary reference frames -* Have all code, tests and documentation in GitHub +- Have produced a table similar to [astropy's](http://www.astropy.org/coordinates-benchmark/summary.html) for our planetary reference frames +- Have all code, tests and documentation in GitHub ##### Final -* Have used a second method to validate the reference frames -* Have started a conversation in Astropy to integrate our code upstream -* Have all code, tests and documentation in GitHub +- Have used a second method to validate the reference frames +- Have started a conversation in Astropy to integrate our code upstream +- Have all code, tests and documentation in GitHub #### Secondary goals -* Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth -* Review pull requests from other poliastro contributors, including the mentor -* Maintain [poliastro benchmarks](https://benchmarks.poliastro.space/) -* Give a talk about the work at some Python event +- Fix any bugs that might appear regarding visualization, hyperbolic orbits and so forth +- Review pull requests from other poliastro contributors, including the mentor +- Maintain [poliastro benchmarks](https://benchmarks.poliastro.space/) +- Give a talk about the work at some Python event #### Additional resources -* [Wiki page on Validation](https://github.com/poliastro/poliastro/wiki/Validation) -* [SpiceyPy](http://spiceypy.readthedocs.io/) (Python wrappers for SPICE) -* [GMAT](http://www.gmatcentral.org/) -* [STK](https://agi.com/products/engineering-tools) -* [Discussion about ecliptic reference frames in Astropy](https://github.com/astropy/astropy/pull/6508) +- [Wiki page on Validation](https://github.com/poliastro/poliastro/wiki/Validation) +- [SpiceyPy](http://spiceypy.readthedocs.io/) (Python wrappers for SPICE) +- [GMAT](http://www.gmatcentral.org/) +- [STK](https://agi.com/products/engineering-tools) +- [Discussion about ecliptic reference frames in Astropy](https://github.com/astropy/astropy/pull/6508) diff --git a/_projects/2020/radis/accelerate_synthetic_spectra_calculations.md b/src/content/pages/gsoc/2020/radis/accelerate_synthetic_spectra_calculations.md similarity index 58% rename from _projects/2020/radis/accelerate_synthetic_spectra_calculations.md rename to src/content/pages/gsoc/2020/radis/accelerate_synthetic_spectra_calculations.md index d2e0aef5..2e5fc57c 100644 --- a/_projects/2020/radis/accelerate_synthetic_spectra_calculations.md +++ b/src/content/pages/gsoc/2020/radis/accelerate_synthetic_spectra_calculations.md @@ -2,34 +2,35 @@ name: Accelerate Synthetic Spectra Calculations desc: Implement GPU acceleration and new state-of-the-art methods to compute synthetic emission and absorption spectra requirements: - - Basic notions of spectroscopy - - Some experience with CUDA + - Basic notions of spectroscopy + - Some experience with CUDA difficulty: medium mentors: -# GitHub handles - - erwanp - - dcmvdbekerom - - minouHub + # GitHub handles + - erwanp + - dcmvdbekerom + - minouHub initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - CUDA + # Different technologies needed + - python + - CUDA collaborating_projects: - - radis + - radis issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis/issues/46 + # Related issues (if any) to this project. + - https://github.com/radis/radis/issues/46 --- #### Description -The presence and concentration of molecules in a gas can be measured by comparing absorption and emission experimental spectra to synthetic spectra. However, under high-temperature conditions, the synthetic spectra contain dozens of millions of lines. In any line-by-line code the bottleneck is the calculation of the lineshapes, which can require long computational times (up to several minutes). - +The presence and concentration of molecules in a gas can be measured by comparing absorption and emission experimental spectra to synthetic spectra. However, under high-temperature conditions, the synthetic spectra contain dozens of millions of lines. In any line-by-line code the bottleneck is the calculation of the lineshapes, which can require long computational times (up to several minutes). + The RADIS code was recently developed for the characterization of high-temperature infrared spectra in plasmas and flames. It uses a new approach to quickly calculate lineshapes of synthetic spectra. The latest developments already make it one the fastest spectral codes in the world. The goal of this project is to push further and implement two new techniques to gain another orders of magnitude, by two means: + - Implementing GPU acceleration for lineshape calculation (proof-of-concept example has shown we can compute 250 millions lines in 150 ms!) -- Implementing a new vectorization technique to quickly compute lineshapes in line-of-sight spectra (i.e., a column of heterogeneous gas) +- Implementing a new vectorization technique to quickly compute lineshapes in line-of-sight spectra (i.e., a column of heterogeneous gas) This performance would be beneficial for new applications such as exoplanet characterization. @@ -37,36 +38,32 @@ This performance would be beneficial for new applications such as exoplanet char ##### Coding starts -* Engage with the community and understand the motivation of spectroscopy users -* Training on emission & absorption spectroscopy -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) -* Get used with RADIS architecture: review the interface change to calculate multiple molecules at the same time ([#74](https://github.com/radis/radis/pull/74#issuecomment-585773087)) -* Learn about the details of the vectorized calculation of lineshapes in line-of-sight spectra. - +- Engage with the community and understand the motivation of spectroscopy users +- Training on emission & absorption spectroscopy +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) +- Get used with RADIS architecture: review the interface change to calculate multiple molecules at the same time ([#74](https://github.com/radis/radis/pull/74#issuecomment-585773087)) +- Learn about the details of the vectorized calculation of lineshapes in line-of-sight spectra. ##### 1st evaluation -* Proof of concept GPU implementation example has been reproduced -* GPU acceleration is implemented and working on your own Fork for at least one combination of lineshape broadening parameters. +- Proof of concept GPU implementation example has been reproduced +- GPU acceleration is implemented and working on your own Fork for at least one combination of lineshape broadening parameters. ##### 2nd evaluation -* GPU acceleration is implemented in the main project for all combinations of lineshape broadening parameters -* Have all code, tests and documentation in GitHub. +- GPU acceleration is implemented in the main project for all combinations of lineshape broadening parameters +- Have all code, tests and documentation in GitHub. ##### Final -* GPU acceleration is implemented in the main project and tested on many architectures -* Write an iPython notebook to document the performance benchmark on [radis-benchmark](https://github.com/radis/radis-benchmark) -* Have all code, tests and documentation in GitHub. -* Proof of concept of the vectorized calculation of lineshapes in line-of-sight spectra is implemented +- GPU acceleration is implemented in the main project and tested on many architectures +- Write an iPython notebook to document the performance benchmark on [radis-benchmark](https://github.com/radis/radis-benchmark) +- Have all code, tests and documentation in GitHub. +- Proof of concept of the vectorized calculation of lineshapes in line-of-sight spectra is implemented #### Secondary goals -* Direct line-of-sight spectra technique is implemented in main project -* Document architecture and developer guide when facing unclear points that may appear. -* Review pull requests from other RADIS contributors -* Interface to atmosphere calculations (merge results with project [RADIS Atmosphere Calculation Interface](https://openastronomy.org/gsoc/gsoc2020/#/projects?project=radis_atmosphere_calculation_interface) ) - - - +- Direct line-of-sight spectra technique is implemented in main project +- Document architecture and developer guide when facing unclear points that may appear. +- Review pull requests from other RADIS contributors +- Interface to atmosphere calculations (merge results with project [RADIS Atmosphere Calculation Interface](https://openastronomy.org/gsoc/2020/#/projects?project=radis_atmosphere_calculation_interface) ) diff --git a/src/content/pages/gsoc/2020/radis/radis_atmosphere_calculation_interface.md b/src/content/pages/gsoc/2020/radis/radis_atmosphere_calculation_interface.md new file mode 100644 index 00000000..d7ed1bde --- /dev/null +++ b/src/content/pages/gsoc/2020/radis/radis_atmosphere_calculation_interface.md @@ -0,0 +1,60 @@ +--- +name: RADIS Atmosphere Calculation Interface +desc: Adapt a spectroscopy open-source code to characterize exoplanet atmospheres. +requirements: + - Basic notions of spectroscopy +difficulty: easy +mentors: + # GitHub handles + - erwanp + - minouHub + - dcmvdbekerom +initiatives: + - GSOC +tags: + # Different technologies needed + - python + - CUDA +collaborating_projects: + - radis +issues: + # Related issues (if any) to this project. + - https://github.com/radis/radis/issues/74 +--- + +#### Description + +The presence and concentration of molecules in exoplanet atmospheres are measured by comparing absorption and emission spectra to synthetic spectra. However, under high-temperature conditions, the synthetic spectra contain dozens of millions of lines, which require long computational times . + +The RADIS code was recently developed for the characterization of plasmas and flames. It uses a new approach to quickly calculate high-temperature infrared spectra. New developments are in progress (see our [other project](https://openastronomy.org/gsoc/2020/#/projects?project=accelerate_synthetic_spectra_calculations) on further accelerating the code), but it is already one of the fastest spectral codes in the world. This performance would be beneficial for exoplanet characterization, and this is the goal of this project: adapt the RADIS code to the calculation of exoplanet atmospheres! + +#### Milestones + +##### Coding starts + +- Engage with the community and understand the motivation of spectroscopy users +- Training on emission & absorption spectroscopy +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) +- Get used with RADIS architecture: review the interface change to calculate multiple molecules at the same time ([#74](https://github.com/radis/radis/pull/74#issuecomment-585773087)) + +##### 1st evaluation + +- Indirect integration of databases from the Exoplanet atmosphere community (ExoMol), using a converter to the HITRAN format supported by RADIS +- 1st calculation of an atmosphere line-of-sight spectrum with Python hardcoded inputs + +##### 2nd evaluation + +- Direct integration of ExoMol, and memory optimization +- Calculation of atmosphere with standard atmosphere input files (mole fractions, temperature profile, pressure profile) + +##### Final + +- Write an iPython notebook to document the atmosphere module on [radis-examples](https://github.com/radis/radis-examples) +- Have all code, tests and documentation in GitHub. + +#### Secondary goals + +- Document architecture and developer guide when facing unclear points that may appear. +- Review pull requests from other RADIS contributors +- Optimized calculation of atmospheres in optically thin configurations (merge results with project [Accelerate Synthetic Spectra Calculations](https://openastronomy.org/gsoc/2020/#/projects?project=accelerate_synthetic_spectra_calculations) ) + ) diff --git a/_projects/2020/stingray/multitaper.md b/src/content/pages/gsoc/2020/stingray/multitaper.md similarity index 71% rename from _projects/2020/stingray/multitaper.md rename to src/content/pages/gsoc/2020/stingray/multitaper.md index 34811fdc..4fb21662 100644 --- a/_projects/2020/stingray/multitaper.md +++ b/src/content/pages/gsoc/2020/stingray/multitaper.md @@ -1,52 +1,50 @@ --- name: Multitaper-Periodograms in Stingray. -desc: Add a new algorithm for building periodograms to Stingray. The multitaper periodogram is a method that's fairly well-known in signal processing, but virtually unknown in (X-ray) astronomy. +desc: Add a new algorithm for building periodograms to Stingray. The multitaper periodogram is a method that's fairly well-known in signal processing, but virtually unknown in (X-ray) astronomy. requirements: - - Proficiency in Python - - Knowledge of signal processing and Fourier methods would be ideal + - Proficiency in Python + - Knowledge of signal processing and Fourier methods would be ideal difficulty: medium issues: - - https://github.com/StingraySoftware/stingray/issues/361 + - https://github.com/StingraySoftware/stingray/issues/361 mentors: - - dhuppenkothen - - matteobachetti + - dhuppenkothen + - matteobachetti initiatives: - - GSOC + - GSOC tags: - - python - - signal processing - - time series analysis - - Fourier analysis - - astronomy + - python + - signal processing + - time series analysis + - Fourier analysis + - astronomy collaborating_projects: - - stingray + - stingray --- #### Description + Generating periodograms for astronomical data is the core task of Stingray. Because periodograms are often noisy, several methods to denoise periodograms exist in the literature, among them the multi-taper periodogram Stingray aims to provide a comprehensive library of reliable, well-tested implementations of common algorithms for time series analysis in Astronomy. In this project, the student will add the multi-taper periodogram to the existing code base in order to allow astronomers build periodograms with better noise properties. - #### Milestones (if any) 1. Proof-of-concept implementation of the multi-taper algorithm 2. Full implementation of the algorithm in the Stingray framework, including tests and relevant documentation - ##### Coding starts -* Understand algorithm and have an overview of the individual components that need to be implemented. +- Understand algorithm and have an overview of the individual components that need to be implemented. ##### 1st evaluation -* Proof-of-concept implementation is complete. +- Proof-of-concept implementation is complete. ##### 2nd evaluation -* Full implementation is complete +- Full implementation is complete ##### Final -* Wrap up connecting the new implementation to existing Stingray classes, finish documentation and associated tutorial in a Jupyter notebook. - +- Wrap up connecting the new implementation to existing Stingray classes, finish documentation and associated tutorial in a Jupyter notebook. diff --git a/_projects/2020/stingray/optimize.md b/src/content/pages/gsoc/2020/stingray/optimize.md similarity index 71% rename from _projects/2020/stingray/optimize.md rename to src/content/pages/gsoc/2020/stingray/optimize.md index 333d94ce..47650484 100644 --- a/_projects/2020/stingray/optimize.md +++ b/src/content/pages/gsoc/2020/stingray/optimize.md @@ -2,26 +2,27 @@ name: A lightning-fast stingray. desc: Improve how the X-ray spectral timing library Stingray deals with large input datasets requirements: - - Familiarity with code optimization - - Proficiency in Python + - Familiarity with code optimization + - Proficiency in Python difficulty: medium issues: - - https://github.com/StingraySoftware/stingray/issues/451 + - https://github.com/StingraySoftware/stingray/issues/451 mentors: - - matteobachetti - - dhuppenkothen + - matteobachetti + - dhuppenkothen initiatives: - - GSOC + - GSOC tags: - - python - - memory mapping - - parallel processing - - llvm (numba) + - python + - memory mapping + - parallel processing + - llvm (numba) collaborating_projects: - - stingray + - stingray --- #### Description + This project is about making the [Stingray spectral timing library](https://stingray.readthedocs.io) ready for the data coming from high-sensitivity X-ray detectors like NICER (and, in the future, eXTP and/or Strobe-X), or other kinds of high-throughput photon counters (i.e. in the optical). The student will start by benchmarking the code through simulated data, address a few known bottlenecks of the code (for example, the need for loading full dataset into the RAM), and explore alternative technologies (memory mapping, parallel computing) to speed up the computation and the data retrieval for larger-than-memory datasets. @@ -35,16 +36,16 @@ The student will start by benchmarking the code through simulated data, address ##### Coding starts -* Setup benchmarks to test the performance of different parts of the code with larger and larger simulated datasets. +- Setup benchmarks to test the performance of different parts of the code with larger and larger simulated datasets. ##### 1st evaluation -* A thorough report on the scalability of the various parts of the library. Draft memory mapping to allow larger-than-memory datasets in the `EventList` and `Lightcurve` classes. +- A thorough report on the scalability of the various parts of the library. Draft memory mapping to allow larger-than-memory datasets in the `EventList` and `Lightcurve` classes. ##### 2nd evaluation -* Memory mapping completed and tested. Speed up computation in `AveragedCrossspectrum`. +- Memory mapping completed and tested. Speed up computation in `AveragedCrossspectrum`. ##### Final -* Wrap up all optimizations, described in the `restructuredText` documentation and in Jupyter notebooks. +- Wrap up all optimizations, described in the `restructuredText` documentation and in Jupyter notebooks. diff --git a/_projects/2020/sunpy/fido.md b/src/content/pages/gsoc/2020/sunpy/fido.md similarity index 83% rename from _projects/2020/sunpy/fido.md rename to src/content/pages/gsoc/2020/sunpy/fido.md index dd02f03f..39d4768f 100644 --- a/_projects/2020/sunpy/fido.md +++ b/src/content/pages/gsoc/2020/sunpy/fido.md @@ -2,30 +2,29 @@ name: Fido desc: Towards metadata only searches with Fido requirements: - - Quite familiar with Python. + - Quite familiar with Python. difficulty: Medium issues: -- https://github.com/sunpy/sunpy/pulls?q=is%3Apr+label%3A%22Needs+Adoption%22+is%3Aclosed+label%3Aunidown -- https://github.com/sunpy/sunpy/issues/3336 -- https://github.com/sunpy/sunpy/issues/3735 -- https://github.com/sunpy/sunpy/issues/3733 -- https://github.com/sunpy/sunpy/issues/3734 -- https://github.com/sunpy/sunpy/issues/2744 -- https://github.com/sunpy/sunpy/issues/2631 + - https://github.com/sunpy/sunpy/pulls?q=is%3Apr+label%3A%22Needs+Adoption%22+is%3Aclosed+label%3Aunidown + - https://github.com/sunpy/sunpy/issues/3336 + - https://github.com/sunpy/sunpy/issues/3735 + - https://github.com/sunpy/sunpy/issues/3733 + - https://github.com/sunpy/sunpy/issues/3734 + - https://github.com/sunpy/sunpy/issues/2744 + - https://github.com/sunpy/sunpy/issues/2631 mentors: - - Cadair - - nabobalis + - Cadair + - nabobalis initiatives: - - GSOC + - GSOC tags: - - python + - python collaborating_projects: - - SunPy + - SunPy --- #### Description - SunPy provides a Python interface to many different sources of solar data. These data are generally of two forms, file based downloads where observations are downloaded as FITS files or other files, and metadata only searches such as event lists or spatial location of features. Currently in sunpy the file based downloads are all accessible in one single search interface called "Fido", this project would provide the foundations needed to extend Fido to include metadata only searches. diff --git a/_projects/2020/sunpy/solarglue.md b/src/content/pages/gsoc/2020/sunpy/solarglue.md similarity index 73% rename from _projects/2020/sunpy/solarglue.md rename to src/content/pages/gsoc/2020/sunpy/solarglue.md index 86eb8b52..7ff88c7d 100644 --- a/_projects/2020/sunpy/solarglue.md +++ b/src/content/pages/gsoc/2020/sunpy/solarglue.md @@ -2,23 +2,23 @@ name: glue-solar desc: Making Glue work for Solar Physics datasets requirements: - - Quite familiar with Python. - - Previous QT or GUI experience would be nice + - Quite familiar with Python. + - Previous QT or GUI experience would be nice difficulty: Medium to High issues: -- None + - None mentors: - - Cadair - - nabobalis - - astrofrog + - Cadair + - nabobalis + - astrofrog initiatives: - - GSOC + - GSOC tags: - - python - - GUI (qtpy) + - python + - GUI (qtpy) collaborating_projects: - - SunPy - - Glue + - SunPy + - Glue --- #### Description @@ -31,12 +31,13 @@ The objective of this project is to provide a foundation for these types of proj While a fully featured GUI toolkit for solar data can not be built in one summer, the goal is to provide the technical building blocks, but more importantly to demonstrate, and document, how this framework can be used by instrument teams to build custom solutions for their data. The sort of features that exist in other interactive exploration tools are: - - Able to open the files and understand the metadata. - - Creating movies or PNGs of different frames and wavelengths. - - Basic slit analysis of images through several dimensions. - - Basic Doppler and magnetic field support. - - Re-scaling images. - - Line profile fitting. + +- Able to open the files and understand the metadata. +- Creating movies or PNGs of different frames and wavelengths. +- Basic slit analysis of images through several dimensions. +- Basic Doppler and magnetic field support. +- Re-scaling images. +- Line profile fitting. This project will use [Glue](https://glueviz.org/) **"A python project to link visualizations of scientific datasets across many files."** Glue is a very powerful and extensible tool which already has support for many solar physics data through use of the WCS and coordinate frames implemented in Astropy and SunPy. @@ -49,12 +50,11 @@ Previous (and on-going) work for supporting astronomy and solar datasets is occu The primary development and documentation effort for this project would take place in the glue-solar repository. - This project would be considered successful if many of the following goals were achieved (in descending order of priority): -* Glue-solar is an installable package, with a first official release. -* Glue-solar is well documented, both for users and future developers, with screenshots and screencasts as appropriate. -* Glue-solar can load many different complex datasets such as SST cubes, IRIS data, DKIST data as well as AIA, HMI etc. -* Glue-solar demonstrates how to implement custom data loaders (i.e. for IRIS data). -* Glue-solar demonstrates how to implement custom linked layouts (i.e. SJI + Raster iris data). -* Glue-solar includes a custom splash screen with the SunPy logo. +- Glue-solar is an installable package, with a first official release. +- Glue-solar is well documented, both for users and future developers, with screenshots and screencasts as appropriate. +- Glue-solar can load many different complex datasets such as SST cubes, IRIS data, DKIST data as well as AIA, HMI etc. +- Glue-solar demonstrates how to implement custom data loaders (i.e. for IRIS data). +- Glue-solar demonstrates how to implement custom linked layouts (i.e. SJI + Raster iris data). +- Glue-solar includes a custom splash screen with the SunPy logo. diff --git a/_projects/2020/sunpy/sunspotter.md b/src/content/pages/gsoc/2020/sunpy/sunspotter.md similarity index 68% rename from _projects/2020/sunpy/sunspotter.md rename to src/content/pages/gsoc/2020/sunpy/sunspotter.md index 0bf6fa8c..47b1b138 100644 --- a/_projects/2020/sunpy/sunspotter.md +++ b/src/content/pages/gsoc/2020/sunpy/sunspotter.md @@ -2,22 +2,22 @@ name: Space Weather forecasting using linear algebra desc: Create a model to forecast solar flare events of new solar active regions images. requirements: - - Familiar with methods for creating classes, objects and subclasses. - - Confident with linear algebra methods. + - Familiar with methods for creating classes, objects and subclasses. + - Confident with linear algebra methods. difficulty: medium issues: mentors: - - dpshelio - - drsophiemurray - - samaloney - - mbobra + - dpshelio + - drsophiemurray + - samaloney + - mbobra initiatives: - - SOCIS - - GSOC + - SOCIS + - GSOC tags: - - Python + - Python collaborating_projects: - - SunPy + - SunPy --- #### Description @@ -46,33 +46,32 @@ Though this idea is for SOCIS, [same GSOC rules apply](https://github.com/sunpy/ ##### 1st Month -* Familiarisation with the dataset. Read and visualise the different type of +- Familiarisation with the dataset. Read and visualise the different type of data (images, classifications, …) -* Have evaluated and chosen an approach to the design of a SunPy search events +- Have evaluated and chosen an approach to the design of a SunPy search events object based on the images using [HEK or HELIO](https://docs.sunpy.org/en/latest/guide/acquiring_data/hek.html). -* Implementation of a basic linear algebra model to understand the steps +- Implementation of a basic linear algebra model to understand the steps needed for this problem -* Write up notebook for the sunpy gallery that exemplifies an analysis of this +- Write up notebook for the sunpy gallery that exemplifies an analysis of this dataset ##### 2nd Month -* Experiment with different linear algebra methods to find the best model. -* Write up as blog posts the different attempts tried. +- Experiment with different linear algebra methods to find the best model. +- Write up as blog posts the different attempts tried. ##### 3rd Month -* Check the accuracy of the model with SDO/HMI images from HEK -* Create notebook for the sunpy gallery explaining how to use the model +- Check the accuracy of the model with SDO/HMI images from HEK +- Create notebook for the sunpy gallery explaining how to use the model #### Resources -* [Predicting Coronal Mass Ejections Using Machine Learning Methods]( -https://doi.org/10.3847/0004-637X/821/2/127) -* [Sunspotter: Using Citizen Science to Determine the Complexity of +- [Predicting Coronal Mass Ejections Using Machine Learning Methods](https://doi.org/10.3847/0004-637X/821/2/127) +- [Sunspotter: Using Citizen Science to Determine the Complexity of Sunspots](https://doi.org/10.6084/m9.figshare.1050569.v1) -* [Machine Learning, Statistics, and Data Mining for +- [Machine Learning, Statistics, and Data Mining for Heliophysics](https://helioml.github.io/HelioML/title.html) -* [A Comparison of Flare Forecasting Methods. I. Results from the "All-Clear" +- [A Comparison of Flare Forecasting Methods. I. Results from the "All-Clear" Workshop](https://doi.org/10.3847/0004-637X/829/2/89) diff --git a/src/content/pages/gsoc/2021/astropy/astropyCDS.md b/src/content/pages/gsoc/2021/astropy/astropyCDS.md new file mode 100644 index 00000000..0396f60b --- /dev/null +++ b/src/content/pages/gsoc/2021/astropy/astropyCDS.md @@ -0,0 +1,48 @@ +--- +name: Add a CDS-ASCII writer to astropy +desc: Allow writing an astropy Table to CDS format +requirements: + # Student requirements: + - Python + - Some familiarity with ASCII files is preferred +difficulty: low +issues: + # Related issues (if any) to this project. + - https://github.com/astropy/astropy/issues/11257 + - https://github.com/astropy/astropy/issues/11239 + - https://github.com/astropy/astropy/issues/9291 +mentors: + # GitHub handles + - hamogu + - aaryapatil +initiatives: + - GSOC +tags: + # Different technologies needed + - python + - astropy core +collaborating_projects: + # suborganization(s) to which this project belongs. + - astropy +--- + +#### Description + +Astropy is a core python package for astronomy that provides several modules for the analysis of observational data. A common problem is storing and retrieving tabular data in standard formats which include metadata to fully describe the contents of a table. One such ASCII format is CDS () that is used for publishing catalogues accompanying papers to astronomical databases like Vizier. Astropy has the capability of reading a CDS file to an astropy Table but not writing a Table to CDS. In this project, the student will create a CDS writer in astropy.io.ascii. A python module from CDS () uses astropy to write CDS files, and the astropy writer can be based on that. + +#### Milestones (if any) + +##### Coding starts + +- Understand the CDS format, and write an example astropy Table to this format using python +- Get familiar with the astropy.io.ascii framework + +##### 1st evaluation + +- Add the writer to astropy.io.ascii (PR open and tests pass) +- Add documentation for the writer + +##### Final + +- Finish testing and documentation +- Fix any bugs (if found or reported) diff --git a/_projects/2021/gnuastro/astrometry.md b/src/content/pages/gsoc/2021/gnuastro/astrometry.md similarity index 59% rename from _projects/2021/gnuastro/astrometry.md rename to src/content/pages/gsoc/2021/gnuastro/astrometry.md index c61a2f22..47fe7569 100644 --- a/_projects/2021/gnuastro/astrometry.md +++ b/src/content/pages/gsoc/2021/gnuastro/astrometry.md @@ -3,31 +3,30 @@ name: Astrometry desc: Astrometry library in Gnuastro # add a short one line description of your project requirements: -# Student requirements: - - Knoweledge of C programming language. + # Student requirements: + - Knoweledge of C programming language. difficulty: medium issues: -# Related issues (if any) to this project. - - https://savannah.gnu.org/task/?15747 - - https://savannah.gnu.org/task/?15636 + # Related issues (if any) to this project. + - https://savannah.gnu.org/task/?15747 + - https://savannah.gnu.org/task/?15636 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - mohammad-akhlaghi - - sachinkumarsingh092 + # First person in contact; mentors may change before project starts. + # GitHub handles + - mohammad-akhlaghi + - sachinkumarsingh092 initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: -# Different technologies needed - - C - - Git + # Different technologies needed + - C + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - Gnuastro + # suborganization(s) to which this project belongs. + - Gnuastro --- - #### Description Astrometry is a critical component in the processing of astronomical data. @@ -39,26 +38,26 @@ To get started, check [our checklist](http://savannah.gnu.org/support/?110457#co #### Milestones (if any) - * Learning basic concepts of Astrometry and existing functions. +- Learning basic concepts of Astrometry and existing functions. - * Fixing bugs in existing components (for example bugs #59324, #58773). +- Fixing bugs in existing components (for example bugs #59324, #58773). - * Adding the remaining high-level components to complete astrometry. +- Adding the remaining high-level components to complete astrometry. ##### Coding starts -* Actively start fixing/adding some minor bugs/tasks in Gnuastro to get a good feeling of the coding style and logic within Gnuastro (this can be independent of astrometry). +- Actively start fixing/adding some minor bugs/tasks in Gnuastro to get a good feeling of the coding style and logic within Gnuastro (this can be independent of astrometry). -* Study the basic concepts of Astrometry and learning/testing the existing low-level features that have already been written. +- Study the basic concepts of Astrometry and learning/testing the existing low-level features that have already been written. ##### 1st evaluation -* Fixing bugs in existing components. +- Fixing bugs in existing components. ##### 2nd evaluation -* Adding the remaining higher-level functions. +- Adding the remaining higher-level functions. ##### Final -* Writing robust tests for the library, using data from several space-based and ground-based imaging surveys. +- Writing robust tests for the library, using data from several space-based and ground-based imaging surveys. diff --git a/_projects/2021/gnuastro/python-wrapper.md b/src/content/pages/gsoc/2021/gnuastro/python-wrapper.md similarity index 62% rename from _projects/2021/gnuastro/python-wrapper.md rename to src/content/pages/gsoc/2021/gnuastro/python-wrapper.md index 6b7ab1c0..a4c9f075 100644 --- a/_projects/2021/gnuastro/python-wrapper.md +++ b/src/content/pages/gsoc/2021/gnuastro/python-wrapper.md @@ -3,31 +3,30 @@ name: Gnuastro library in Python desc: Wrappers over the Gnuastro C library to allow usage in Python. # add a short one line description of your project requirements: -# Student requirements: - - The Python and Numpy core C library. - - C programming language. + # Student requirements: + - The Python and Numpy core C library. + - C programming language. difficulty: medium issues: -# Related issues (if any) to this project. - - https://savannah.gnu.org/task/?13786 + # Related issues (if any) to this project. + - https://savannah.gnu.org/task/?13786 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - mohammad-akhlaghi + # First person in contact; mentors may change before project starts. + # GitHub handles + - mohammad-akhlaghi initiatives: - - GSOC - - SOCIS + - GSOC + - SOCIS tags: -# Different technologies needed - - Python - - C - - Git + # Different technologies needed + - Python + - C + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - Gnuastro + # suborganization(s) to which this project belongs. + - Gnuastro --- - #### Description Gnuastro is primarily written in C because astronomical datasets are large and thus need to be efficient with few dependencies. @@ -36,33 +35,33 @@ However, Gnuastro's also has an extensive set of installed, dynamic C/C++ librar However, many projects today are done in Python, almost excuslively using Numpy for their numerical operations (like data arrays). Python and Numpy are actually written in C, therefore they have very well-defined interfaces for communicating with installed C libraries. Gnuastro therefore plans on adding a low-level wrapper infra-structure which will allow easy usage of Gnuastro's powerful libraries in Python. -Note that this won't involve intermediate wrapper languages SWIG, we will directly link with the core C library of Numpy: https://docs.scipy.org/doc/numpy-1.10.0/reference/c-api.html +Note that this won't involve intermediate wrapper languages SWIG, we will directly link with the core C library of Numpy: This will be a wonderful chance to master Python and Scipy/Numpy at a very fundamental level, giving you a great experience to expand what you have learnt afterwards into many other functionalities. Of course, in the meantime you will also working on many real-world astronomical data and science scenarios using ground-based and space-based data. To get started, check [our checklist](http://savannah.gnu.org/support/?110457#comment0). #### Milestones (if any) - * Mastering the C interface of Numpy and Gnuastro. +- Mastering the C interface of Numpy and Gnuastro. - * Writing functions to convert Numpy's core data structure to Gnuastro's core data structure and vice-versa. +- Writing functions to convert Numpy's core data structure to Gnuastro's core data structure and vice-versa. - * Build and install the Python components as part of the Gnuastro's build. +- Build and install the Python components as part of the Gnuastro's build. ##### Coding starts -* Learning the numpy C interface and writing small test usages on some basic operations (not necessarily involving Gnuastro). +- Learning the numpy C interface and writing small test usages on some basic operations (not necessarily involving Gnuastro). -* Fixing small bugs in Gnuastro's library (as an excuse to learn the programming style and usage of Gnuastro's libraries). +- Fixing small bugs in Gnuastro's library (as an excuse to learn the programming style and usage of Gnuastro's libraries). ##### 1st evaluation -* Having a working converter between Numpy's data structure and Gnuastro's data structure. +- Having a working converter between Numpy's data structure and Gnuastro's data structure. ##### 2nd evaluation -* Adding wrappers to the core lower-level Gnuastro libraries. +- Adding wrappers to the core lower-level Gnuastro libraries. ##### Final -* Writing tests and build/install steps of the Python wrappers in Gnuastro's build system. +- Writing tests and build/install steps of the Python wrappers in Gnuastro's build system. diff --git a/src/content/pages/gsoc/2021/index.md b/src/content/pages/gsoc/2021/index.md new file mode 100644 index 00000000..c69b0087 --- /dev/null +++ b/src/content/pages/gsoc/2021/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2021" +show_main: false +season: 2021 +--- diff --git a/_projects/2021/juliaastro/NOVAS.md b/src/content/pages/gsoc/2021/juliaastro/NOVAS.md similarity index 58% rename from _projects/2021/juliaastro/NOVAS.md rename to src/content/pages/gsoc/2021/juliaastro/NOVAS.md index aa74d2b4..7734c1be 100644 --- a/_projects/2021/juliaastro/NOVAS.md +++ b/src/content/pages/gsoc/2021/juliaastro/NOVAS.md @@ -2,32 +2,33 @@ name: NOVAS desc: Implement a Julia vectorized version of the NOVAS library # add a short one line description of your project -requirements: -# Student requirements: - - Familiarity with the Julia programming language. - - Familiarity with linear algebra/numerical methods. - - Familiarity with astronomy/astrometry. +requirements: + # Student requirements: + - Familiarity with the Julia programming language. + - Familiarity with linear algebra/numerical methods. + - Familiarity with astronomy/astrometry. difficulty: medium issues: # Related issues (if any) to this project. mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - barrettp - - giordano + # First person in contact; mentors may change before project starts. + # GitHub handles + - barrettp + - giordano initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - Julia - - linear algebra - - astronomy/astrometry - - JPL ephemeris library + # Different technologies needed + - Julia + - linear algebra + - astronomy/astrometry + - JPL ephemeris library collaborating_projects: -# suborganisation(s) to which this project belongs. - - juliaAstro + # suborganization(s) to which this project belongs. + - juliaAstro --- -Implement a Julia version of the U.S. Naval Observatory Vector Astrometry + +Implement a Julia version of the U.S. Naval Observatory Vector Astrometry Software (NOVAS) library and vectorize it to improve performance. #### Description @@ -46,24 +47,24 @@ stars. The current C and FORTRAN versions do not have this feature. #### Milestones (if any) -* Initial implementation of the basic algorithms/functions. +- Initial implementation of the basic algorithms/functions. -* Vectorize the basic algorithms/functions +- Vectorize the basic algorithms/functions -* Modifications to the design to improve ease-of-use. +- Modifications to the design to improve ease-of-use. ##### Coding starts -* Understand the astrometrc algorithms and the related functions. +- Understand the astrometrc algorithms and the related functions. ##### 1st evaluation -* Initial implementation of basic algorithms/functions +- Initial implementation of basic algorithms/functions ##### 2nd evaluation -* Vectorize the basis algorithms/functions. +- Vectorize the basis algorithms/functions. ##### Final -* Submit final implementation with improvements for ease-of-use. +- Submit final implementation with improvements for ease-of-use. diff --git a/_projects/2021/radis/atmosphere_interface.md b/src/content/pages/gsoc/2021/radis/atmosphere_interface.md similarity index 56% rename from _projects/2021/radis/atmosphere_interface.md rename to src/content/pages/gsoc/2021/radis/atmosphere_interface.md index 48d05d52..1196fe6c 100644 --- a/_projects/2021/radis/atmosphere_interface.md +++ b/src/content/pages/gsoc/2021/radis/atmosphere_interface.md @@ -3,30 +3,29 @@ name: Atmosphere Calculations desc: Model atmospheres in the RADIS spectral code with a simplified frontend and more line databases # add a short one line description of your project requirements: -# Student requirements: - - Ideally : familiar with radiative transfer equations. + # Student requirements: + - Ideally: familiar with radiative transfer equations. difficulty: easy issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis/issues/34 - - https://github.com/radis/radis/issues/189 + # Related issues (if any) to this project. + - https://github.com/radis/radis/issues/34 + - https://github.com/radis/radis/issues/189 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - erwanp - - ulyssed + # First person in contact; mentors may change before project starts. + # GitHub handles + - erwanp + - ulyssed initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - Python - - Git + # Different technologies needed + - Python + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. This performance makes it very suitable to compute high-temperature atmospheres. @@ -37,40 +36,36 @@ The goal of this project is to simplify the user interface to compute atmosphere - make RADIS compatible with more line databases (ExoMol, GEISA, etc.) -- if interested in the radiative transfer-physics, add a plane-parallel model for multiple-layers-atmospheres. - +- if interested in the radiative transfer-physics, add a plane-parallel model for multiple-layers-atmospheres. #### Milestones - ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Training on emission & absorption spectroscopy +- Training on emission & absorption spectroscopy -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) -* Get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) : in particular, review the interface change to calculate multiple molecules at the same time ([#74](https://github.com/radis/radis/pull/74)) +- Get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) : in particular, review the interface change to calculate multiple molecules at the same time ([#74](https://github.com/radis/radis/pull/74)) ##### 1st evaluation -* Write interface to read standard atmosphere input files (mole fractions, temperature profile, pressure profile) +- Write interface to read standard atmosphere input files (mole fractions, temperature profile, pressure profile) -* Add a detailed Notebook example in the documentation - -* Add integration to more line databases, like ExoMol or GEISA ([#34](https://github.com/radis/radis/issues/34)) +- Add a detailed Notebook example in the documentation +- Add integration to more line databases, like ExoMol or GEISA ([#34](https://github.com/radis/radis/issues/34)) ##### Final -* Improve how these databases are downloaded automatically and converted to RADIS standard format (see [#210](https://github.com/radis/radis/issues/210)) - -* Add a Gallery Example in RADIS documentation +- Improve how these databases are downloaded automatically and converted to RADIS standard format (see [#210](https://github.com/radis/radis/issues/210)) -* Have all code, tests and documentation in GitHub. +- Add a Gallery Example in RADIS documentation +- Have all code, tests and documentation in GitHub. ##### Secondary Goals -* If the student is interested in the radiative-transfer physics, set-up a plane-parallel model to compute multiple-layers atmospheres ([#189](https://github.com/radis/radis/issues/189)) \ No newline at end of file +- If the student is interested in the radiative-transfer physics, set-up a plane-parallel model to compute multiple-layers atmospheres ([#189](https://github.com/radis/radis/issues/189)) diff --git a/_projects/2021/radis/auto_engine.md b/src/content/pages/gsoc/2021/radis/auto_engine.md similarity index 56% rename from _projects/2021/radis/auto_engine.md rename to src/content/pages/gsoc/2021/radis/auto_engine.md index d27a3965..032daecf 100644 --- a/_projects/2021/radis/auto_engine.md +++ b/src/content/pages/gsoc/2021/radis/auto_engine.md @@ -6,74 +6,71 @@ requirements: # Student requirements: difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis-benchmark/issues/5 + # Related issues (if any) to this project. + - https://github.com/radis/radis-benchmark/issues/5 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - erwanp - - pkj-m + # First person in contact; mentors may change before project starts. + # GitHub handles + - erwanp + - pkj-m initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - Python - - Git + # Different technologies needed + - Python + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description -The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. +The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. -The new algorithm is very efficient for large number of lines. However, for very widespread spectra with low number of lines, the legacy algorithm performs better. It was suggested that a scaling number would of the form : +The new algorithm is very efficient for large number of lines. However, for very widespread spectra with low number of lines, the legacy algorithm performs better. It was suggested that a scaling number would of the form : -$$ Rc = broadening_cutoff / wstep * N_lines / log(spectral range / wstep) $$ +$$ Rc = broadening_cutoff / wstep \* N_lines / log(spectral range / wstep) $$ -For low values of Rc, the legacy method would perform better. For large values of R, the new algorithm would perform better. +For low values of Rc, the legacy method would perform better. For large values of R, the new algorithm would perform better. -The first goal of the project is to confirm or adjust this number, by setting up benchmark cases under various simulation conditions. +The first goal of the project is to confirm or adjust this number, by setting up benchmark cases under various simulation conditions. The second goal of the project is to automatically switch the lineshape algorithm used at runtime based on the value of the number. - #### Milestones ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Training on emission & absorption spectroscopy +- Training on emission & absorption spectroscopy -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) ##### 1st Evaluation -The goal is to confirm or adjust the critical number above. We only use RADIS and do not edit the codebase yet : - -* Run at least 100 benchmark cases, for various HITRAN (see [HITRAN spectra](https://radis.readthedocs.io/en/latest/examples/hitran-spectra.html#) ) and larger databases (HITEMP, CDSD-4000). +The goal is to confirm or adjust the critical number above. We only use RADIS and do not edit the codebase yet : -* Compare the results for the two lineshape engines of [calc_spectrum](https://radis.readthedocs.io/en/latest/source/radis.lbl.calc.html#radis.lbl.calc.calc_spectrum) (`optimization="None"` and `optimization="simple"`), and plot them against the R number. +- Run at least 100 benchmark cases, for various HITRAN (see [HITRAN spectra](https://radis.readthedocs.io/en/latest/examples/hitran-spectra.html#) ) and larger databases (HITEMP, CDSD-4000). -* Write a Jupyter Notebook to discuss the changes made to the R number formula, and the critical value obtained. +- Compare the results for the two lineshape engines of [calc_spectrum](https://radis.readthedocs.io/en/latest/source/radis.lbl.calc.html#radis.lbl.calc.calc_spectrum) (`optimization="None"` and `optimization="simple"`), and plot them against the R number. +- Write a Jupyter Notebook to discuss the changes made to the R number formula, and the critical value obtained. ##### Final We now update the RADIS codebase to implement the automatic engine choice : -* Add some of the benchmarks above in the [cpu-performance benchmark](https://github.com/radis/radis-benchmark/tree/master/manual_benchmarks) to track the changes. +- Add some of the benchmarks above in the [cpu-performance benchmark](https://github.com/radis/radis-benchmark/tree/master/manual_benchmarks) to track the changes. -* Compute the `Rc` number in [calc_spectrum](https://radis.readthedocs.io/en/latest/source/radis.lbl.calc.html#radis.lbl.calc.calc_spectrum) and automatically choose the optimization mode accordingly. +- Compute the `Rc` number in [calc_spectrum](https://radis.readthedocs.io/en/latest/source/radis.lbl.calc.html#radis.lbl.calc.calc_spectrum) and automatically choose the optimization mode accordingly. -* Choose what lineshape-broadening-cutoff to use by default in the legacy algorithm. +- Choose what lineshape-broadening-cutoff to use by default in the legacy algorithm. -* Re-run the benchmarks and ensure the fastest option is always chosen. +- Re-run the benchmarks and ensure the fastest option is always chosen. -* Have all code, tests and documentation in GitHub. +- Have all code, tests and documentation in GitHub. -##### Secondary Goals +##### Secondary Goals -* For the math/algorithm-oriented student : set-up the code architecture to deal with large spectra composed of multiple spectral regions, some of which would have different `Rc` numbers, and use the appropriate algorithm for each spectral region before merging the spectra. \ No newline at end of file +- For the math/algorithm-oriented student : set-up the code architecture to deal with large spectra composed of multiple spectral regions, some of which would have different `Rc` numbers, and use the appropriate algorithm for each spectral region before merging the spectra. diff --git a/_projects/2021/radis/non_air_diluent.md b/src/content/pages/gsoc/2021/radis/non_air_diluent.md similarity index 62% rename from _projects/2021/radis/non_air_diluent.md rename to src/content/pages/gsoc/2021/radis/non_air_diluent.md index 78b6dcd3..a1937334 100644 --- a/_projects/2021/radis/non_air_diluent.md +++ b/src/content/pages/gsoc/2021/radis/non_air_diluent.md @@ -3,32 +3,31 @@ name: Non-air diluent desc: Add non-air diluent and custom collisional broadening in RADIS spectra # add a short one line description of your project requirements: -# Student requirements: - - familiar with pandas + # Student requirements: + - familiar with pandas difficulty: hard issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis/issues/213 + # Related issues (if any) to this project. + - https://github.com/radis/radis/issues/213 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - erwanp - - minouHub + # First person in contact; mentors may change before project starts. + # GitHub handles + - erwanp + - minouHub initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - Python - - Git + # Different technologies needed + - Python + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description -The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that makes it one of the fastest line-by-line spectral codes available. +The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that makes it one of the fastest line-by-line spectral codes available. Currently RADIS supports calculation of about every possible molecule, but assumes that it is diluted in air by default. It is possible to manually adjust it to replace air by one other diulter (for instance : compute CO diluted in CO2). The goal of the current project is to make it automatic, and extend it to multiple diluents (for instance: CO diluted in CO2 and H2O). @@ -36,42 +35,40 @@ No background in spectroscopy and collisional broadening is required, but the st #### Milestones - ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Training on emission & absorption spectroscopy, with a focus on collisional broadening. +- Training on emission & absorption spectroscopy, with a focus on collisional broadening. -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) ##### 1st evaluation -Learn the physics : +Learn the physics : -* With the help of the mentors, write a Tutorial notebook about collisional broadening and the effect of diluent (for instance using the existing implementation in the very good [HAPI](https://github.com/hitranonline/hapi) code) +- With the help of the mentors, write a Tutorial notebook about collisional broadening and the effect of diluent (for instance using the existing implementation in the very good [HAPI](https://github.com/hitranonline/hapi) code) -* Add tutorial to show how to manually replace the broadening coefficients in RADIS (with Pandas). +- Add tutorial to show how to manually replace the broadening coefficients in RADIS (with Pandas). -Implement : +Implement : -* write a method in [SpectrumFactory](https://github.com/radis/radis/blob/develop/radis/lbl/factory.py#L109) to set-up the dilution gas, and read the corresponding coefficients from the loaded database. +- write a method in [SpectrumFactory](https://github.com/radis/radis/blob/develop/radis/lbl/factory.py#L109) to set-up the dilution gas, and read the corresponding coefficients from the loaded database. -* Update the [pressure_broadening_HWMH](https://github.com/radis/radis/blob/develop/radis/lbl/broadening.py#L249) function to compute more than one diluent. +- Update the [pressure_broadening_HWMH](https://github.com/radis/radis/blob/develop/radis/lbl/broadening.py#L249) function to compute more than one diluent. ##### Final -Make it user friendly : - -* Add a `diluent` parameter in the high-level [calc_spectrum](https://github.com/radis/radis/blob/develop/radis/lbl/calc.py#L29) function +Make it user friendly : -* automatically retrieve non-air broadening coefficients from the HITRAN database and convert it to the RADIS database format (see [#213](https://github.com/radis/radis/issues/213) ). +- Add a `diluent` parameter in the high-level [calc_spectrum](https://github.com/radis/radis/blob/develop/radis/lbl/calc.py#L29) function -* Add a Gallery Example +- automatically retrieve non-air broadening coefficients from the HITRAN database and convert it to the RADIS database format (see [#213](https://github.com/radis/radis/issues/213) ). -* Have all code, tests and documentation in GitHub. +- Add a Gallery Example +- Have all code, tests and documentation in GitHub. ##### Secondary goals -* allow user to specify their own collisional broadening formula. +- allow user to specify their own collisional broadening formula. diff --git a/_projects/2021/radis/reduce_memory_usage.md b/src/content/pages/gsoc/2021/radis/reduce_memory_usage.md similarity index 56% rename from _projects/2021/radis/reduce_memory_usage.md rename to src/content/pages/gsoc/2021/radis/reduce_memory_usage.md index f29af32e..c386ebc0 100644 --- a/_projects/2021/radis/reduce_memory_usage.md +++ b/src/content/pages/gsoc/2021/radis/reduce_memory_usage.md @@ -3,59 +3,56 @@ name: Memory Usage desc: Reduce Memory usage in RADIS to be able to compute terabyte-scale databases # add a short one line description of your project requirements: -# Student requirements: - - Knowledge of Pandas or other DataFrame libraries + # Student requirements: + - Knowledge of Pandas or other DataFrame libraries difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis/issues/118 + # Related issues (if any) to this project. + - https://github.com/radis/radis/issues/118 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - erwanp - - dcmvdbekerom + # First person in contact; mentors may change before project starts. + # GitHub handles + - erwanp + - dcmvdbekerom initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - Python - - Git + # Different technologies needed + - Python + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description -The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. - -However, although the algorithm is very CPU/GPU efficient, the RADIS code is still memory-hungry. The first goal of the current project is to reduce the memory usage of current calculations. Then, it is to replace the current core with libraries better suited to process larger-than-memory-data, which would make it possible to compute spectral databases of up to billions of lines (hundred of GB or terabyte-scale). +The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. +However, although the algorithm is very CPU/GPU efficient, the RADIS code is still memory-hungry. The first goal of the current project is to reduce the memory usage of current calculations. Then, it is to replace the current core with libraries better suited to process larger-than-memory-data, which would make it possible to compute spectral databases of up to billions of lines (hundred of GB or terabyte-scale). #### Milestones ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Training on emission & absorption spectroscopy +- Training on emission & absorption spectroscopy -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) ##### 1st Evaluation -* Work on the current memory bottlenecks (#118) - -* Setup [memory-performance benchmark](https://github.com/radis/radis-benchmark/tree/master/manual_benchmarks) to track the changes +- Work on the current memory bottlenecks (#118) -* Merge the changes +- Setup [memory-performance benchmark](https://github.com/radis/radis-benchmark/tree/master/manual_benchmarks) to track the changes +- Merge the changes ##### Final -* Setup a proof-of-concept with Vaex / Dask or alternative libraries with lazy-loading features, to be able to compute larger-than-memory-databases (> tens of GB - terabyte-scale ) +- Setup a proof-of-concept with Vaex / Dask or alternative libraries with lazy-loading features, to be able to compute larger-than-memory-databases (> tens of GB - terabyte-scale ) -* Based on results, decide whether to integrate Vaex, Dask or alternative library in the code. +- Based on results, decide whether to integrate Vaex, Dask or alternative library in the code. -* Have all code, tests and documentation in GitHub. +- Have all code, tests and documentation in GitHub. diff --git a/_projects/2021/stingray/daveupdate.md b/src/content/pages/gsoc/2021/stingray/daveupdate.md similarity index 72% rename from _projects/2021/stingray/daveupdate.md rename to src/content/pages/gsoc/2021/stingray/daveupdate.md index 8a4c8a89..1deddeb2 100644 --- a/_projects/2021/stingray/daveupdate.md +++ b/src/content/pages/gsoc/2021/stingray/daveupdate.md @@ -2,53 +2,52 @@ name: Stingray GUI update desc: Update Stingray's GUI, DAVE, to use the most recent Javascript dependencies and Stingray API (including faster pulsar searches, faster processing, large data handling) and infrastructure (e.g. the modifications introduced by [APE 17](https://docs.astropy.org/projects/package-template/en/latest/ape17.html)) requirements: - - Good knowledge of Python and Javascript - - Knowledge of signal processing and Fourier methods would be ideal + - Good knowledge of Python and Javascript + - Knowledge of signal processing and Fourier methods would be ideal difficulty: medium issues: - - https://github.com/StingraySoftware/dave/pull/74 + - https://github.com/StingraySoftware/dave/pull/74 mentors: - - matteobachetti - - smigliari + - matteobachetti + - smigliari initiatives: - - GSOC + - GSOC tags: - - python - - signal processing - - time series analysis - - Fourier analysis - - astronomy - - javascript + - python + - signal processing + - time series analysis + - Fourier analysis + - astronomy + - javascript collaborating_projects: - - stingray + - stingray --- #### Description + Generating periodograms for astronomical data is the core task of Stingray. Because periodograms are often noisy, several methods to denoise periodograms exist in the literature, among them the multi-taper periodogram -Stingray aims to provide a comprehensive library of reliable, well-tested implementations of common algorithms for time series analysis in Astronomy. -DAVE is an elegant GUI to the library, developed during a previous GSoC. +Stingray aims to provide a comprehensive library of reliable, well-tested implementations of common algorithms for time series analysis in Astronomy. +DAVE is an elegant GUI to the library, developed during a previous GSoC. Due to the fast evolving Python and Javascript landscape, this GUI is not compatible with the current versions of the dependencies. Also, Stingray has now new features that were not implemented in the original GUI. In this project, the student will refresh the GUI dependencies, update the package building infrastructure, and add the new functionality introduced in recent versions of Stingray. - #### Milestones (if any) 1. Package build working again 2. New Stingray features introduced as proof-of-concept -2. Fully working interface - +3. Fully working interface ##### Coding starts -* Understand GUI functionality and have an overview of the individual components that need to be implemented. +- Understand GUI functionality and have an overview of the individual components that need to be implemented. ##### 1st evaluation -* Proof-of-concept implementation is complete (M1 and M2). +- Proof-of-concept implementation is complete (M1 and M2). ##### Final -* Full implementation is complete (M3) +- Full implementation is complete (M3) diff --git a/_projects/2021/stingray/modeling_improvements.md b/src/content/pages/gsoc/2021/stingray/modeling_improvements.md similarity index 69% rename from _projects/2021/stingray/modeling_improvements.md rename to src/content/pages/gsoc/2021/stingray/modeling_improvements.md index 8895c123..0993e627 100644 --- a/_projects/2021/stingray/modeling_improvements.md +++ b/src/content/pages/gsoc/2021/stingray/modeling_improvements.md @@ -1,34 +1,34 @@ --- name: Modern Statistical Modeling in Stingray. -desc: Make the statistical modeling infrastructure in stingray more robust by using algorithms and implementations developed for machine learning, such as TensorFlow Probability, PyMC3 and JAX. +desc: Make the statistical modeling infrastructure in stingray more robust by using algorithms and implementations developed for machine learning, such as TensorFlow Probability, PyMC3 and JAX. requirements: - - Proficiency in Python - - Knowledge of automatic differentiation or probabilistic programming helpful, but not essential + - Proficiency in Python + - Knowledge of automatic differentiation or probabilistic programming helpful, but not essential difficulty: medium issues: - - https://github.com/StingraySoftware/stingray/issues/520 + - https://github.com/StingraySoftware/stingray/issues/520 mentors: - - dhuppenkothen - - matteobachetti + - dhuppenkothen + - matteobachetti initiatives: - - GSOC + - GSOC tags: - - python - - signal processing - - time series analysis - - statistics - - Bayesian inference - - astronomy + - python + - signal processing + - time series analysis + - statistics + - Bayesian inference + - astronomy collaborating_projects: - - stingray + - stingray --- #### Description -Stingray aims to provide a comprehensive library of reliable, well-tested implementations of common algorithms for time series analysis in Astronomy. Often, the ultimate goal of a researcher is statistical inference of some properties of an astronomical object. While stingray currently has an infrastructure for parametric modelling of Fourier products and light curves (based primarily on numpy and scipy), the existing infrastructure and algorithms are relatively fragile and tend to fail often. -In this project, the student will add automatic differentiation and modern optimization algorithms to make the existing infrastructure more robust. In a second step, the student will extend the existing infrastructure to facilitate building fully probabilistic models in TensorFlow Probability or PyMC3. +Stingray aims to provide a comprehensive library of reliable, well-tested implementations of common algorithms for time series analysis in Astronomy. Often, the ultimate goal of a researcher is statistical inference of some properties of an astronomical object. While stingray currently has an infrastructure for parametric modelling of Fourier products and light curves (based primarily on numpy and scipy), the existing infrastructure and algorithms are relatively fragile and tend to fail often. +In this project, the student will add automatic differentiation and modern optimization algorithms to make the existing infrastructure more robust. In a second step, the student will extend the existing infrastructure to facilitate building fully probabilistic models in TensorFlow Probability or PyMC3. #### Milestones (if any) @@ -37,13 +37,13 @@ In this project, the student will add automatic differentiation and modern optim ##### Coding starts -* Understand basics of automatic differentiation and have an overview of the individual components that need to be implemented/modified. +- Understand basics of automatic differentiation and have an overview of the individual components that need to be implemented/modified. ##### 1st evaluation -* Implementation of automatic differentiation is complete.. +- Implementation of automatic differentiation is complete.. ##### Final -* Implementation of automatic differentiation in combination with a probabilistic model. -* Wrap up connecting the new implementation to existing Stingray classes, finish documentation and associated tutorial in a Jupyter notebook. +- Implementation of automatic differentiation in combination with a probabilistic model. +- Wrap up connecting the new implementation to existing Stingray classes, finish documentation and associated tutorial in a Jupyter notebook. diff --git a/_projects/2021/stingray/multitaper.md b/src/content/pages/gsoc/2021/stingray/multitaper.md similarity index 71% rename from _projects/2021/stingray/multitaper.md rename to src/content/pages/gsoc/2021/stingray/multitaper.md index aa76b336..f1520f67 100644 --- a/_projects/2021/stingray/multitaper.md +++ b/src/content/pages/gsoc/2021/stingray/multitaper.md @@ -2,47 +2,46 @@ name: Multitaper-Periodograms in Stingray. desc: Add a new algorithm for building periodograms to Stingray. The multitaper periodogram is a method that's fairly well-known in signal processing, but virtually unknown in (X-ray) astronomy. requirements: - - Proficiency in Python - - Knowledge of signal processing and Fourier methods would be ideal + - Proficiency in Python + - Knowledge of signal processing and Fourier methods would be ideal difficulty: medium issues: - - https://github.com/StingraySoftware/stingray/issues/361 + - https://github.com/StingraySoftware/stingray/issues/361 mentors: - - dhuppenkothen - - matteobachetti + - dhuppenkothen + - matteobachetti initiatives: - - GSOC + - GSOC tags: - - python - - signal processing - - time series analysis - - Fourier analysis - - astronomy + - python + - signal processing + - time series analysis + - Fourier analysis + - astronomy collaborating_projects: - - stingray + - stingray --- #### Description + Generating periodograms for astronomical data is the core task of Stingray. Because periodograms are often noisy, several methods to denoise periodograms exist in the literature, among them the multi-taper periodogram Stingray aims to provide a comprehensive library of reliable, well-tested implementations of common algorithms for time series analysis in Astronomy. In this project, the student will add the multi-taper periodogram to the existing code base in order to allow astronomers build periodograms with better noise properties. - #### Milestones (if any) 1. Proof-of-concept implementation of the multi-taper algorithm 2. Full implementation of the algorithm in the Stingray framework, including tests and relevant documentation - ##### Coding starts -* Understand algorithm and have an overview of the individual components that need to be implemented. +- Understand algorithm and have an overview of the individual components that need to be implemented. ##### 1st evaluation -* Proof-of-concept implementation is complete. +- Proof-of-concept implementation is complete. ##### Final -* Full implementation is complete -* Wrap up connecting the new implementation to existing Stingray classes, finish documentation and associated tutorial in a Jupyter notebook. +- Full implementation is complete +- Wrap up connecting the new implementation to existing Stingray classes, finish documentation and associated tutorial in a Jupyter notebook. diff --git a/_projects/2021/stingray/typing.md b/src/content/pages/gsoc/2021/stingray/typing.md similarity index 67% rename from _projects/2021/stingray/typing.md rename to src/content/pages/gsoc/2021/stingray/typing.md index e8fcae84..e77daee2 100644 --- a/_projects/2021/stingray/typing.md +++ b/src/content/pages/gsoc/2021/stingray/typing.md @@ -2,47 +2,46 @@ name: Use type hints in Stingray desc: Introduce and enforce type hints throughout the Stingray library requirements: - - Basic knowledge of Python - - Knowledge of signal processing and Fourier methods would be ideal + - Basic knowledge of Python + - Knowledge of signal processing and Fourier methods would be ideal difficulty: easy issues: - - https://github.com/StingraySoftware/stingray/issues/544 + - https://github.com/StingraySoftware/stingray/issues/544 mentors: - - matteobachetti - - dhuppenkothen + - matteobachetti + - dhuppenkothen initiatives: - - GSOC + - GSOC tags: - - python - - signal processing - - time series analysis - - Fourier analysis - - astronomy + - python + - signal processing + - time series analysis + - Fourier analysis + - astronomy collaborating_projects: - - stingray + - stingray --- #### Description + Generating periodograms for astronomical data is the core task of Stingray. Because periodograms are often noisy, several methods to denoise periodograms exist in the literature, among them the multi-taper periodogram -Stingray aims to provide a comprehensive library of reliable, well-tested implementations of common algorithms for time series analysis in Astronomy. +Stingray aims to provide a comprehensive library of reliable, well-tested implementations of common algorithms for time series analysis in Astronomy. In this project, the student will introduce type hints in the code, in order to make debugging easier and, possibly, use runtime checks to ensure the consistency of results. - #### Milestones (if any) 1. Introduction of type hints everywhere in the code 2. Thorough testing of the consistency of type hints in typical use cases - ##### Coding starts -* Understand the general structure of Stingray, the testing environment, the notebooks used to document the library +- Understand the general structure of Stingray, the testing environment, the notebooks used to document the library ##### 1st evaluation -* Type hints implementation is complete. +- Type hints implementation is complete. ##### Final -* Through tests through external libraries such as [enforce-typing](https://pypi.org/project/enforce-typing/). +- Through tests through external libraries such as [enforce-typing](https://pypi.org/project/enforce-typing/). diff --git a/_projects/2021/sunpy/3dplotting.md b/src/content/pages/gsoc/2021/sunpy/3dplotting.md similarity index 61% rename from _projects/2021/sunpy/3dplotting.md rename to src/content/pages/gsoc/2021/sunpy/3dplotting.md index 9852b587..84ef0314 100644 --- a/_projects/2021/sunpy/3dplotting.md +++ b/src/content/pages/gsoc/2021/sunpy/3dplotting.md @@ -3,37 +3,38 @@ name: 3D plotting desc: Provide 3D plotting capabilities to SunPy # add a short one line description of your project requirements: -# Student requirements: - - Familiarity with Python - - Familiarity with some plotting tools (e.g. Matplotlib) + # Student requirements: + - Familiarity with Python + - Familiarity with some plotting tools (e.g. Matplotlib) difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/sunpy/sunpy/pull/4591 + # Related issues (if any) to this project. + - https://github.com/sunpy/sunpy/pull/4591 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - dstansby - - Cadair - - nabobalis + # First person in contact; mentors may change before project starts. + # GitHub handles + - dstansby + - Cadair + - nabobalis initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - plotting - - 3D + # Different technologies needed + - python + - plotting + - 3D collaborating_projects: -# suborganisation(s) to which this project belongs. - - sunpy + # suborganization(s) to which this project belongs. + - sunpy --- + The SunPy ecosystem currently has well developed support for making 2D plots (primarily with Matplotlib), but currently no interface for making 3D plots. #### Description In this project the student will code new tools for taking common datasets used in the SunPy ecosystem (e.g. images of the Sun, maps of the Sun, magnetic field lines from models of the Sun), and plotting them in 3D. This will initially be done using the pyvista plotting toolkit, but we would like to make the tools general enough that other plotting toolkits (e.g. plotly) can be used too. -We have already trialled this, with some demo code at https://github.com/sunpy/sunpy/pull/4591. The goal of this project is to take this demo code, and put it in a new Python package to allow rapid development, independent of the sunpy core package. The work will be evenly split between writing new code, and learning how to write documentation and tests for the code within a package. +We have already trialled this, with some demo code at . The goal of this project is to take this demo code, and put it in a new Python package to allow rapid development, independent of the sunpy core package. The work will be evenly split between writing new code, and learning how to write documentation and tests for the code within a package. #### Milestones (if any) diff --git a/_projects/2021/sunpy/ndcube_resampling.md b/src/content/pages/gsoc/2021/sunpy/ndcube_resampling.md similarity index 67% rename from _projects/2021/sunpy/ndcube_resampling.md rename to src/content/pages/gsoc/2021/sunpy/ndcube_resampling.md index e4e72d18..cdd8fb72 100644 --- a/_projects/2021/sunpy/ndcube_resampling.md +++ b/src/content/pages/gsoc/2021/sunpy/ndcube_resampling.md @@ -3,40 +3,39 @@ name: Supporting Resampling in NDCube desc: Enable users to resample their data using NDCube. # add a short one line description of your project requirements: -# Student requirements: - - Knowledge on python + # Student requirements: + - Knowledge on python difficulty: hard issues: -# Related issues (if any) to this project. - - https://github.com/sunpy/ndcube/issues/155 + # Related issues (if any) to this project. + - https://github.com/sunpy/ndcube/issues/155 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - DanRyanIrish - - Cadair + # First person in contact; mentors may change before project starts. + # GitHub handles + - DanRyanIrish + - Cadair initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python + # Different technologies needed + - python collaborating_projects: -# suborganisation(s) to which this project belongs. - - sunpy + # suborganization(s) to which this project belongs. + - sunpy --- - #### Description This project will provide a new functionality to the ndcube package, -namely resampling data using the NDCube data class. The NDCube class +namely resampling data using the NDCube data class. The NDCube class enables users to manipulate and visualize n-dimensional astronomical data. NDCube's big advantage over arrays and other high-level data containers -is its support for functional coordinate transformations +is its support for functional coordinate transformations (World Coordinate System, or WCS) that enable users to easily track what real world coordinates their data values correspond to. For example, what point on the sky a pixel is pointing at. NDCube has made coupling astronomical data and coordinate systems far more -user-friendly. However the greatest outstanding functionality is +user-friendly. However the greatest outstanding functionality is NDCube's inability to resample its data onto a different pixel grid. This would have many potenital benefits to users. It would enable them to align data from different imagers onto the same @@ -48,7 +47,7 @@ the requirement of altering the WCS transformations. However, if users are able to resample their data with a single command and have their coordinate transformations automatically update accordingly, it would greatly speed up data analysis workflows and make such -analysis less prone to errors. +analysis less prone to errors. Therefore this project will be of great benefit to the wider astronomical community. @@ -56,14 +55,14 @@ community. ##### Coding starts -* Become familiar with ndcube and astropy WCS codebase. -* Begin work on a resampling framework +- Become familiar with ndcube and astropy WCS codebase. +- Begin work on a resampling framework ##### 1st evaluation -* Complete working draft prototype of resampling framework. -* Seek feedback from the ndcube-using community. +- Complete working draft prototype of resampling framework. +- Seek feedback from the ndcube-using community. ##### Final -* Release new version of ndcube including resampling capability +- Release new version of ndcube including resampling capability diff --git a/_projects/2021/sunpy/scraper.md b/src/content/pages/gsoc/2021/sunpy/scraper.md similarity index 63% rename from _projects/2021/sunpy/scraper.md rename to src/content/pages/gsoc/2021/sunpy/scraper.md index 591a6195..709dd4ee 100644 --- a/_projects/2021/sunpy/scraper.md +++ b/src/content/pages/gsoc/2021/sunpy/scraper.md @@ -3,30 +3,30 @@ name: Scraper rewrite desc: Improve the current scraper to download data # add a short one line description of your project requirements: -# Student requirements: - - Familiarity with Python - - Knowledge of Python regex - - Familiar with web protocols + # Student requirements: + - Familiarity with Python + - Knowledge of Python regex + - Familiar with web protocols difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/sunpy/sunpy/issues/4888 + # Related issues (if any) to this project. + - https://github.com/sunpy/sunpy/issues/4888 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - nabobalis - - samaloney - - hayesla - - dpshelio + # First person in contact; mentors may change before project starts. + # GitHub handles + - nabobalis + - samaloney + - hayesla + - dpshelio initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python - - web + # Different technologies needed + - python + - web collaborating_projects: -# suborganisation(s) to which this project belongs. - - sunpy + # suborganization(s) to which this project belongs. + - sunpy --- This project will provide the ability to parse URL information in a programmatic way. @@ -34,16 +34,15 @@ This project will provide the ability to parse URL information in a programmatic #### Description sunpy provides a way for users to access data using Fido and its many internal clients. -Many of these simpler clients do URL scraping to return metadata and data files to a user. +Many of these simpler clients do URL scraping to return metadata and data files to a user. -This scraping is done by the `scraper class `__. +This scraping is done by the `scraper class `\_\_. Over the years, the scale of what this class has to do has expanded to a point where it has become unmaintainable. -The goal of this project is to create a new scraper with a predefined API and class structure. +The goal of this project is to create a new scraper with a predefined API and class structure. Please be aware that this project is not a design project, the API and the scope of scrapper has been (link to come) predetermined and laid out by the GSoC mentors. So the primary focus of this project will be to write the class and its methods to follow this specification (obviously leaving the implementation details mainly up to you). - #### Milestones (if any) 1. Partial scraper written @@ -53,13 +52,13 @@ So the primary focus of this project will be to write the class and its methods ##### Coding starts -* Already have a development environment setup -* Understand the project and the API design. Having asked questions if you do not. +- Already have a development environment setup +- Understand the project and the API design. Having asked questions if you do not. ##### 1st evaluation -* Partial skeleton of scraper written. +- Partial skeleton of scraper written. ##### Final -* Functional replacement ready for review and merging into sunpy. +- Functional replacement ready for review and merging into sunpy. diff --git a/_projects/2021/sunpy/sunraster.md b/src/content/pages/gsoc/2021/sunpy/sunraster.md similarity index 64% rename from _projects/2021/sunpy/sunraster.md rename to src/content/pages/gsoc/2021/sunpy/sunraster.md index c183fd49..ff71b952 100644 --- a/_projects/2021/sunpy/sunraster.md +++ b/src/content/pages/gsoc/2021/sunpy/sunraster.md @@ -3,27 +3,27 @@ name: Update sunraster to ndcube 2.0 desc: Updates the sunraster code-base to use the powerful new version of ndcube. # add a short one line description of your project requirements: -# Student requirements: - - Knowledge of Python - - Ideally some familiarity with ndcube 2.0 and sunraster. + # Student requirements: + - Knowledge of Python + - Ideally some familiarity with ndcube 2.0 and sunraster. difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/sunpy/sunraster/issues/177 + # Related issues (if any) to this project. + - https://github.com/sunpy/sunraster/issues/177 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - DanRyanIrish - - Cadair - - nabobalis + # First person in contact; mentors may change before project starts. + # GitHub handles + - DanRyanIrish + - Cadair + - nabobalis initiatives: - - GSOC + - GSOC tags: -# Different technologies needed - - python + # Different technologies needed + - python collaborating_projects: -# suborganisation(s) to which this project belongs. - - sunpy + # suborganization(s) to which this project belongs. + - sunpy --- This project will update the sunraster package to use the ndcube 2.0, a much more powerful version and lead to the next release of the sunraster package. @@ -46,23 +46,22 @@ This API is not backwards compatible and so requires upgrades to the sunraster so users of solar spectrograph observations can more easily perform their data analysis. - #### Milestones (if any) -* sunraster code has been updated. -* sunraster tests all pass. -* sunraster has been released. +- sunraster code has been updated. +- sunraster tests all pass. +- sunraster has been released. ##### Coding starts -* Become familiar with ndcube and sunraster codebases. -* Create a test environment for sunraster that uses ndcube 2.0. -* List out parts of sunraster API that need updating. +- Become familiar with ndcube and sunraster codebases. +- Create a test environment for sunraster that uses ndcube 2.0. +- List out parts of sunraster API that need updating. ##### 1st evaluation -* Update sunraster code base to get all ndcube-2.0-base tests passing. +- Update sunraster code base to get all ndcube-2.0-base tests passing. ##### Final -* sunraster is ready to be released to users. +- sunraster is ready to be released to users. diff --git a/_projects/2022/gnuastro/astrometry_distortions.md b/src/content/pages/gsoc/2022/gnuastro/astrometry_distortions.md similarity index 57% rename from _projects/2022/gnuastro/astrometry_distortions.md rename to src/content/pages/gsoc/2022/gnuastro/astrometry_distortions.md index f69ee097..3241da60 100644 --- a/_projects/2022/gnuastro/astrometry_distortions.md +++ b/src/content/pages/gsoc/2022/gnuastro/astrometry_distortions.md @@ -3,34 +3,33 @@ name: Distortion coefficients in astrometry desc: Thanks to GSoC 2021 linear parameters can be found, we now need distortion. # add a short one line description of your project requirements: -# Student requirements: - - C programming language. - - GNU Scientific Library and FITS World Coordinate System (WCS) standrads. + # Student requirements: + - C programming language. + - GNU Scientific Library and FITS World Coordinate System (WCS) standrads. difficulty: medium issues: -# Related issues (if any) to this project. - - https://savannah.gnu.org/task/?15747 + # Related issues (if any) to this project. + - https://savannah.gnu.org/task/?15747 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - mohammad-akhlaghi + # First person in contact; mentors may change before project starts. + # GitHub handles + - mohammad-akhlaghi initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 175 h + - 175 h tags: -# Different technologies needed - - C - - Gnuastro - - WCSLIB - - GNU Scientific Library + # Different technologies needed + - C + - Gnuastro + - WCSLIB + - GNU Scientific Library collaborating_projects: -# suborganisation(s) to which this project belongs. - - Gnuastro + # suborganization(s) to which this project belongs. + - Gnuastro --- - #### Description Astrometry is a critical component in the processing of astronomical data. @@ -44,24 +43,24 @@ To get started, check [our GSoC 2022 checklist](https://savannah.gnu.org/support #### Milestones (if any) - * Completing [our GSoC 2022 checklist](https://savannah.gnu.org/support/index.php?110613#comment0) +- Completing [our GSoC 2022 checklist](https://savannah.gnu.org/support/index.php?110613#comment0) - * Learning basic concepts of Astrometry and existing functions. +- Learning basic concepts of Astrometry and existing functions. - * Fixing bugs in existing components. +- Fixing bugs in existing components. - * Adding the remaining high-level components to complete astrometry. +- Adding the remaining high-level components to complete astrometry. ##### Coding starts -* Actively start fixing/adding some minor bugs/tasks in Gnuastro to get a good feeling of the coding style and logic within Gnuastro (this can be independent of astrometry). +- Actively start fixing/adding some minor bugs/tasks in Gnuastro to get a good feeling of the coding style and logic within Gnuastro (this can be independent of astrometry). -* Study the basic concepts of Astrometry and learning/testing the existing low-level features that have already been written. +- Study the basic concepts of Astrometry and learning/testing the existing low-level features that have already been written. ##### 1st evaluation -* Adding tests to existing steps and start working on finding distortions. +- Adding tests to existing steps and start working on finding distortions. ##### Final evaluation -* Library and program for writing the full WCS (including distortions) in the FITS format. +- Library and program for writing the full WCS (including distortions) in the FITS format. diff --git a/_projects/2022/gnuastro/python_wrappers.md b/src/content/pages/gsoc/2022/gnuastro/python_wrappers.md similarity index 64% rename from _projects/2022/gnuastro/python_wrappers.md rename to src/content/pages/gsoc/2022/gnuastro/python_wrappers.md index 76afc682..88e7fdff 100644 --- a/_projects/2022/gnuastro/python_wrappers.md +++ b/src/content/pages/gsoc/2022/gnuastro/python_wrappers.md @@ -3,31 +3,30 @@ name: Gnuastro library in Python desc: Wrappers over the Gnuastro C library to allow usage in Python. # add a short one line description of your project requirements: -# Student requirements: - - Low-level Python and Numpy (their C library). + # Student requirements: + - Low-level Python and Numpy (their C library). difficulty: low issues: -# Related issues (if any) to this project. - - https://savannah.gnu.org/task/?13786 + # Related issues (if any) to this project. + - https://savannah.gnu.org/task/?13786 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - mohammad-akhlaghi + # First person in contact; mentors may change before project starts. + # GitHub handles + - mohammad-akhlaghi initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - python - - C + # Different technologies needed + - python + - C collaborating_projects: -# suborganisation(s) to which this project belongs. - - Gnuastro + # suborganization(s) to which this project belongs. + - Gnuastro --- - #### Description Gnuastro is primarily written in C because astronomical datasets are large and thus need to be efficient with few dependencies. @@ -45,26 +44,26 @@ To get started, check [our GSoC 2022 checklist](https://savannah.gnu.org/support #### Milestones (if any) - * Completing [our GSoC 2022 checklist](https://savannah.gnu.org/support/index.php?110613#comment0) +- Completing [our GSoC 2022 checklist](https://savannah.gnu.org/support/index.php?110613#comment0) - * Mastering the C interface of Python/Numpy and Gnuastro. +- Mastering the C interface of Python/Numpy and Gnuastro. - * Writing functions to convert Numpy's core data structure to Gnuastro's core data structure and vice-versa. +- Writing functions to convert Numpy's core data structure to Gnuastro's core data structure and vice-versa. - * Build and install the Python components as part of the Gnuastro's build. +- Build and install the Python components as part of the Gnuastro's build. ##### Coding starts -* Learning the numpy C interface and writing small test usages on some basic operations (not necessarily involving Gnuastro). +- Learning the numpy C interface and writing small test usages on some basic operations (not necessarily involving Gnuastro). -* Fixing small bugs in Gnuastro's library (as an excuse to learn the programming style and usage of Gnuastro's libraries). +- Fixing small bugs in Gnuastro's library (as an excuse to learn the programming style and usage of Gnuastro's libraries). ##### 1st evaluation -* Having a working converter between Numpy's data structure and Gnuastro's data structure. +- Having a working converter between Numpy's data structure and Gnuastro's data structure. ##### Final evaluation -* Adding wrappers to the core lower-level Gnuastro libraries. +- Adding wrappers to the core lower-level Gnuastro libraries. -* Writing tests and build/install steps of the Python wrappers in Gnuastro's build system. +- Writing tests and build/install steps of the Python wrappers in Gnuastro's build system. diff --git a/src/content/pages/gsoc/2022/index.md b/src/content/pages/gsoc/2022/index.md new file mode 100644 index 00000000..d190eaed --- /dev/null +++ b/src/content/pages/gsoc/2022/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2022" +show_main: false +season: 2022 +--- diff --git a/_projects/2022/juliaastro/stingray_porting.md b/src/content/pages/gsoc/2022/juliaastro/stingray_porting.md similarity index 58% rename from _projects/2022/juliaastro/stingray_porting.md rename to src/content/pages/gsoc/2022/juliaastro/stingray_porting.md index dcf86b13..bc87ebcc 100644 --- a/_projects/2022/juliaastro/stingray_porting.md +++ b/src/content/pages/gsoc/2022/juliaastro/stingray_porting.md @@ -3,60 +3,62 @@ name: Spectral timing in Julia desc: Create a set of timing and spectral timing methods in Julia. # add a short one line description of your project requirements: -# Student requirements: - - Understanding Python code - - Julia knowledge + # Student requirements: + - Understanding Python code + - Julia knowledge difficulty: medium issues: # Related issues (if any) to this project. mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - matteobachetti - - giordano + # First person in contact; mentors may change before project starts. + # GitHub handles + - matteobachetti + - giordano initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - python - - Julia - - time series analysis + # Different technologies needed + - python + - Julia + - time series analysis collaborating_projects: -# suborganisation(s) to which this project belongs. - - stingray - - juliaAstro + # suborganization(s) to which this project belongs. + - stingray + - juliaAstro --- + Spectral timing in Julia #### Description -The analysis of time series from astronomical observations in the X-rays is an + +The analysis of time series from astronomical observations in the X-rays is an excellent tool to test advanced physical theories. -Of particular interest are the periodicities that are often observed in the +Of particular interest are the periodicities that are often observed in the X-ray signals coming from the surroundings of accreting black holes, and the evolution of the rotation period of neutron stars. -The essential toolbox for X-ray timing analysis includes different kinds of +The essential toolbox for X-ray timing analysis includes different kinds of periodograms, cross spectra, and a number of "variability vs energy spectra", that allow to understand the variability at different energies. -This project is about the implementation of a basic set of X-ray timing analysis +This project is about the implementation of a basic set of X-ray timing analysis operations in Julia, starting from the porting of the core operations from the -`stingray` Python package. +`stingray` Python package. #### Milestones (if any) ##### Coding starts -* Implement a series of tests in Julia that the new code will have to pass -* Start the porting +- Implement a series of tests in Julia that the new code will have to pass +- Start the porting ##### 1st evaluation -* Basic operations (periodograms and cross spectra) implemented for at least +- Basic operations (periodograms and cross spectra) implemented for at least one kind of input data ##### Final evaluation -* Properly tested periodogram, cross spectra, time lags, and coherence -* Optional: a working framework for variability vs energy spectra +- Properly tested periodogram, cross spectra, time lags, and coherence +- Optional: a working framework for variability vs energy spectra diff --git a/_projects/2022/radis/atmosphere_interface.md b/src/content/pages/gsoc/2022/radis/atmosphere_interface.md similarity index 56% rename from _projects/2022/radis/atmosphere_interface.md rename to src/content/pages/gsoc/2022/radis/atmosphere_interface.md index 88e5a8d3..0a8827b8 100644 --- a/_projects/2022/radis/atmosphere_interface.md +++ b/src/content/pages/gsoc/2022/radis/atmosphere_interface.md @@ -3,33 +3,32 @@ name: Atmosphere Calculations desc: Model atmospheres in the RADIS spectral code with a simplified frontend and more line databases # add a short one line description of your project requirements: -# Student requirements: - - Familiar with radiative transfer equations + # Student requirements: + - Familiar with radiative transfer equations difficulty: easy issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis/issues/34 - - https://github.com/radis/radis/issues/189 + # Related issues (if any) to this project. + - https://github.com/radis/radis/issues/34 + - https://github.com/radis/radis/issues/189 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - anandxkumar - - gagan-aryan - - erwanp + # First person in contact; mentors may change before project starts. + # GitHub handles + - anandxkumar + - gagan-aryan + - erwanp initiatives: - - GSOC + - GSOC project_size: - - 175 h + - 175 h tags: -# Different technologies needed - - Python - - Git + # Different technologies needed + - Python + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. This performance makes it very suitable to compute high-temperature atmospheres. @@ -40,40 +39,36 @@ The goal of this project is to simplify the user interface to compute atmosphere - make RADIS compatible with more line databases (ExoMol, GEISA, etc) -- if interested in the radiative transfer-physics, add a plane-parallel model for multiple-layers-atmospheres - +- if interested in the radiative transfer-physics, add a plane-parallel model for multiple-layers-atmospheres #### Milestones - ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Training on emission & absorption spectroscopy +- Training on emission & absorption spectroscopy -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) -* Get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) : in particular, review the interface change to calculate multiple molecules at the same time ([#74](https://github.com/radis/radis/pull/74)) +- Get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) : in particular, review the interface change to calculate multiple molecules at the same time ([#74](https://github.com/radis/radis/pull/74)) ##### 1st evaluation -* Write interface to read standard atmosphere input files (mole fractions, temperature profile, pressure profile) +- Write interface to read standard atmosphere input files (mole fractions, temperature profile, pressure profile) -* Add a detailed Notebook example in the documentation - -* Add integration to more line databases, like ExoMol or GEISA ([#34](https://github.com/radis/radis/issues/34)) +- Add a detailed Notebook example in the documentation +- Add integration to more line databases, like ExoMol or GEISA ([#34](https://github.com/radis/radis/issues/34)) ##### Final evaluation -* Improve how these databases are downloaded automatically and converted to RADIS standard format (see [#210](https://github.com/radis/radis/issues/210)) - -* Add a Gallery Example in RADIS documentation +- Improve how these databases are downloaded automatically and converted to RADIS standard format (see [#210](https://github.com/radis/radis/issues/210)) -* Have all code, tests and documentation in GitHub. +- Add a Gallery Example in RADIS documentation +- Have all code, tests and documentation in GitHub. ##### Secondary Goals -* If the student is interested in the radiative-transfer physics, set-up a plane-parallel model to compute multiple-layers atmospheres ([#189](https://github.com/radis/radis/issues/189)) \ No newline at end of file +- If the student is interested in the radiative-transfer physics, set-up a plane-parallel model to compute multiple-layers atmospheres ([#189](https://github.com/radis/radis/issues/189)) diff --git a/_projects/2022/radis/non_air_diluent.md b/src/content/pages/gsoc/2022/radis/non_air_diluent.md similarity index 62% rename from _projects/2022/radis/non_air_diluent.md rename to src/content/pages/gsoc/2022/radis/non_air_diluent.md index ea49e5ca..1ff15b35 100644 --- a/_projects/2022/radis/non_air_diluent.md +++ b/src/content/pages/gsoc/2022/radis/non_air_diluent.md @@ -3,37 +3,36 @@ name: Non-air diluent desc: Add non-air diluent and custom collisional broadening in RADIS spectra # add a short one line description of your project requirements: -# Student requirements: - - Familiar with pandas + # Student requirements: + - Familiar with pandas difficulty: hard issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis/issues/213 + # Related issues (if any) to this project. + - https://github.com/radis/radis/issues/213 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - erwanp - - minouHub - - gagan-aryan - - anandxkumar + # First person in contact; mentors may change before project starts. + # GitHub handles + - erwanp + - minouHub + - gagan-aryan + - anandxkumar initiatives: - - GSOC + - GSOC project_size: - - 175 h - - 350 h + - 175 h + - 350 h tags: -# Different technologies needed - - Python - - Git + # Different technologies needed + - Python + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description -The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that makes it one of the fastest line-by-line spectral codes available. +The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that makes it one of the fastest line-by-line spectral codes available. Currently RADIS supports calculation of about every possible molecule, but assumes that it is diluted in air by default. It is possible to manually adjust it to replace air by one other diulter (for instance : compute CO diluted in CO2). The goal of the current project is to make it automatic, and extend it to multiple diluents (for instance: CO diluted in CO2 and H2O). @@ -41,42 +40,40 @@ No background in spectroscopy and collisional broadening is required, but the st #### Milestones - ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Training on emission & absorption spectroscopy, with a focus on collisional broadening. +- Training on emission & absorption spectroscopy, with a focus on collisional broadening. -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) ##### 1st evaluation -Learn the physics : +Learn the physics : -* With the help of the mentors, write a Tutorial notebook about collisional broadening and the effect of diluent (for instance using the existing implementation in the very good [HAPI](https://github.com/hitranonline/hapi) code) +- With the help of the mentors, write a Tutorial notebook about collisional broadening and the effect of diluent (for instance using the existing implementation in the very good [HAPI](https://github.com/hitranonline/hapi) code) -* Add tutorial to show how to manually replace the broadening coefficients in RADIS (with Pandas) +- Add tutorial to show how to manually replace the broadening coefficients in RADIS (with Pandas) -Implement : +Implement : -* write a method in [SpectrumFactory](https://github.com/radis/radis/blob/develop/radis/lbl/factory.py#L109) to set-up the dilution gas, and read the corresponding coefficients from the loaded database +- write a method in [SpectrumFactory](https://github.com/radis/radis/blob/develop/radis/lbl/factory.py#L109) to set-up the dilution gas, and read the corresponding coefficients from the loaded database -* Update the [pressure_broadening_HWMH](https://github.com/radis/radis/blob/develop/radis/lbl/broadening.py#L249) function to compute more than one diluent +- Update the [pressure_broadening_HWMH](https://github.com/radis/radis/blob/develop/radis/lbl/broadening.py#L249) function to compute more than one diluent ##### Final evaluation -Make it user friendly : - -* Add a `diluent` parameter in the high-level [calc_spectrum](https://github.com/radis/radis/blob/develop/radis/lbl/calc.py#L29) function +Make it user friendly : -* automatically retrieve non-air broadening coefficients from the HITRAN database and convert it to the RADIS database format (see [#213](https://github.com/radis/radis/issues/213) ) +- Add a `diluent` parameter in the high-level [calc_spectrum](https://github.com/radis/radis/blob/develop/radis/lbl/calc.py#L29) function -* Add a Gallery Example +- automatically retrieve non-air broadening coefficients from the HITRAN database and convert it to the RADIS database format (see [#213](https://github.com/radis/radis/issues/213) ) -* Have all code, tests and documentation in GitHub +- Add a Gallery Example +- Have all code, tests and documentation in GitHub ##### Secondary Goals -* allow user to specify their own collisional broadening formula +- allow user to specify their own collisional broadening formula diff --git a/src/content/pages/gsoc/2022/radis/performance_tweaks.md b/src/content/pages/gsoc/2022/radis/performance_tweaks.md new file mode 100644 index 00000000..ed3a1b82 --- /dev/null +++ b/src/content/pages/gsoc/2022/radis/performance_tweaks.md @@ -0,0 +1,73 @@ +--- +name: Performance Tweaks for RADIS +desc: Reduce Memory usage and improve performance in RADIS to be able to compute terabyte-scale databases +# add a short one line description of your project +requirements: + # Student requirements: + - Knowledge of Pandas or other DataFrame libraries + - Prior working knowledge with big data handling databases like Vaex +difficulty: medium +issues: + # Related issues (if any) to this project. + - https://github.com/radis/radis/issues/118 + - https://github.com/radis/radis/issues/176 +mentors: + # First person in contact; mentors may change before project starts. + # GitHub handles + - gagan-aryan + - anandxkumar + - erwanp +initiatives: + - GSOC +project_size: + - 175 h +tags: + # Different technologies needed + - Python + - Vaex + - Pandas + - Git +collaborating_projects: + # suborganization(s) to which this project belongs. + - radis +--- + +#### Description + +The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. + +However, although the algorithm is very CPU/GPU efficient, the RADIS code is still memory-hungry. The first goal of the current project is to reduce the memory usage of current calculations. Then, it is to replace the current core with libraries better suited to process larger-than-memory-data, which would make it possible to compute spectral databases of up to billions of lines (hundred of GB or terabyte-scale). + +#### Milestones + +##### Coding starts + +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) + +- Training on emission & absorption spectroscopy + +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) + +##### 1st Evaluation + +- Work on the existing [memory bottlenecks](https://github.com/radis/radis/issues/118) + +- Work on [crunching datatypes](https://github.com/radis/radis-benchmark/pull/11) of various columns to optimise dataframe memory usage + +- Setup [memory-performance benchmark](https://github.com/radis/radis-benchmark/tree/master/manual_benchmarks) to track the changes + +- Automatically [cache non equilibrium parameters](https://github.com/radis/radis/issues/176) to line database cache + +- Merge the changes + +##### Final evaluation + +- Write the Proof-Of-Concept to do out of the core calculations i.e., use Vaex for computations instead of pandas. + +- Merge the idea of the Proof-Of-Concept to the codebase. + +- Add [automatic linestrength cutoff](https://github.com/radis/radis/issues/268) + +- Add [.h5 loading benchmark](https://github.com/radis/radis-benchmark/issues/4) + +- Have all code, tests and documentation in GitHub diff --git a/_projects/2022/radis/radis_app_improvement.md b/src/content/pages/gsoc/2022/radis/radis_app_improvement.md similarity index 52% rename from _projects/2022/radis/radis_app_improvement.md rename to src/content/pages/gsoc/2022/radis/radis_app_improvement.md index d6fe1371..cde2ed3a 100644 --- a/_projects/2022/radis/radis_app_improvement.md +++ b/src/content/pages/gsoc/2022/radis/radis_app_improvement.md @@ -3,80 +3,75 @@ name: Radis App Improvement desc: Improve the current Radis Web App involving various features enhancement and bugs fixes # add a short one line description of your project requirements: -# Student requirements: - - Familiar with typescript and python + # Student requirements: + - Familiar with typescript and python difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/suzil/radis-app/issues/147 - - https://github.com/suzil/radis-app/issues/527 - - https://github.com/suzil/radis-app/issues/211 + # Related issues (if any) to this project. + - https://github.com/suzil/radis-app/issues/147 + - https://github.com/suzil/radis-app/issues/527 + - https://github.com/suzil/radis-app/issues/211 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - anandxkumar - - gagan-aryan - - erwanp - - suzil + # First person in contact; mentors may change before project starts. + # GitHub handles + - anandxkumar + - gagan-aryan + - erwanp + - suzil initiatives: - - GSOC + - GSOC project_size: - - 175 h - - 350 h + - 175 h + - 350 h tags: -# Different technologies needed - - TypeScript - - Python - - HTML/CSS - - Git + # Different technologies needed + - TypeScript + - Python + - HTML/CSS + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description -RADIS app is a web app for high-resolution infrared molecular spectra using RADIS. The goal of this project is to provide an easy-to-use UI instead of writing code. Currently, the [RADIS app](https://www.radis.app/) has a simple interface with basic functionalities that helps create a nice spectral graph using certain parameters but there is a lot of scope for improvements. - -The goal of this project is to create a more responsive app while improving and implementing new features and fixing various issues. +RADIS app is a web app for high-resolution infrared molecular spectra using RADIS. The goal of this project is to provide an easy-to-use UI instead of writing code. Currently, the [RADIS app](https://www.radis.app/) has a simple interface with basic functionalities that helps create a nice spectral graph using certain parameters but there is a lot of scope for improvements. +The goal of this project is to create a more responsive app while improving and implementing new features and fixing various issues. #### Milestones - ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Training on emission & absorption spectroscopy +- Training on emission & absorption spectroscopy -* Have set up a development environment for both [RADIS app](https://github.com/suzil/radis-app) and [RADIS](https://github.com/radis/radis), be familiar with open-source tools (GitHub / Git / Tests) +- Have set up a development environment for both [RADIS app](https://github.com/suzil/radis-app) and [RADIS](https://github.com/radis/radis), be familiar with open-source tools (GitHub / Git / Tests) -* Get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) and [RADIS app Architecture](https://github.com/suzil/radis-app#architecture) +- Get familiar with [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) and [RADIS app Architecture](https://github.com/suzil/radis-app#architecture) ##### 1st evaluation -* Add an option to change the units of [spectral range](https://github.com/suzil/radis-app/issues/147) on the go, and generate an output similar to [Link](https://github.com/suzil/radis-app/issues/147#issuecomment-1072872386) +- Add an option to change the units of [spectral range](https://github.com/suzil/radis-app/issues/147) on the go, and generate an output similar to the [example output](https://github.com/suzil/radis-app/issues/147#issuecomment-1072872386) -* Add an advance tab option to add more parameters like `medium`, `wstep`, `optimization`, `truncation`, `broadening_method`, etc to add more command to the users and make the calculations more transparent by displaying important parameters using [hover tooltips](https://github.com/suzil/radis-app/issues/184) - -* Migrate from native React to [react-hook-form](https://github.com/suzil/radis-app/issues/347) or any other library to simplify the codebase +- Add an advance tab option to add more parameters like `medium`, `wstep`, `optimization`, `truncation`, `broadening_method`, etc to add more command to the users and make the calculations more transparent by displaying important parameters using [hover tooltips](https://github.com/suzil/radis-app/issues/184) +- Migrate from native React to [react-hook-form](https://github.com/suzil/radis-app/issues/347) or any other library to simplify the codebase ##### Final evaluation -* [Cache Hitran dataset](https://github.com/suzil/radis-app/issues/527) to remove download time to generate spectrum of any new molecule and possibly add Hitemp dataset also (molecules can be hardcoded). Data may be to attach to a persistent network file system like Amazon EFS or on a more available database like DynamoDB - -* Add ability to download `.spec` file for the spectrum generated and add an option to upload `.spec` file to the load spectrum +- [Cache Hitran dataset](https://github.com/suzil/radis-app/issues/527) to remove download time to generate spectrum of any new molecule and possibly add Hitemp dataset also (molecules can be hardcoded). Data may be to attach to a persistent network file system like Amazon EFS or on a more available database like DynamoDB -* Create a detailed documentation of architecture and workflow of RADIS app +- Add ability to download `.spec` file for the spectrum generated and add an option to upload `.spec` file to the load spectrum -* Have all code, tests and documentation in GitHub +- Create a detailed documentation of architecture and workflow of RADIS app +- Have all code, tests and documentation in GitHub ##### Secondary Goals -* Upload your experimental spectrum and be able to fit it (to infer temperature or species) +- Upload your experimental spectrum and be able to fit it (to infer temperature or species) -* Add a counter to track the use of app (for eg- how many spectrums are generated over time) \ No newline at end of file +- Add a counter to track the use of app (for eg- how many spectrums are generated over time) diff --git a/_projects/2022/radis/spectrum_fitting.md b/src/content/pages/gsoc/2022/radis/spectrum_fitting.md similarity index 53% rename from _projects/2022/radis/spectrum_fitting.md rename to src/content/pages/gsoc/2022/radis/spectrum_fitting.md index 4464eb01..69f11c8b 100644 --- a/_projects/2022/radis/spectrum_fitting.md +++ b/src/content/pages/gsoc/2022/radis/spectrum_fitting.md @@ -3,66 +3,62 @@ name: Spectrum Fitting desc: Build a function to automatically fit an experimental spectrum with the output of RADIS, with the best performance possible # add a short one line description of your project requirements: -# Student requirements: - - Familiar with python + # Student requirements: + - Familiar with python difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/radis/radis/issues/377 + # Related issues (if any) to this project. + - https://github.com/radis/radis/issues/377 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - anandxkumar - - gagan-aryan - - erwanp - - minouHub + # First person in contact; mentors may change before project starts. + # GitHub handles + - anandxkumar + - gagan-aryan + - erwanp + - minouHub initiatives: - - GSOC + - GSOC project_size: - - 175 h - - 350 h + - 175 h + - 350 h tags: -# Different technologies needed - - Python - - Git + # Different technologies needed + - Python + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description +The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. -The RADIS code was developed to characterize the radiation of plasmas, flames and atmospheres. It calculates high-temperature infrared spectra from databases of tens of millions of lines, with a new algorithm that already makes it one of the fastest line-by-line spectral codes available. - -An experimental spectrum is compared to calculated spectra until a good match is obtained : then, the experimental temperature is known. -The efficiency of the fitting process depends on the RADIS calculation times as well as the fitting algorithm used. - -The goal of this project is to compare and improve fitting algorithms to reduce the fitting time. +An experimental spectrum is compared to calculated spectra until a good match is obtained : then, the experimental temperature is known. +The efficiency of the fitting process depends on the RADIS calculation times as well as the fitting algorithm used. +The goal of this project is to compare and improve fitting algorithms to reduce the fitting time. #### Milestones - ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Training on emission & absorption spectroscopy +- Training on emission & absorption spectroscopy -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) ##### 1st evaluation -* Build many reference cases for fitting, under various conditions (narrow spectra, large spectra, one parameter, multiple parameters, etc.) +- Build many reference cases for fitting, under various conditions (narrow spectra, large spectra, one parameter, multiple parameters, etc.) -* Select the best fitting algorithm to improve performances +- Select the best fitting algorithm to improve performances ##### Final evaluation -* Use RADIS's special features (such as caching spectra & creating databases) to improve fitting times further +- Use RADIS's special features (such as caching spectra & creating databases) to improve fitting times further -* Create a detailed documentation of architecture and workflow of the fitting process +- Create a detailed documentation of architecture and workflow of the fitting process -* Have all code, tests and documentation in GitHub \ No newline at end of file +- Have all code, tests and documentation in GitHub diff --git a/_projects/2022/stingray/bexvar.md b/src/content/pages/gsoc/2022/stingray/bexvar.md similarity index 61% rename from _projects/2022/stingray/bexvar.md rename to src/content/pages/gsoc/2022/stingray/bexvar.md index 77a26326..7c5248a2 100644 --- a/_projects/2022/stingray/bexvar.md +++ b/src/content/pages/gsoc/2022/stingray/bexvar.md @@ -3,45 +3,46 @@ name: Bexvar in Stingray desc: Implement the Bayesian Excess variance in Stingray # add a short one line description of your project requirements: -# Contributor requirements: - - Knowledge of Python - - Familiar with time series methods + # Contributor requirements: + - Knowledge of Python + - Familiar with time series methods difficulty: medium issues: -# Related issues (if any) to this project. - - https://github.com/StingraySoftware/stingray/issues/582 + # Related issues (if any) to this project. + - https://github.com/StingraySoftware/stingray/issues/582 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - matteobachetti - - dhuppenkothen + # First person in contact; mentors may change before project starts. + # GitHub handles + - matteobachetti + - dhuppenkothen initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - python + # Different technologies needed + - python collaborating_projects: -# suborganisation(s) to which this project belongs. - - stingray + # suborganization(s) to which this project belongs. + - stingray --- + Bayesian Excess Variance (bexvar) in Stingray #### Description -The Bayesian Excess Variance is a statistical measurement of variability +The Bayesian Excess Variance is a statistical measurement of variability in Poisson-distributed (e.g. X-ray or gamma-ray) data. -The time series from most astronomical facilities, and in particular from -low-Earth orbit satellites, can only be recorded when the source is visible, -most of all when it is not below the horizon (or in "Earth occultation" in the +The time series from most astronomical facilities, and in particular from +low-Earth orbit satellites, can only be recorded when the source is visible, +most of all when it is not below the horizon (or in "Earth occultation" in the case of satellites). The missing data from the occultation periods can result in spurious variability if not properly accounted for. -Another possible source of spurious variability is the presence of variable +Another possible source of spurious variability is the presence of variable background signals. -The Bayesian Excess Variance method is suitable for finding variability in +The Bayesian Excess Variance method is suitable for finding variability in gappy X-ray light curves with variable background. The contributor will work to implement this method in Stingray, a Python library for the analysis of astronomical time series. @@ -51,13 +52,13 @@ See [Buchner et al. 2021](https://arxiv.org/abs/2106.14529) ##### Coding starts -* Take confidence with the Stingray infrastructure. -* Creation of test cases for the Bexvar method, based on real observations. +- Take confidence with the Stingray infrastructure. +- Creation of test cases for the Bexvar method, based on real observations. ##### 1st evaluation -* Draft implementation of bexvar +- Draft implementation of bexvar ##### Final evaluation -* Polished implementation, working tests, documentation +- Polished implementation, working tests, documentation diff --git a/src/content/pages/gsoc/2022/stingray/type_hints_stingray.md b/src/content/pages/gsoc/2022/stingray/type_hints_stingray.md new file mode 100644 index 00000000..e9d39da0 --- /dev/null +++ b/src/content/pages/gsoc/2022/stingray/type_hints_stingray.md @@ -0,0 +1,53 @@ +--- +name: Type hints in Stingray +desc: Using type hints throughout the Stingray library +# add a short one line description of your project +requirements: + # Student requirements: + - Knowledge of Python +difficulty: easy +issues: + # Related issues (if any) to this project. + - https://github.com/StingraySoftware/stingray/issues/544 +mentors: + # First person in contact; mentors may change before project starts. + # GitHub handles + - matteobachetti + - dhuppenkothen +initiatives: + # The programme under this project wish to run. + - GSOC +project_size: + - 175 h +tags: + # Different technologies needed + - python +collaborating_projects: + # suborganization(s) to which this project belongs. + - stingray +--- + +Implementing type hints in the Stingray library + +#### Description + +Despite being and remaining a dynamically-typed language, Python has +now a [working infrastructure for type hints](https://www.python.org/dev/peps/pep-0484/). +For a data analysis library, type hinting can be very useful to avoid explicit testing +for data types and to facilitate debugging. + +#### Milestones (if any) + +##### Coding starts + +- Take confidence with the Stingray infrastructure. +- Start implementing type hints in the core modules of Stingray + +##### 1st evaluation + +- Create tests to enforce type checking in selected methods +- Extend the type hints infrastructure to most of the code base + +##### Final evaluation + +- Finish up, polish, and document properly diff --git a/_projects/2022/sunpy/database.md b/src/content/pages/gsoc/2022/sunpy/database.md similarity index 77% rename from _projects/2022/sunpy/database.md rename to src/content/pages/gsoc/2022/sunpy/database.md index a79ac05b..8ff8ea1d 100644 --- a/_projects/2022/sunpy/database.md +++ b/src/content/pages/gsoc/2022/sunpy/database.md @@ -2,24 +2,24 @@ name: Database as a data client desc: Creating a new database module requirements: - - Familiarity with Python - - Familiarity with SQLAlchemy + - Familiarity with Python + - Familiarity with SQLAlchemy difficulty: high issues: -- https://github.com/sunpy/sunpy/issues/5880 + - https://github.com/sunpy/sunpy/issues/5880 mentors: - - cadair - - wtbarnes - - nabobalis + - cadair + - wtbarnes + - nabobalis initiatives: - - GSOC + - GSOC project_size: - - 350 h + - 350 h tags: - - python + - python collaborating_projects: - - sunpy - - parfive + - sunpy + - parfive --- #### Description @@ -31,6 +31,7 @@ Over the years, this module has seen little development and has not been linked For an overview of the current database, you can read [our user guide to acquire data](https://docs.sunpy.org/en/stable/guide/acquiring_data/database.html) and [our tour introduction to the database](https://docs.sunpy.org/en/stable/guide/tour.html#database-package). The project has several aims: + - A creation of a new sub-package, `sunpy.net.database`. - When a user does a data search and download, the search and file information will be saved to a local database. - The user can then do the same search and will be informed that the files already exist locally avoiding doing the original download again. @@ -44,16 +45,16 @@ More technical details can be found on the linked issue. ##### Coding starts -* Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment. -* Familiar with the database module +- Engaged with the community and understand the motivation and challenges of the project. +- Have set up a development environment. +- Familiar with the database module ##### 1st evaluation -* Working prototype of a database "client" -* Have all code, tests and documentation in GitHub. +- Working prototype of a database "client" +- Have all code, tests and documentation in GitHub. ##### Final evaluation -* Finished database "client" -* Have all code, tests and documentation in GitHub. +- Finished database "client" +- Have all code, tests and documentation in GitHub. diff --git a/_projects/2022/sunpy/helioviewer.md b/src/content/pages/gsoc/2022/sunpy/helioviewer.md similarity index 69% rename from _projects/2022/sunpy/helioviewer.md rename to src/content/pages/gsoc/2022/sunpy/helioviewer.md index 6f0f815a..5e0c45d1 100644 --- a/_projects/2022/sunpy/helioviewer.md +++ b/src/content/pages/gsoc/2022/sunpy/helioviewer.md @@ -2,25 +2,25 @@ name: HelioViewer Python API Wrapper desc: Creating a full Python wrapper for the Unirest Helioviewer API requirements: - - Familiarity with Python - - Some familiarity with Unirest/HTTP requests (ideally) + - Familiarity with Python + - Some familiarity with Unirest/HTTP requests (ideally) difficulty: medium issues: - - https://github.com/sunpy/sunpy/issues/2860 - - https://github.com/sunpy/sunpy/issues/2762 - - https://github.com/sunpy/sunpy/issues/2878 + - https://github.com/sunpy/sunpy/issues/2860 + - https://github.com/sunpy/sunpy/issues/2762 + - https://github.com/sunpy/sunpy/issues/2878 mentors: - - wafels - - nabobalis - - dgarciabriseno + - wafels + - nabobalis + - dgarciabriseno initiatives: - - GSOC + - GSOC project_size: - - 175 h + - 175 h tags: - - python + - python collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -43,17 +43,17 @@ Finally, we will then create a new client that interfaces with the `sunpy` downl ##### Coding starts -* Engaged with the community and understand the motivation and challenges of the project. -* Have set up a development environment. -* Helped to setup the new package. +- Engaged with the community and understand the motivation and challenges of the project. +- Have set up a development environment. +- Helped to setup the new package. ##### 1st evaluation -* Have 45% of the Helioviewer API wrapped. -* Have all code, tests and documentation in GitHub. +- Have 45% of the Helioviewer API wrapped. +- Have all code, tests and documentation in GitHub. ##### Final evaluation -* All of the Helioviewer API is wrapped within the package. -* Fido Client created for Helioviewer. -* Have all code, tests and documentation in GitHub. +- All of the Helioviewer API is wrapped within the package. +- Fido Client created for Helioviewer. +- Have all code, tests and documentation in GitHub. diff --git a/_projects/2022/sunpy/scraper.md b/src/content/pages/gsoc/2022/sunpy/scraper.md similarity index 76% rename from _projects/2022/sunpy/scraper.md rename to src/content/pages/gsoc/2022/sunpy/scraper.md index 26ac4529..0bc30e8c 100644 --- a/_projects/2022/sunpy/scraper.md +++ b/src/content/pages/gsoc/2022/sunpy/scraper.md @@ -2,25 +2,25 @@ name: Scraper rewrite desc: Improve the current scraper to download data requirements: - - Familiarity with Python - - Knowledge of Python regex - - Familiar with web protocols + - Familiarity with Python + - Knowledge of Python regex + - Familiar with web protocols difficulty: medium issues: - - https://github.com/sunpy/sunpy/issues/4888 + - https://github.com/sunpy/sunpy/issues/4888 mentors: - - nabobalis - - samaloney - - hayesla + - nabobalis + - samaloney + - hayesla initiatives: - - GSOC + - GSOC project_size: - - 175 h + - 175 h tags: - - python - - web + - python + - web collaborating_projects: - - sunpy + - sunpy --- This project will provide the ability to parse URL information in a programmatic way. @@ -48,13 +48,13 @@ There are more technical details on the linked issue. ##### Coding starts -* Already have a development environment setup -* Understand the project and the API design. Having asked questions if you do not. +- Already have a development environment setup +- Understand the project and the API design. Having asked questions if you do not. ##### 1st evaluation -* Partial skeleton of scraper written. +- Partial skeleton of scraper written. ##### Final evaluation -* Functional replacement ready for review and merging into sunpy. +- Functional replacement ready for review and merging into sunpy. diff --git a/_projects/2022/sunpy/theme.md b/src/content/pages/gsoc/2022/sunpy/theme.md similarity index 64% rename from _projects/2022/sunpy/theme.md rename to src/content/pages/gsoc/2022/sunpy/theme.md index dd3bb311..01797c6b 100644 --- a/_projects/2022/sunpy/theme.md +++ b/src/content/pages/gsoc/2022/sunpy/theme.md @@ -2,25 +2,25 @@ name: SunPy Website and Theme Rewrite desc: Replace the sphinx base theme with a newer version. requirements: - - Experience with Sphinx and themes ideally. - - Experience with Jinja templates ideally. + - Experience with Sphinx and themes ideally. + - Experience with Jinja templates ideally. difficulty: high issues: - - https://github.com/sunpy/sunpy-sphinx-theme/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc + - https://github.com/sunpy/sunpy-sphinx-theme/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc mentors: - - cadair - - nabobalis + - cadair + - nabobalis initiatives: - - GSOC + - GSOC project_size: - - 175 h - - 350 h + - 175 h + - 350 h tags: - - sunpy - - sphinx - - web + - sunpy + - sphinx + - web collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -31,11 +31,11 @@ This theme is based upon [Sphinx Bootstrap theme](https://github.com/ryan-roemer The main aim is to move our theme to use a new [Pydata's base theme](https://pydata-sphinx-theme.readthedocs.io/en/latest/). This gives us a new layout and more modern bootstrap versions. The issue is that the way we have been using our theme has a few incompatibilities that either need patching to the pydata theme or overridden in our version. - -1. A method to create the header bar to match how we currently do, see sunpy.org for an example. - - We really like our dropdowns -2. A method to anchor the footer bar instead of having it scroll. - - Pydata's will only show it when you scroll to the very bottom. + +1. A method to create the header bar to match how we currently do, see sunpy.org for an example. + - We really like our dropdowns +2. A method to anchor the footer bar instead of having it scroll. + - Pydata's will only show it when you scroll to the very bottom. If there is time left over, we will then work through the remaining issues we have in our theme repository once the groundwork has been finished. @@ -43,14 +43,14 @@ If there is time left over, we will then work through the remaining issues we ha ##### Coding starts -* Already have a development environment setup -* Understand the project and sphinx build system. -* Tried to build and modify the pydata-sphinx-theme with our website/documentation +- Already have a development environment setup +- Understand the project and sphinx build system. +- Tried to build and modify the pydata-sphinx-theme with our website/documentation ##### 1st evaluation -* Have a working header and footer bars. +- Have a working header and footer bars. ##### Final evaluation -* Have finished updating the sphinx theme and finished any extensions to the base project. +- Have finished updating the sphinx theme and finished any extensions to the base project. diff --git a/_projects/2023/gnuastro/python_wrappers.md b/src/content/pages/gsoc/2023/gnuastro/python_wrappers.md similarity index 69% rename from _projects/2023/gnuastro/python_wrappers.md rename to src/content/pages/gsoc/2023/gnuastro/python_wrappers.md index 3fa2a088..c35b9a95 100644 --- a/_projects/2023/gnuastro/python_wrappers.md +++ b/src/content/pages/gsoc/2023/gnuastro/python_wrappers.md @@ -2,31 +2,30 @@ name: Gnuastro library in Python desc: Python wrappers over the Gnuastro C library. requirements: -# Student requirements: - - Low-level Python and Numpy (their C library). + # Student requirements: + - Low-level Python and Numpy (their C library). difficulty: low issues: -# Related issues (if any) to this project. - - https://github.com/Jash-Shah/pyGnuastro + # Related issues (if any) to this project. + - https://github.com/Jash-Shah/pyGnuastro mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - mohammad-akhlaghi + # First person in contact; mentors may change before project starts. + # GitHub handles + - mohammad-akhlaghi initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - python - - C + # Different technologies needed + - python + - C collaborating_projects: -# suborganisation(s) to which this project belongs. - - Gnuastro + # suborganization(s) to which this project belongs. + - Gnuastro --- - #### Description Gnuastro is primarily written in C because astronomical datasets are large and thus need to be efficient with few dependencies. @@ -36,7 +35,7 @@ On the other hand, many projects today are done in Python, almost excuslively us Python and Numpy are actually written in C, therefore they have very well-defined interfaces for communicating with installed C libraries. For example see [the core C library of Numpy](https://numpy.org/doc/stable/reference/c-api/index.html). -As part of GSoC 2022, Jash Shah completed a first implementation of pyGnuastro, see https://github.com/Jash-Shah/pyGnuastro and https://test.pypi.org/project/pygnuastro. +As part of GSoC 2022, Jash Shah completed a first implementation of pyGnuastro, see and . This was mostly focused on the low-level build system (for example to be integrated nicely with PyPi). With the inclusion of more libraries we discovered that Gnuastro's error reporting also [needs modification](https://savannah.gnu.org/task/?16263) for blending into Python. Jash also progressed nicely on this front in GSoC 2022, but it is not yet finished. @@ -49,22 +48,22 @@ To get started, check [our GSoC 2023 checklist](https://savannah.gnu.org/support #### Milestones (if any) - * Completing [our GSoC 2022 checklist](https://savannah.gnu.org/support/index.php?110827#comment0) +- Completing [our GSoC 2022 checklist](https://savannah.gnu.org/support/index.php?110827#comment0) - * Completing the re-design of Gnuastro's error functionality. +- Completing the re-design of Gnuastro's error functionality. - * Adding wrappers for Gnuastro library functions in pyGnuastro. +- Adding wrappers for Gnuastro library functions in pyGnuastro. ##### Coding starts -* Learning the new error reporting functionality. +- Learning the new error reporting functionality. -* Implementing the error reporting function in some basic functions. +- Implementing the error reporting function in some basic functions. ##### 1st evaluation -* Implementing some of Gnuastro's basic libraries in pyGnuastro (with new error reporting feature). +- Implementing some of Gnuastro's basic libraries in pyGnuastro (with new error reporting feature). ##### Final evaluation -* Implementing all the necessary library functions in pyGnuastro, and adding high-level functionality to pyGnuastro like Gnuastro's programs. +- Implementing all the necessary library functions in pyGnuastro, and adding high-level functionality to pyGnuastro like Gnuastro's programs. diff --git a/src/content/pages/gsoc/2023/index.md b/src/content/pages/gsoc/2023/index.md new file mode 100644 index 00000000..3706f5fa --- /dev/null +++ b/src/content/pages/gsoc/2023/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2023" +show_main: false +season: 2023 +--- diff --git a/_projects/2023/radis/common_api.md b/src/content/pages/gsoc/2023/radis/common_api.md similarity index 63% rename from _projects/2023/radis/common_api.md rename to src/content/pages/gsoc/2023/radis/common_api.md index e393b9fc..daac5200 100644 --- a/_projects/2023/radis/common_api.md +++ b/src/content/pages/gsoc/2023/radis/common_api.md @@ -2,83 +2,77 @@ name: Common API for large molecular databases desc: The project aims at improving a common API currently used by RADIS and Exojax to retrieve large spectroscopy databases, by adding new databases, making it more user-friendly, and eventually stand-alone. - # add a short one line description of your project requirements: -# Student requirements: - - Knowledge of Pandas or other DataFrame libraries + # Student requirements: + - Knowledge of Pandas or other DataFrame libraries difficulty: medium issues: -- https://github.com/HajimeKawahara/exojax/discussions/257 -- https://github.com/radis/radis/issues/474 + - https://github.com/HajimeKawahara/exojax/discussions/257 + - https://github.com/radis/radis/issues/474 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - minouHub - - HajimeKawahara - - erwanp + # First person in contact; mentors may change before project starts. + # GitHub handles + - minouHub + - HajimeKawahara + - erwanp initiatives: - - GSOC + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - Python - - Vaex - - Pandas - - Git + # Different technologies needed + - Python + - Vaex + - Pandas + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description - The RADIS code was developed for the characterization of plasmas, flames and atmospheres. High-temperature spectral calculations require to resolve the shape of tens of millions of lines, which is the usual performance bottleneck. RADIS implements a new algorithm to compute these lineshapes, and is already one of the fastest line-by-line spectral codes available. It can also compute many different types of spectra (absorption / emission / equilibrium / nonequilibrium). In a typical calculation, a database of coefficients is loaded and these coefficients are multiplied according to physics laws to generate a set of linestrength in a spectrum. RADIS can handle different databases such as HITRAN, HITEMP, EXOMOL, GEISA, etc. Another open-source code, called EXOJAX, exchanged portions of code with RADIS until some parts of both codes became very similar. Currently, a database API is written in the RADIS code. The main goal of the current project is to improve this common API to download and manage databases. The mentee will not start from scratch because the community already worked on the problem and set up a frame for this big merge of code built around a [DatabaseManager](https://github.com/radis/radis/blob/develop/radis/api/dbmanager.py#L51) class. - #### Milestones ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) -* Get familiar with RADIS architecture, the [DatabaseManager](https://github.com/radis/radis/blob/develop/radis/api/dbmanager.py#L51) class, and what was already implemented. +- Get familiar with RADIS architecture, the [DatabaseManager](https://github.com/radis/radis/blob/develop/radis/api/dbmanager.py#L51) class, and what was already implemented. ##### 1st Evaluation -* Add new molecular databases: Kurucz, TheoReTS +- Add new molecular databases: Kurucz, TheoReTS -* Add documentation - -* Gather feedbacks from current users of ExoJax and RADIS +- Add documentation +- Gather feedbacks from current users of ExoJax and RADIS ##### 2nd Evaluation -* Add atomic database: NIST +- Add atomic database: NIST -* Based on the user feebacks and the hands-on experience acquired in the 1st round, refactor the Common API as required to make it more user-friendly. It might require major architectural changes. +- Based on the user feebacks and the hands-on experience acquired in the 1st round, refactor the Common API as required to make it more user-friendly. It might require major architectural changes. -* Set up documentation of a stand-alone version of the Database API +- Set up documentation of a stand-alone version of the Database API ##### Final evaluation -* Add collisional-induced-absorption (CIA) databases which are a different type of databases than line databases - -* If ready and, make the Common API stand-alone. +- Add collisional-induced-absorption (CIA) databases which are a different type of databases than line databases -* Have all code, tests, and documentation in GitHub. +- If ready and, make the Common API stand-alone. +- Have all code, tests, and documentation in GitHub. #### Secondary Goals -* Document architecture and developer guide when facing unclear points that may appear. +- Document architecture and developer guide when facing unclear points that may appear. -* Review pull requests from other RADIS contributors, especially parallel GSoC mentee \ No newline at end of file +- Review pull requests from other RADIS contributors, especially parallel GSoC mentee diff --git a/_projects/2023/radis/optimizing_radis_app.md b/src/content/pages/gsoc/2023/radis/optimizing_radis_app.md similarity index 72% rename from _projects/2023/radis/optimizing_radis_app.md rename to src/content/pages/gsoc/2023/radis/optimizing_radis_app.md index 7be853b2..946e318e 100644 --- a/_projects/2023/radis/optimizing_radis_app.md +++ b/src/content/pages/gsoc/2023/radis/optimizing_radis_app.md @@ -4,51 +4,50 @@ desc: Our project is all about enhancing user experience to the next level! We'r # add a short one line description of your project requirements: -# Student requirements - - TypeScript - - React - - FastApi - - Testing (pytest && vitest) + # Student requirements + - TypeScript + - React + - FastApi + - Testing (pytest && vitest) difficulty: medium issues: - - - - - - + - https://github.com/suzil/radis-app/issues/669 + - https://github.com/suzil/radis-app/issues/85 + - https://github.com/suzil/radis-app/issues/674 mentors: -# First person in contact; mentors may change before project starts -# GitHub handles - - erwanp - - arunavabasu-03 + # First person in contact; mentors may change before project starts + # GitHub handles + - erwanp + - arunavabasu-03 initiatives: - - GSOC + - GSOC project_size: - - 350 h - + - 350 h + tags: -# Different technologies needed - - Python - - TypeScript - - JavaScript - - React - - Fastapi - - Pandas - - Git + # Different technologies needed + - Python + - TypeScript + - JavaScript + - React + - Fastapi + - Pandas + - Git collaborating_projects: -# suborganisation(s) to which this project belongs - - radis - + # suborganization(s) to which this project belongs + - radis --- #### Description RADIS app is a web application for Radis high-resolution infrared molecular spectra. Instead of writing code, this project aims to create an intuitive user interface (UI).It use radis internally to produce spectrum, and the updated version and radis algorithm make it incredibly efficient to compute the millions of lines in only a few minutes.Radis app leverages React 18 to offer the user interface, and FastApi on the backend. We are using react-hook-form for the fastest user experience and to maintain performance on the client slide. In the backend, we use FastApi to offer the fastest response.We created this app with the intention of giving both researchers and non-researchers access to the most valuable elements of Radis via a straightforward online application. Our team and contributors are always trying to make the app better. The app has additional features and capabilities in newer versions. -Our project is all about enhancing user experience to the next level! We're committed to bringing you cutting-edge features and fine-tuning these features for maximum performance and efficiency, and rigorous testing to ensure they meet the needs of our highly valued end users. +Our project is all about enhancing user experience to the next level! We're committed to bringing you cutting-edge features and fine-tuning these features for maximum performance and efficiency, and rigorous testing to ensure they meet the needs of our highly valued end users. #### Milestones @@ -58,11 +57,11 @@ Our project is all about enhancing user experience to the next level! We're comm - Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS App](https://github.com/suzil/radis-app) -- Get familiar with RADIS App's Frontend (how radis app interface works and simulates spectrum )and Backend System (how the app integrated with radis to produce spectrum) +- Get familiar with RADIS App's Frontend (how radis app interface works and simulates spectrum )and Backend System (how the app integrated with radis to produce spectrum) ##### 1st Evaluation -- Implement exomol database in radis app api +- Implement exomol database in radis app api - Fitting feature (user imports its experimental spectrum) @@ -78,7 +77,7 @@ Our project is all about enhancing user experience to the next level! We're comm - Improving code coverage and test all the basic features using vitetest && migrating old test too. -- Fix the feedback loop for user side(user can submit feedbacks in app !) +- Fix the feedback loop for user side(user can submit feedbacks in app !) - Have all code, tests, and documentation in GitHub. diff --git a/src/content/pages/gsoc/2023/radis/out_of_core_calculations.md b/src/content/pages/gsoc/2023/radis/out_of_core_calculations.md new file mode 100644 index 00000000..339b7907 --- /dev/null +++ b/src/content/pages/gsoc/2023/radis/out_of_core_calculations.md @@ -0,0 +1,76 @@ +--- +name: Out-of-core calculations to reduce memory usage +desc: The project aims at reducing RADIS memory usage, and make it possible to compute very-large spectral databases of tens of gigabytes that do not fit in RAM memory. + +# add a short one line description of your project +requirements: + # Student requirements: + - Knowledge of Pandas or other DataFrame libraries + - Prior working knowledge with big data handling databases like Vaex +difficulty: medium +issues: + +mentors: + # First person in contact; mentors may change before project starts. + # GitHub handles + - minouHub + - anandxkumar + - erwanp +initiatives: + - GSOC +project_size: + - 350 h +tags: + # Different technologies needed + - Python + - Vaex + - Pandas + - Git +collaborating_projects: + # suborganization(s) to which this project belongs. + - radis +--- + +#### Description + +The RADIS code was developed for the characterization of plasmas, flames and atmospheres. High-temperature spectral calculations require to resolve the shape of tens of millions of lines, which is the usual performance bottleneck. RADIS implements a new algorithm to compute these lineshapes, and is already one of the fastest line-by-line spectral codes available. It can also compute many different types of spectra (absorption / emission / equilibrium / nonequilibrium). + +However, although the algorithm is very CPU/GPU efficient, the RADIS code is still memory-hungry. Databases are currently loaded in RADIS using the VAEX package, but the operations to calculate the spectra are performed using the PANDAS library. VAEX is a similar table management tool than PANDAS but uses memory mapping, a zero memory copy policy, and lazy computations for the best performance. **The main goal of the current project is to refactor RADIS so that dataframes are only manipulated via the VAEX format**. Potentially, this work would make it possible to compute spectral databases of up to billions of lines (hundred of GB or terabyte-scale databases). + +#### Milestones + +##### Coding starts + +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) + +- Training on emission & absorption spectroscopy + +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) + +- Get familiar with RADIS architecture + +##### 1st Evaluation + +- Create a standalone spectroscopy code working with Out-of-core Vaex calculations (with minimum features: absorption code under equilibrium) + +##### 2nd Evaluation + +- Create a standalone spectroscopy code working with Out-of-core Vaex calculations (with minimum features: absorption code under equilibrium) + +- Implement VAEX out-of-core calculations directly in a single RADIS calculation path (e.g. equilibrium, one lineshape calculation routine), replacing PANDAS + +- Implement tests to verify that the implementation of VAEX will not have different output than the current PANDAS implementation + +##### Final evaluation + +- Implement VAEX out-of-core calculations directly in all othe other RADIS calculation paths (nonequilibrium, all lineshape calculations routine), replacing PANDAS + +- Have all code, tests, and documentation in GitHub. + +#### Secondary Goals + +- Document architecture and developer guide when facing unclear points that may appear. + +- Review pull requests from other RADIS contributors, especially parallel GSoC mentee + +- List and explore consequences for GPU calculations already implemented in RADIS diff --git a/_projects/2023/stingray/gaussianprocesses.md b/src/content/pages/gsoc/2023/stingray/gaussianprocesses.md similarity index 56% rename from _projects/2023/stingray/gaussianprocesses.md rename to src/content/pages/gsoc/2023/stingray/gaussianprocesses.md index 452e06db..1341fbda 100644 --- a/_projects/2023/stingray/gaussianprocesses.md +++ b/src/content/pages/gsoc/2023/stingray/gaussianprocesses.md @@ -3,71 +3,70 @@ name: Searching for Quasi-Periodic Oscillations with Gaussian Processes desc: This project implements a new submodule into the time series analysis package stingray to help us search astronomical data for periodic variations in brightness using Gaussian Process regression. # add a short one line description of your project requirements: -# Student requirements: -- experience with Python and the scientific stack -- experience with Gaussian Processes and/or JAX welcome + # Student requirements: + - experience with Python and the scientific stack + - experience with Gaussian Processes and/or JAX welcome difficulty: high issues: -# Related issues (if any) to this project. -- https://github.com/StingraySoftware/stingray/issues/660 + # Related issues (if any) to this project. + - https://github.com/StingraySoftware/stingray/issues/660 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - dhuppenkothen + # First person in contact; mentors may change before project starts. + # GitHub handles + - dhuppenkothen initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - python - - time series - - stingray - - Gaussian Processes + # Different technologies needed + - python + - time series + - stingray + - Gaussian Processes collaborating_projects: -# suborganisation(s) to which this project belongs. -- stingray + # suborganization(s) to which this project belongs. + - stingray --- #### Description -Stingray provides methods for analysing astronomical time series, -in particular data from space telescopes observing some of the most -extreme sources in the universe: violent stellar explosions, matter -falling into black holes, and rapidly spinning neutron stars. Among -all the variations of brightness we can study in these sources, -periodic and quasi-periodic oscillations are among the most interesting, -because they can often be directly tied to astrophysical processes in -the object. Finding them in practice can be difficult, and the methods -currently implemented in stingray have serious limitations that are -often not met by the data we observe. Recently, Huebner et al -(2022, arXiv:2205.12716) proposed a new method for searching for -quasi-periodic oscillations, including an associated software tool -(https://github.com/MoritzThomasHuebner/QPOEstimation). While it -works, it is somewhat unwieldy, not well documented, and not well -integrated with existing functionality in stingray. In this project, -we will simplify the existing code, port it to the tinygp library, -integrate it with stingray in a new submodule, and release it together +Stingray provides methods for analysing astronomical time series, +in particular data from space telescopes observing some of the most +extreme sources in the universe: violent stellar explosions, matter +falling into black holes, and rapidly spinning neutron stars. Among +all the variations of brightness we can study in these sources, +periodic and quasi-periodic oscillations are among the most interesting, +because they can often be directly tied to astrophysical processes in +the object. Finding them in practice can be difficult, and the methods +currently implemented in stingray have serious limitations that are +often not met by the data we observe. Recently, Huebner et al +(2022, arXiv:2205.12716) proposed a new method for searching for +quasi-periodic oscillations, including an associated software tool +(). While it +works, it is somewhat unwieldy, not well documented, and not well +integrated with existing functionality in stingray. In this project, +we will simplify the existing code, port it to the tinygp library, +integrate it with stingray in a new submodule, and release it together with a tutorial. - #### Milestones (if any) #### Community Bonding Period -* Familiarize with the QPOEstimation code from Huebner et al (2022) and stingray -* Formulate design plan for the stingray submodule -* Set up development environment + +- Familiarize with the QPOEstimation code from Huebner et al (2022) and stingray +- Formulate design plan for the stingray submodule +- Set up development environment ##### Coding starts -* Start implementation of QPOEstimation using tinygp as a stingray submodule +- Start implementation of QPOEstimation using tinygp as a stingray submodule ##### 1st evaluation -* Basic functionality implemented, docstrings and tests exist +- Basic functionality implemented, docstrings and tests exist ##### Final evaluation -* QPO search tool is fully functional, including a case study and a tutorial - +- QPO search tool is fully functional, including a case study and a tutorial diff --git a/_projects/2023/stingray/lombscargle.md b/src/content/pages/gsoc/2023/stingray/lombscargle.md similarity index 58% rename from _projects/2023/stingray/lombscargle.md rename to src/content/pages/gsoc/2023/stingray/lombscargle.md index ad38c2e2..3ff53a39 100644 --- a/_projects/2023/stingray/lombscargle.md +++ b/src/content/pages/gsoc/2023/stingray/lombscargle.md @@ -1,30 +1,30 @@ --- name: Astronomy with Unevenly Sampled Data -desc: Implementing time series analysis methods for unevenly sampled data for X-ray astronomy data +desc: Implementing time series analysis methods for unevenly sampled data for X-ray astronomy data requirements: - - Python - - Experience with time series methods and/or Fourier analysis welcome + - Python + - Experience with time series methods and/or Fourier analysis welcome difficulty: medium issues: -# Related issues (if any) to this project. -- https://github.com/StingraySoftware/stingray/issues/689 + # Related issues (if any) to this project. + - https://github.com/StingraySoftware/stingray/issues/689 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - dhuppenkothen + # First person in contact; mentors may change before project starts. + # GitHub handles + - dhuppenkothen initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 175 h + - 175 h tags: -# Different technologies needed - - python - - + # Different technologies needed + - python + - collaborating_projects: -# suborganisation(s) to which this project belongs. - - stingray + # suborganization(s) to which this project belongs. + - stingray --- #### Description @@ -34,18 +34,20 @@ Stingray provides methods for analysing astronomical time series, in particular #### Milestones (if any) ##### Community Bonding + Community Bonding -* Scope out which spectral timing methods can be adapted to uneven sampling, and which functionality to adapt from astropy -* Set up development environment and become familiar with stingray core functionality + +- Scope out which spectral timing methods can be adapted to uneven sampling, and which functionality to adapt from astropy +- Set up development environment and become familiar with stingray core functionality ##### Coding starts -* Start working on implementation of Lomb-Scargle periodogram as a stingray class +- Start working on implementation of Lomb-Scargle periodogram as a stingray class ##### 1st evaluation -* Lomb-Scargle periodogram class implemented +- Lomb-Scargle periodogram class implemented ##### Final evaluation -* Implementation of unevenly sampled time lags, and potential other functionality +- Implementation of unevenly sampled time lags, and potential other functionality diff --git a/_projects/2023/sunpy/hek.md b/src/content/pages/gsoc/2023/sunpy/hek.md similarity index 76% rename from _projects/2023/sunpy/hek.md rename to src/content/pages/gsoc/2023/sunpy/hek.md index 516ed031..b841232c 100644 --- a/_projects/2023/sunpy/hek.md +++ b/src/content/pages/gsoc/2023/sunpy/hek.md @@ -2,28 +2,28 @@ name: Improved solar feature and event representation desc: Improve the current representation of solar features and events requirements: - - Familiarity with Python + - Familiarity with Python difficulty: medium to high issues: - - https://github.com/sunpy/sunpy/issues?q=is%3Aissue+is%3Aopen+HEK + - https://github.com/sunpy/sunpy/issues?q=is%3Aissue+is%3Aopen+HEK mentors: - - wafels - - nabobalis + - wafels + - nabobalis initiatives: - - GSOC + - GSOC project_size: - - 175 h - - 350 h + - 175 h + - 350 h tags: - - python + - python collaborating_projects: - - sunpy + - sunpy --- #### Description `sunpy` provides access to solar feature and event data held by the [Heliophysics Event Knowledgebase](https://www.lmsal.com/hek/). -Descriptions of the properties of each feature and event are given [here](https://www.lmsal.com/hek/VOEvent_Spec.html). +Descriptions of the properties of each feature and event are given in the [HEK VOEvent specification](https://www.lmsal.com/hek/VOEvent_Spec.html). Feature and event properties include their type, physical extent, location, lifetime, and other feature/event properties that are specific to a given feature/event. For example, the time at which the energy flux of a solar flare is at a maximum is relevant for flares, but is not relevant to the description of a coronal hole. @@ -45,18 +45,18 @@ More information is found on the linked issues. ##### Community Bonding Period -* Understand the project and the API design. -* Setup a development environment. +- Understand the project and the API design. +- Setup a development environment. ##### Coding starts -* Experimenting with the current representation of HEK feature and event data. -* Consider parsing the html page for the specification. +- Experimenting with the current representation of HEK feature and event data. +- Consider parsing the html page for the specification. ##### 1st evaluation -* Partial skeleton of the new HEK feature/event object written. +- Partial skeleton of the new HEK feature/event object written. ##### Final evaluation -* Functional replacement ready for review and merging into `sunpy`. +- Functional replacement ready for review and merging into `sunpy`. diff --git a/_projects/2023/sunpy/scraper.md b/src/content/pages/gsoc/2023/sunpy/scraper.md similarity index 73% rename from _projects/2023/sunpy/scraper.md rename to src/content/pages/gsoc/2023/sunpy/scraper.md index d95616f8..1a18dfd9 100644 --- a/_projects/2023/sunpy/scraper.md +++ b/src/content/pages/gsoc/2023/sunpy/scraper.md @@ -2,26 +2,26 @@ name: Scraper rewrite desc: Improve the current scraper to download data requirements: - - Familiarity with Python - - Knowledge of Python regex - - Familiar with web protocols + - Familiarity with Python + - Knowledge of Python regex + - Familiar with web protocols difficulty: high issues: - - https://github.com/sunpy/sunpy/issues/4888 + - https://github.com/sunpy/sunpy/issues/4888 mentors: - - nabobalis - - samaloney - - hayesla + - nabobalis + - samaloney + - hayesla initiatives: - - GSOC + - GSOC project_size: - - 175 h - - 350 h + - 175 h + - 350 h tags: - - python - - web + - python + - web collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -47,17 +47,17 @@ More information is found on the linked issue. ##### Community Bonding Period -* Understand the project and the API design. -* Setup a development environment. +- Understand the project and the API design. +- Setup a development environment. ##### Coding starts -* Experimenting with the current Scrapper and reviewing the current Class. +- Experimenting with the current Scrapper and reviewing the current Class. ##### 1st evaluation -* Partial skeleton of scraper written. +- Partial skeleton of scraper written. ##### Final evaluation -* Functional replacement ready for review and merging into `sunpy`. +- Functional replacement ready for review and merging into `sunpy`. diff --git a/_projects/2023/sunpy/sunkit_image.md b/src/content/pages/gsoc/2023/sunpy/sunkit_image.md similarity index 77% rename from _projects/2023/sunpy/sunkit_image.md rename to src/content/pages/gsoc/2023/sunpy/sunkit_image.md index 27731735..cbc26490 100644 --- a/_projects/2023/sunpy/sunkit_image.md +++ b/src/content/pages/gsoc/2023/sunpy/sunkit_image.md @@ -2,25 +2,25 @@ name: sunkit-image and integration with sunpy desc: Improve the integration of sunkit-image to work with SunPy data structures requirements: - - Experience with Python. - - Experience with sunpy Map. - - Experience with NDcube. + - Experience with Python. + - Experience with sunpy Map. + - Experience with NDcube. difficulty: medium to low issues: - - https://github.com/sunpy/sunpy-sphinx-theme/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc + - https://github.com/sunpy/sunpy-sphinx-theme/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc mentors: - - nabobalis - - wtbarnes + - nabobalis + - wtbarnes initiatives: - - GSOC + - GSOC project_size: - - 175 h + - 175 h tags: - - sunpy - - Python - - refactoring + - sunpy + - Python + - refactoring collaborating_projects: - - sunpy + - sunpy --- #### Description @@ -47,16 +47,17 @@ If there is some time left over: ##### Community Bonding Period -* Scope out what functions need changing and get familiar with the library. -* Setup a development environment. +- Scope out what functions need changing and get familiar with the library. +- Setup a development environment. + ##### Coding starts -* Start working on the first function. +- Start working on the first function. ##### 1st evaluation -* Have around ~50% of the functions taken care of. +- Have around ~50% of the functions taken care of. ##### Final evaluation -* Finish updating each function in sunkit-image. +- Finish updating each function in sunkit-image. diff --git a/_projects/2024/gnuastro/opencl_integration.md b/src/content/pages/gsoc/2024/gnuastro/opencl_integration.md similarity index 64% rename from _projects/2024/gnuastro/opencl_integration.md rename to src/content/pages/gsoc/2024/gnuastro/opencl_integration.md index 9a37a278..ac4c26d0 100644 --- a/_projects/2024/gnuastro/opencl_integration.md +++ b/src/content/pages/gsoc/2024/gnuastro/opencl_integration.md @@ -2,33 +2,32 @@ name: OpenCL integration with Gnuastro desc: GPU support inside Gnuastro C library. requirements: -# Student requirements: - - C - - GNU Autotools (build system) + # Student requirements: + - C + - GNU Autotools (build system) difficulty: medium issues: -# Related issues (if any) to this project. - - https://labeeb-7z.github.io/Blogs/2023/08/12/Integrating-OpenCL.html + # Related issues (if any) to this project. + - https://labeeb-7z.github.io/Blogs/2023/08/12/Integrating-OpenCL.html mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - labeeb-7z - - mohammad-akhlaghi + # First person in contact; mentors may change before project starts. + # GitHub handles + - labeeb-7z + - mohammad-akhlaghi initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - C - - OpenCL + # Different technologies needed + - C + - OpenCL collaborating_projects: -# suborganisation(s) to which this project belongs. - - Gnuastro + # suborganization(s) to which this project belongs. + - Gnuastro --- - #### Description GNU Astronomy Utilities (Gnuastro) is an astronomical data processing package containing a dynamically linked library as well as command-line programs for high-level access. Astronomical data can be large and most operations highly parallelizable. Until now, only CPU parallelization has been implemented in Gnuastro, but not yet on GPUs. GPUs are special hardware which are specifically designed for such operations and can significantly reduce the overall execution time significantly for specific tasks. @@ -36,35 +35,34 @@ GNU Astronomy Utilities (Gnuastro) is an astronomical data processing package co In GSoC 2023, the idea of allowing Gnuastro to leverage GPUs for several parallel subroutines kicked off by integrating the Gnuastro C library with CUDA. However CUDA is a high-level interface, is not free software, and is limited to NVIDIA devices. Therefore it was decided to use the low-level and free standard OpenCL (Open Computing Language). OpenCL is an open, cross-platform framework for programming diverse accelerators at a very low level. Integration with OpenCL will allow users of Gnuastro to run parallel subroutines on specialised hardware (like GPU) regardless of its manufacturer. At the conclusion of GSoC 2023, a first draft of OpenCL was integrated in Gnuastro. For more see the [report of GSoC 2023](https://labeeb-7z.github.io/Blogs/2023/08/22/Final-Report.html) -The goal for this summer is to solidify a mature and generic interface to that implementation, such that a Gnuastro user that has a GPU device can use that while a user without a GPU can do exactly the same operation on a CPU. This will be tested by gradually implementing the interface to parallelizable operations (that are currently only using the CPU). Finally, we need to perform extensive testing of the OpenCL-accelerated subroutines on various hardware configurations to ensure robustness and compatibility. +The goal for this summer is to solidify a mature and generic interface to that implementation, such that a Gnuastro user that has a GPU device can use that while a user without a GPU can do exactly the same operation on a CPU. This will be tested by gradually implementing the interface to parallelizable operations (that are currently only using the CPU). Finally, we need to perform extensive testing of the OpenCL-accelerated subroutines on various hardware configurations to ensure robustness and compatibility. To get started, check our [GSoC 2024 checklist](https://savannah.gnu.org/support/index.php?110827#comment0). - #### Milestones (if any) - * Setting up the low-level wrapper infrastructure for calling OpenCL kernels from Gnuastro for parallel subroutines (with minimal requirements on the developer to know OpenCL; allowing them to focus on the algorithm and even test without having a GPU, not the OpenCL details). +- Setting up the low-level wrapper infrastructure for calling OpenCL kernels from Gnuastro for parallel subroutines (with minimal requirements on the developer to know OpenCL; allowing them to focus on the algorithm and even test without having a GPU, not the OpenCL details). - * Migrating the existing pthreads-based (CPU) wrappers in Gnuastro to the new wrappers. +- Migrating the existing pthreads-based (CPU) wrappers in Gnuastro to the new wrappers. - * Allowing users to choose GPU execution from the Command line interface and user documentation. +- Allowing users to choose GPU execution from the Command line interface and user documentation. ##### Coding starts -* Reviewing the work in GSoC 2023 and understand the work that was done before to understand all its details. +- Reviewing the work in GSoC 2023 and understand the work that was done before to understand all its details. -* Learning OpenCL's API and C interface +- Learning OpenCL's API and C interface -* Testing and debugging the work in various scenarios. +- Testing and debugging the work in various scenarios. ##### 1st evaluation -* A robust and smooth low level integration of OpenCL with Gnuastro which allows developers to write high level kernels easily compatible and usable inside Gnuastro. +- A robust and smooth low level integration of OpenCL with Gnuastro which allows developers to write high level kernels easily compatible and usable inside Gnuastro. -* Have at least a few OpenCL optimised subroutines merged into the main branch of Gnuastro. +- Have at least a few OpenCL optimised subroutines merged into the main branch of Gnuastro. ##### Final evaluation -* Completing all the required OpenCL kernels alongside their testing, merged with the main branch of Gnuastro. +- Completing all the required OpenCL kernels alongside their testing, merged with the main branch of Gnuastro. -* User documentation and Command line wrappers for using the newly available GPU functionality. +- User documentation and Command line wrappers for using the newly available GPU functionality. diff --git a/src/content/pages/gsoc/2024/index.md b/src/content/pages/gsoc/2024/index.md new file mode 100644 index 00000000..79a546a9 --- /dev/null +++ b/src/content/pages/gsoc/2024/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2024" +show_main: false +season: 2024 +--- diff --git a/_projects/2024/irsa-fornax/astrodata_DL.md b/src/content/pages/gsoc/2024/irsa-fornax/astrodata_DL.md similarity index 70% rename from _projects/2024/irsa-fornax/astrodata_DL.md rename to src/content/pages/gsoc/2024/irsa-fornax/astrodata_DL.md index c91052d8..33a53592 100644 --- a/_projects/2024/irsa-fornax/astrodata_DL.md +++ b/src/content/pages/gsoc/2024/irsa-fornax/astrodata_DL.md @@ -2,25 +2,25 @@ name: Astronomical data enhancement with DL desc: Improve usability of incomplete archival datasets requirements: - - Experience with data processing, AI, and machine learning - - Experience with Python - - Experience with AI/ML libraries such as TensorFlor and PyTorch + - Experience with data processing, AI, and machine learning + - Experience with Python + - Experience with AI/ML libraries such as TensorFlor and PyTorch difficulty: very high issues: - - https://github.com/nasa-fornax/fornax-demo-notebooks/issues/243 + - https://github.com/nasa-fornax/fornax-demo-notebooks/issues/243 mentors: - - xoubish - - jkrick + - xoubish + - jkrick initiatives: - - GSOC + - GSOC project_size: - - 350 h / large + - 350 h / large tags: - - irsa - - fornax - - Python + - irsa + - fornax + - Python collaborating_projects: - - irsa-fornax + - irsa-fornax --- # Description @@ -41,36 +41,32 @@ contribute meaningfully to scientific advancements. A crucial part of our method involves the development and testing of a data unification schema on large samples of Active Galactic Nuclei (AGNs), serving as a robust testbed for our algorithms. - This effort will not only validate the algorithms' ability to address complex data challenges but also highlight their applicability across astronomical research. - ## Goals -* Design and optimize a deep learning architecture tailored for the enhancement and unification of astronomical archival data. -* Conduct comprehensive testing of the data unification schema on large samples of AGNs - +- Design and optimize a deep learning architecture tailored for the enhancement and unification of astronomical archival data. +- Conduct comprehensive testing of the data unification schema on large samples of AGNs ## Project requirements -* Strong foundation in computer science, with a specialization in data processing, AI, and machine learning (ML) -* Proficiency in programming, particularly Python, and familiarity with AI/ML libraries and frameworks such as TensorFlow and PyTorch -* Expertise in data analysis, capable of assessing the impact of different augmentation techniques on the informational content and practical utility of datasets. -* Collaborative spirit, prepared to work within the NASA science platform group and engage with astronomers, ensuring that the project's technical solutions are aligned with scientific objectives and effectively contribute to the field. - +- Strong foundation in computer science, with a specialization in data processing, AI, and machine learning (ML) +- Proficiency in programming, particularly Python, and familiarity with AI/ML libraries and frameworks such as TensorFlow and PyTorch +- Expertise in data analysis, capable of assessing the impact of different augmentation techniques on the informational content and practical utility of datasets. +- Collaborative spirit, prepared to work within the NASA science platform group and engage with astronomers, ensuring that the project's technical solutions are aligned with scientific objectives and effectively contribute to the field. ### Community Bonding Period -* Familiarize yourself with the current code and the challenges. -* Setup a development environment. +- Familiarize yourself with the current code and the challenges. +- Setup a development environment. ### Coding starts #### 1st evaluation -* Have developed an initial DL architecture for gap filling in archival AGN data. +- Have developed an initial DL architecture for gap filling in archival AGN data. #### Final evaluation -* Have optimized the DL architecture for data unification from multiple archives, with quantified improvement metrics. +- Have optimized the DL architecture for data unification from multiple archives, with quantified improvement metrics. diff --git a/_projects/2024/irsa-fornax/light_curve_dask.md b/src/content/pages/gsoc/2024/irsa-fornax/light_curve_dask.md similarity index 80% rename from _projects/2024/irsa-fornax/light_curve_dask.md rename to src/content/pages/gsoc/2024/irsa-fornax/light_curve_dask.md index 25a916d1..4e99cc1c 100644 --- a/_projects/2024/irsa-fornax/light_curve_dask.md +++ b/src/content/pages/gsoc/2024/irsa-fornax/light_curve_dask.md @@ -2,25 +2,25 @@ name: Enable Dask execution of NASA time-domain analysis desc: Improve scalability of time-domain analysis requirements: - - Experience with Python - - Experience with Dask - - Background with astronomy is desired but not required. + - Experience with Python + - Experience with Dask + - Background with astronomy is desired but not required. difficulty: high issues: - - https://github.com/nasa-fornax/fornax-demo-notebooks/issues/240 + - https://github.com/nasa-fornax/fornax-demo-notebooks/issues/240 mentors: - - jkrick - - troyraen + - jkrick + - troyraen initiatives: - - GSOC + - GSOC project_size: - - 350 h / large + - 350 h / large tags: - - irsa - - fornax - - python + - irsa + - fornax + - python collaborating_projects: - - irsa-fornax + - irsa-fornax --- # Description @@ -31,7 +31,6 @@ development of that console by trying out novel, big-data science projects and t for use by the astrophysical community. We seek a contributor who can enable our code to be executed efficiently at scale on a Dask cluster provided by the science console. - This project will focus on a science use case that is based on the idea of collecting data from all of NASA's archival time domain datasets for a user-defined set of targets. This produces "light curves" -- roughly, brightness as a function of time -- in multiple wavelengths for each target. The science that can result from @@ -50,16 +49,16 @@ different challenges to running at scale on a Dask cluster. ### Community Bonding Period -* Familiarize yourself with the current code and the challenges to running at scale. -* Setup a development environment. +- Familiarize yourself with the current code and the challenges to running at scale. +- Setup a development environment. ### Coding starts #### 1st evaluation -* Have written new code that executes the light curve collection code on a Dask cluster. +- Have written new code that executes the light curve collection code on a Dask cluster. #### Final evaluation -* Have implemented a solution that runs smoothly on a Dask cluster and finishes in less time than the current -code takes. +- Have implemented a solution that runs smoothly on a Dask cluster and finishes in less time than the current + code takes. diff --git a/_projects/2024/radis/Kurucz_and_commonAPI.md b/src/content/pages/gsoc/2024/radis/Kurucz_and_commonAPI.md similarity index 66% rename from _projects/2024/radis/Kurucz_and_commonAPI.md rename to src/content/pages/gsoc/2024/radis/Kurucz_and_commonAPI.md index 0c0b54cb..dec7582c 100644 --- a/_projects/2024/radis/Kurucz_and_commonAPI.md +++ b/src/content/pages/gsoc/2024/radis/Kurucz_and_commonAPI.md @@ -2,81 +2,76 @@ name: Common API for large molecular databases desc: The project aims at improving a adding new databases, Kurucz atomic database, and eventually develop a common API currently used by RADIS and Exojax to retrieve large spectroscopy databases. - # add a short one line description of your project requirements: -# Student requirements: - - Knowledge of Pandas or other DataFrame libraries + # Student requirements: + - Knowledge of Pandas or other DataFrame libraries difficulty: medium issues: -- https://github.com/HajimeKawahara/exojax/discussions/257 -- https://github.com/radis/radis/issues/474 + - https://github.com/HajimeKawahara/exojax/discussions/257 + - https://github.com/radis/radis/issues/474 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - minouHub - - erwanp + # First person in contact; mentors may change before project starts. + # GitHub handles + - minouHub + - erwanp initiatives: - - GSOC + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - Python - - Vaex - - Pandas - - Git + # Different technologies needed + - Python + - Vaex + - Pandas + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- - #### Description - The RADIS code was developed for the characterization of plasmas, flames and atmospheres. High-temperature spectral calculations require to resolve the shape of tens of millions of lines, which is the usual performance bottleneck. RADIS implements a new algorithm to compute these lineshapes, and is already one of the fastest line-by-line spectral codes available. It can also compute many different types of spectra (absorption / emission / equilibrium / nonequilibrium). In a typical calculation, a database of coefficients is loaded and these coefficients are multiplied according to physics laws to generate a set of linestrength in a spectrum. RADIS can handle different databases such as HITRAN, HITEMP, EXOMOL, GEISA, etc. Another open-source code, called EXOJAX, exchanged portions of code with RADIS until some parts of both codes became very similar. Currently, a database API is written in the RADIS code. The main goal of the current project is to add the atomic Kurucz database to RADIS. The second objective is to improve the aformentioned common API to download and manage all databases. The mentee will not start from scratch because the community already worked on the problem and set up a frame for this big merge of code built around a [DatabaseManager](https://github.com/radis/radis/blob/develop/radis/api/dbmanager.py#L51) class. Previous work on the Kurucz database can be found in [this PR](https://github.com/radis/radis/pull/601). - #### Milestones ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) -* Get familiar with RADIS architecture, the [DatabaseManager](https://github.com/radis/radis/blob/develop/radis/api/dbmanager.py#L51) class, and what was already implemented. +- Get familiar with RADIS architecture, the [DatabaseManager](https://github.com/radis/radis/blob/develop/radis/api/dbmanager.py#L51) class, and what was already implemented. ##### 1st Evaluation -* Add new molecular databases: Kurucz - -* Add documentation +- Add new molecular databases: Kurucz -* Gather feedbacks from current users of ExoJax and RADIS +- Add documentation +- Gather feedbacks from current users of ExoJax and RADIS ##### 2nd Evaluation -* Add atomic database: NIST +- Add atomic database: NIST -* Based on the user feebacks and the hands-on experience acquired in the 1st round, refactor the Common API as required to make it more user-friendly. It might require major architectural changes. +- Based on the user feebacks and the hands-on experience acquired in the 1st round, refactor the Common API as required to make it more user-friendly. It might require major architectural changes. -* Set up documentation of a stand-alone version of the Database API +- Set up documentation of a stand-alone version of the Database API ##### Final evaluation -* Have all code, tests, and documentation in GitHub. +- Have all code, tests, and documentation in GitHub. -* If ready and, make the Common API stand-alone. +- If ready and, make the Common API stand-alone. #### Secondary Goals -* Add collisional-induced-absorption (CIA) databases which are a different type of databases than line databases +- Add collisional-induced-absorption (CIA) databases which are a different type of databases than line databases -* Document architecture and developer guide when facing unclear points that may appear. +- Document architecture and developer guide when facing unclear points that may appear. -* Review pull requests from other RADIS contributors +- Review pull requests from other RADIS contributors diff --git a/_projects/2024/stingray/dashboard.md b/src/content/pages/gsoc/2024/stingray/dashboard.md similarity index 71% rename from _projects/2024/stingray/dashboard.md rename to src/content/pages/gsoc/2024/stingray/dashboard.md index fdbd5612..3cb1f27d 100644 --- a/_projects/2024/stingray/dashboard.md +++ b/src/content/pages/gsoc/2024/stingray/dashboard.md @@ -2,49 +2,49 @@ name: A quicklook dashboard for X-ray astronomy with Stingray desc: Create a dashboard that displays some quicklook analysis of astronomical X-ray observations. requirements: - - Experience with Python + - Experience with Python difficulty: medium issues: - - https://github.com/StingraySoftware/stingray/issues/794 + - https://github.com/StingraySoftware/stingray/issues/794 mentors: - - matteobachetti - - mgullik + - matteobachetti + - mgullik initiatives: - - GSOC + - GSOC project_size: - - 350 h / large + - 350 h / large tags: - - python + - python collaborating_projects: - - stingray + - stingray --- # Description -Stingray is a Python library designed to perform times series analysis and -related tasks on astronomical light curves. It supports a range of commonly-used -Fourier analysis techniques, as well as extensions for analyzing pulsar data, -simulating data sets, and statistical modelling. Stingray is designed to be easy +Stingray is a Python library designed to perform times series analysis and +related tasks on astronomical light curves. It supports a range of commonly-used +Fourier analysis techniques, as well as extensions for analyzing pulsar data, +simulating data sets, and statistical modelling. Stingray is designed to be easy to extend, and easy to incorporate into data analysis workflows and pipelines. -When analyzing a new astronomical dataset, it is often convenient to have some quicklook +When analyzing a new astronomical dataset, it is often convenient to have some quicklook visualization with basic information. For X-ray astronomy, the usual information is a -light curve (a time series showing the flux of the source), a periodogram, spectral -colors (the ratio of fluxes in different energy bands of the X-rays). +light curve (a time series showing the flux of the source), a periodogram, spectral +colors (the ratio of fluxes in different energy bands of the X-rays). This project leverages Stingray's flexibility to create a quicklook dashboard with basic -interactivity. The principle is simple: given an event list, one calculates a light curve, -a power spectrum with default options, maybe a Lomb-Scargle periodogram, color-color or -HID diagrams, maybe power-color and color hue-rms diagrams. It should be somewhat +interactivity. The principle is simple: given an event list, one calculates a light curve, +a power spectrum with default options, maybe a Lomb-Scargle periodogram, color-color or +HID diagrams, maybe power-color and color hue-rms diagrams. It should be somewhat configurable, so that one can apply a set of custom options to a series of observations with ease. Each plot kind should be a separate plugin, with configurable options. The dashboard should display the plugins that the user requests with a custom JSON configuration file. -The dashboard could work as an interactive visualization web page (just for zooming in and out), +The dashboard could work as an interactive visualization web page (just for zooming in and out), or just make a PDF or image with the plots. -A bonus could be making it the start for an interactive *analysis* interface (not just +A bonus could be making it the start for an interactive _analysis_ interface (not just plotting, but also recalculate the quantities with different parameters and refresh the plots) ## Milestones @@ -56,18 +56,18 @@ plotting, but also recalculate the quantities with different parameters and refr ### Community Bonding Period -* Understand Stingray scientific case. -* Setup a development environment. +- Understand Stingray scientific case. +- Setup a development environment. ### Coding starts -* Design the general structure of the dashboard and the plugins. -* Use Stingray's tutorials to set up the basic plugins for quicklook +- Design the general structure of the dashboard and the plugins. +- Use Stingray's tutorials to set up the basic plugins for quicklook ### 1st evaluation -* Partial skeleton of the dashboard complete. +- Partial skeleton of the dashboard complete. ### Final evaluation -* Dashboard ready for deployment and properly documented. +- Dashboard ready for deployment and properly documented. diff --git a/_projects/2024/sunpy/_3dplotting.md b/src/content/pages/gsoc/2024/sunpy/_3dplotting.md similarity index 57% rename from _projects/2024/sunpy/_3dplotting.md rename to src/content/pages/gsoc/2024/sunpy/_3dplotting.md index 80fe43e9..0e3e5ed8 100644 --- a/_projects/2024/sunpy/_3dplotting.md +++ b/src/content/pages/gsoc/2024/sunpy/_3dplotting.md @@ -2,31 +2,31 @@ name: Improve sunkit-pyvista desc: Improve the 3D plotting capabilities within the SunPy Ecosystem requirements: - - Familiarity with Python - - Familiarity with pyvista + - Familiarity with Python + - Familiarity with pyvista difficulty: medium to high issues: - - https://github.com/sunpy/sunkit-pyvista/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc - - https://github.com/sunpy/sunkit-pyvista/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc + - https://github.com/sunpy/sunkit-pyvista/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc + - https://github.com/sunpy/sunkit-pyvista/pulls?q=is%3Apr+is%3Aopen+sort%3Aupdated-desc mentors: - - - - nabobalis + - + - nabobalis project_size: - - 175 h / medium + - 175 h / medium tags: - - python - - plotting - - 3D + - python + - plotting + - 3D collaborating_projects: - - sunpy + - sunpy --- # Description The SunPy Ecosystem currently has well developed support for making 2D plots (with Matplotlib), but currently a simpler interface for making 3D plots. -[sunkit-pyvista](https://github.com/sunpy/sunkit-pyvista) came out of a previous GSoC project and enables 3D plotting of sunpy Maps. -This is achieved by wrapping [pyvista](https://github.com/pyvista/pyvista) and adding a "solar-spin" on their API. +[sunkit-pyvista](https://github.com/sunpy/sunkit-pyvista) came out of a previous GSoC project and enables 3D plotting of sunpy Maps. +This is achieved by wrapping [pyvista](https://github.com/pyvista/pyvista) and adding a "solar-spin" on their API. However, after this GSoC, progress was much slower and issues have cropped up with time, the main one being the the API currently has a `plotter.plotter` to access the underlying pyvista API. It also lacks some useful features such as plotting current sheets and animations. @@ -37,18 +37,18 @@ This project will be addressing these issues, in part by taking over existing pu ### Community Bonding Period -* Get familiar with sunkit-pyvista. -* Get familiar with pyvista. -* Setup a development environment. +- Get familiar with sunkit-pyvista. +- Get familiar with pyvista. +- Setup a development environment. ### Coding starts -* Start working on the first issue. +- Start working on the first issue. #### 1st evaluation -* Have around ~50% of the issues and pull requests taken care of. +- Have around ~50% of the issues and pull requests taken care of. #### Final evaluation -* Ideally have 100% of the issues and pull requests finished. +- Ideally have 100% of the issues and pull requests finished. diff --git a/_projects/2024/sunpy/eclipse.md b/src/content/pages/gsoc/2024/sunpy/eclipse.md similarity index 70% rename from _projects/2024/sunpy/eclipse.md rename to src/content/pages/gsoc/2024/sunpy/eclipse.md index 76bfbbde..ed43d222 100644 --- a/_projects/2024/sunpy/eclipse.md +++ b/src/content/pages/gsoc/2024/sunpy/eclipse.md @@ -2,24 +2,24 @@ name: Solar Eclipse analysis with sunpy desc: Process and analysis photographs taken of the total solar eclipse that crosses the US in 2024 requirements: - - Experience with Python - - Background with Physics or Astronomy + - Experience with Python + - Background with Physics or Astronomy difficulty: very high issues: - - https://github.com/sunpy/sunpy/issues/7387 + - https://github.com/sunpy/sunpy/issues/7387 mentors: - - nabobalis - - ehsteve - - ayshih + - nabobalis + - ehsteve + - ayshih initiatives: - - GSOC + - GSOC project_size: - - 350 h / large + - 350 h / large tags: - - sunpy - - Python + - sunpy + - Python collaborating_projects: - - sunpy + - sunpy --- # Description @@ -27,11 +27,11 @@ collaborating_projects: On April 8 2024, a total solar eclipse will will cross North America, passing over Mexico, the United States, and Canada. It is expected that more than 20 million people will be able to witness it and we can expect a large number of amateur photographers to record the event. -Thus the purpose of this project is to develop tools to enable ground-based amateur photographs of the solar corona taken during the eclipse to be imported into ``sunpy`` and processed to enable comparison with space-based data sets already available in ``sunpy`` such as SDO/AIA. +Thus the purpose of this project is to develop tools to enable ground-based amateur photographs of the solar corona taken during the eclipse to be imported into `sunpy` and processed to enable comparison with space-based data sets already available in `sunpy` such as SDO/AIA. Eclipse photographs also frequently require processing steps such as stacking and aligning of multiple exposures, sharpening, and flat-fielding. -This may require new algorithms to be developed or existing tools in SciPy or other libraries to be identified and applied. +This may require new algorithms to be developed or existing tools in SciPy or other libraries to be identified and applied. -This project will need to create the components within ``sunpy`` but also other libraries such as ``sunkit-image``. +This project will need to create the components within `sunpy` but also other libraries such as `sunkit-image`. There are several steps: @@ -52,17 +52,17 @@ A background in Physics or Astronomy with experience of astropy or sunpy coordin ### Community Bonding Period -* Get familiar wih solar coordinates and solar eclipse data. -* Setup a development environment. +- Get familiar wih solar coordinates and solar eclipse data. +- Setup a development environment. ### Coding starts -* Start by recreating the eclipse path image. +- Start by recreating the eclipse path image. #### 1st evaluation -* Have updated the old notebook code to work with newer data. +- Have updated the old notebook code to work with newer data. #### Final evaluation -* Ideally finished each bullet pointed task. +- Ideally finished each bullet pointed task. diff --git a/_projects/2024/sunpy/hek.md b/src/content/pages/gsoc/2024/sunpy/hek.md similarity index 79% rename from _projects/2024/sunpy/hek.md rename to src/content/pages/gsoc/2024/sunpy/hek.md index c4779736..c9e64321 100644 --- a/_projects/2024/sunpy/hek.md +++ b/src/content/pages/gsoc/2024/sunpy/hek.md @@ -2,27 +2,27 @@ name: Improved solar feature and event representation desc: Improve the current representation of solar features and events requirements: - - Experience with Python + - Experience with Python difficulty: low to medium issues: - - https://github.com/sunpy/sunpy/issues?q=is%3Aissue+is%3Aopen+HEK + - https://github.com/sunpy/sunpy/issues?q=is%3Aissue+is%3Aopen+HEK mentors: - - wafels - - nabobalis + - wafels + - nabobalis initiatives: - - GSOC + - GSOC project_size: - - 90h / small + - 90h / small tags: - - python + - python collaborating_projects: - - sunpy + - sunpy --- # Description `sunpy` provides access to solar feature and event data held by the [Heliophysics Event Knowledgebase](https://www.lmsal.com/hek/). -Descriptions of the properties of each feature and event are given [here](https://www.lmsal.com/hek/VOEvent_Spec.html). +Descriptions of the properties of each feature and event are given in the [HEK VOEvent specification](https://www.lmsal.com/hek/VOEvent_Spec.html). Feature and event properties include their type, physical extent, location, lifetime, and other feature/event properties that are specific to a given feature/event. For example, the time at which the energy flux of a solar flare is at a maximum is relevant for flares, but is not relevant to the description of a coronal hole. @@ -47,18 +47,18 @@ For this project, being familiar with astropy regions and some solar coordinate ### Community Bonding Period -* Understand the project and the API design. -* Setup a development environment. +- Understand the project and the API design. +- Setup a development environment. ### Coding starts -* Experimenting with the current representation of HEK feature and event data. -* Consider parsing the html page for the specification. +- Experimenting with the current representation of HEK feature and event data. +- Consider parsing the html page for the specification. ### 1st evaluation -* Partial skeleton of the new HEK feature/event object written. +- Partial skeleton of the new HEK feature/event object written. ### Final evaluation -* Functional replacement ready for review and merging into `sunpy`. +- Functional replacement ready for review and merging into `sunpy`. diff --git a/_projects/2024/sunpy/ndcube_io.md b/src/content/pages/gsoc/2024/sunpy/ndcube_io.md similarity index 78% rename from _projects/2024/sunpy/ndcube_io.md rename to src/content/pages/gsoc/2024/sunpy/ndcube_io.md index cba2291c..eb0696f9 100644 --- a/_projects/2024/sunpy/ndcube_io.md +++ b/src/content/pages/gsoc/2024/sunpy/ndcube_io.md @@ -2,23 +2,23 @@ name: Serialisation of NDCube classes to ASDF desc: This project will add functionality to `ndcube` and other relevant packages to save all the ndcube classes to ASDF files. requirements: - - Experience with Python + - Experience with Python difficulty: medium to high issues: - - https://github.com/sunpy/ndcube/issues/111 + - https://github.com/sunpy/ndcube/issues/111 mentors: - - Cadair - - DanRyanIrish - - braingram + - Cadair + - DanRyanIrish + - braingram initiatives: - - GSOC + - GSOC project_size: - - 175 h / medium + - 175 h / medium tags: - - sunpy - - Python + - sunpy + - Python collaborating_projects: - - sunpy + - sunpy --- # Description @@ -35,45 +35,45 @@ Since `ndcube` currently does not support ASDF at all, the additional steps of a The first phase of this project will be to enable serializing a `ndcube.NDCube` object when `.data` is a numpy array and `.wcs` is a [`gwcs.WCS`](https://gwcs.readthedocs.io/) object. To do this the following classes will need to have `Converters` written for them in `ndcube`: -* `NDCube` -* `GlobalCoords` -* `ExtraCoords` +- `NDCube` +- `GlobalCoords` +- `ExtraCoords` The next step will be to extend this basic support with support for `astropy.wcs.WCS` classes as the `NDCube.wcs` property. To do this a `Converter` for `astropy.wcs.WCS` will need to be added to the [`asdf_astropy`](https://github.com/astropy/asdf-astropy/) package. Then to add support for all the WCS wrapper classes implemented in [ndcube](https://github.com/sunpy/ndcube/tree/main/ndcube/wcs/wrappers) and [astropy](https://github.com/astropy/astropy/blob/main/astropy/wcs/wcsapi/wrappers/sliced_wcs.py#L105) so that `NDCube` object which have been manipulated can also be saved to ASDF. So by the end of this step the following classes will have converters written: -* `astropy.wcs.WCS` -* `SlicedLowLevelWCS` -* `ResampledLowLevelWCS` -* `CompoundLowLevelWCS` -* `ReorderedLowLevelWCS` +- `astropy.wcs.WCS` +- `SlicedLowLevelWCS` +- `ResampledLowLevelWCS` +- `CompoundLowLevelWCS` +- `ReorderedLowLevelWCS` The final stage for the `ndcube.NDCube` object will be to ensure that a `NDCube` object with all optional properties set, such as `mask`, `uncertainty` and `psf` is able to be saved to ASDF. This will at minimum require writing a `Converter` and schema for the `astropy.nddata.NDUncertainty` class in `asdf_astropy`. The next phase of the project will be to add support for the other `ndcube` data types: -* `NDCubeSequence` -* `NDCollection` +- `NDCubeSequence` +- `NDCollection` ## Goals ### Community Bonding Period -* Setup a development environment. -* Familiarize yourself with `asdf` extensions, `Converters` and schemas. +- Setup a development environment. +- Familiarize yourself with `asdf` extensions, `Converters` and schemas. ### Before 1st Evaluation -* Add the `asdf` extension infrastructure to `ndcube`. -* Write Converters and schemas for `GlobalCoords` and `ExtraCoords` (with tests). -* Write Converter and schema for `NDCube` (with tests). -* Extend test suite with other examples of saving and loading `NDCube` objects backed by different `gwcs.WCS` objects etc which can be reused as test cases later. +- Add the `asdf` extension infrastructure to `ndcube`. +- Write Converters and schemas for `GlobalCoords` and `ExtraCoords` (with tests). +- Write Converter and schema for `NDCube` (with tests). +- Extend test suite with other examples of saving and loading `NDCube` objects backed by different `gwcs.WCS` objects etc which can be reused as test cases later. #### Before Final evaluation -* Have opened PRs to `asdf_astropy` for `astropy.wcs.WCS` and `astropy.nddata.NDUncertainty` classes. -* Have written tests in `ndcube` of serializing `NDCube` objects of higher complexity (`.uncertainty`, `.mask` etc) and with `astropy.wcs.WCS` objects. -* Add `Converters` and schemas for `NDCubeSequence` and `NDCollection` classes to `ndcube`. +- Have opened PRs to `asdf_astropy` for `astropy.wcs.WCS` and `astropy.nddata.NDUncertainty` classes. +- Have written tests in `ndcube` of serializing `NDCube` objects of higher complexity (`.uncertainty`, `.mask` etc) and with `astropy.wcs.WCS` objects. +- Add `Converters` and schemas for `NDCubeSequence` and `NDCollection` classes to `ndcube`. diff --git a/_projects/2024/sunpy/sunkit_image.md b/src/content/pages/gsoc/2024/sunpy/sunkit_image.md similarity index 79% rename from _projects/2024/sunpy/sunkit_image.md rename to src/content/pages/gsoc/2024/sunpy/sunkit_image.md index 0803afd8..588b6791 100644 --- a/_projects/2024/sunpy/sunkit_image.md +++ b/src/content/pages/gsoc/2024/sunpy/sunkit_image.md @@ -2,22 +2,22 @@ name: Improve sunkit-image desc: Improve the features of sunkit-image requirements: - - Experience with Python + - Experience with Python difficulty: low to medium issues: - - https://github.com/sunpy/sunkit-image/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc + - https://github.com/sunpy/sunkit-image/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc mentors: - - wtbarnes - - nabobalis + - wtbarnes + - nabobalis initiatives: - - GSOC + - GSOC project_size: - - 175 h / medium + - 175 h / medium tags: - - sunpy - - Python + - sunpy + - Python collaborating_projects: - - sunpy + - sunpy --- # Description @@ -44,17 +44,17 @@ If there is some time left over: ### Community Bonding Period -* Get familiar with the library. -* Setup a development environment. +- Get familiar with the library. +- Setup a development environment. ### Coding starts -* Start working on the first issue. +- Start working on the first issue. #### 1st evaluation -* Have around ~50% of the issues taken care of. +- Have around ~50% of the issues taken care of. #### Final evaluation -* Ideally have 100% of the issues finished. +- Ideally have 100% of the issues finished. diff --git a/_projects/2024/sunpy/sunpy-soar.md b/src/content/pages/gsoc/2024/sunpy/sunpy-soar.md similarity index 82% rename from _projects/2024/sunpy/sunpy-soar.md rename to src/content/pages/gsoc/2024/sunpy/sunpy-soar.md index 17593c0e..5401a230 100644 --- a/_projects/2024/sunpy/sunpy-soar.md +++ b/src/content/pages/gsoc/2024/sunpy/sunpy-soar.md @@ -2,24 +2,24 @@ name: Querying SOAR Metdata desc: Adding proper metadata handling to sunpy-soar requirements: - - Experience with Python + - Experience with Python difficulty: medium to high issues: - - https://github.com/sunpy/sunpy-soar/issues/46 - - https://github.com/sunpy/sunpy-soar/issues/66 + - https://github.com/sunpy/sunpy-soar/issues/46 + - https://github.com/sunpy/sunpy-soar/issues/66 mentors: - - hayesla - - nabobalis - - ebuchlin + - hayesla + - nabobalis + - ebuchlin initiatives: - - GSOC + - GSOC project_size: - - 175 h / medium + - 175 h / medium tags: - - sunpy - - Python + - sunpy + - Python collaborating_projects: - - sunpy + - sunpy --- # Description @@ -37,7 +37,7 @@ This translates Python code into the correct values required to do any query and As we are not planning to add every metadata as a new attribute, we will make use of more generic ones to enable filtering, similar to how it is done for another data provider, the [JSOC](https://docs.sunpy.org/en/latest/generated/api/sunpy.net.jsoc.Keyword.html#sunpy.net.jsoc.Keyword). If we do need to add new ones, they should have a very specific reason to exist, or we might need to add support for them within sunpy for other data -For example, there are existing attributes like that can be mapped like ``Wavelength`` which would take values from the following table ``v___fits`` with its column `wavelength`. +For example, there are existing attributes like that can be mapped like `Wavelength` which would take values from the following table `v___fits` with its column `wavelength`. [More examples are here.](https://github.com/sunpy/sunpy-soar/issues/46#issuecomment-1557936562) This will project will partly be working out all of the connections for each table to enable these "translations". @@ -52,17 +52,17 @@ We do have one stretch goal and that would be to look into using [astroquery TAP ### Community Bonding Period -* Get familiar with the SOAR and TAP protocols. -* Setup a development environment. +- Get familiar with the SOAR and TAP protocols. +- Setup a development environment. ### Coding starts -* Start working on adding support for additional attributes. +- Start working on adding support for additional attributes. #### 1st evaluation -* Have the additional attributes implemented. +- Have the additional attributes implemented. #### Final evaluation -* Enable filters on the additional attributes. +- Enable filters on the additional attributes. diff --git a/src/content/pages/gsoc/2025/index.md b/src/content/pages/gsoc/2025/index.md new file mode 100644 index 00000000..6211d718 --- /dev/null +++ b/src/content/pages/gsoc/2025/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2025" +show_main: false +season: 2025 +--- diff --git a/_projects/2025/juliaastro/stingray_porting.md b/src/content/pages/gsoc/2025/juliaastro/stingray_porting.md similarity index 53% rename from _projects/2025/juliaastro/stingray_porting.md rename to src/content/pages/gsoc/2025/juliaastro/stingray_porting.md index 32d81990..170b0757 100644 --- a/_projects/2025/juliaastro/stingray_porting.md +++ b/src/content/pages/gsoc/2025/juliaastro/stingray_porting.md @@ -3,63 +3,65 @@ name: Spectral timing in Julia desc: Create a set of timing and spectral timing methods in Julia. # add a short one line description of your project requirements: -# Student requirements: - - Understanding Python code - - Julia knowledge + # Student requirements: + - Understanding Python code + - Julia knowledge difficulty: medium issues: # Related issues (if any) to this project. mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - matteobachetti - - stefanocovino - - fjebaker + # First person in contact; mentors may change before project starts. + # GitHub handles + - matteobachetti + - stefanocovino + - fjebaker initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - python - - Julia - - time series analysis + # Different technologies needed + - python + - Julia + - time series analysis collaborating_projects: -# suborganisation(s) to which this project belongs. - - stingray - - juliaAstro + # suborganization(s) to which this project belongs. + - stingray + - juliaAstro --- + ## Spectral timing in Julia -#### Description -The analysis of time series from astronomical observations in the X-rays is an +### Description + +The analysis of time series from astronomical observations in the X-rays is an excellent tool to test advanced physical theories. -Of particular interest are the periodicities that are often observed in the +Of particular interest are the periodicities that are often observed in the X-ray signals coming from the surroundings of accreting black holes, and the evolution of the rotation period of neutron stars. -The essential toolbox for X-ray timing analysis includes different kinds of +The essential toolbox for X-ray timing analysis includes different kinds of periodograms, cross spectra, and a number of "variability vs energy spectra", that allow to understand the variability at different energies. -This project is about the implementation of a basic set of X-ray timing analysis +This project is about the implementation of a basic set of X-ray timing analysis operations in Julia, continuing the porting of the core operations from the `stingray` Python package [initiated during Google Summer of Code 2022] -(https://github.com/StingraySoftware/Stingray.jl) +() -#### Milestones +### Milestones -##### Coding starts +#### Coding starts -* Gain familiarity with the codebase -* Apply existing analysis to simulated datasets -* Implement I/O operation on FITS files +- Gain familiarity with the codebase +- Apply existing analysis to simulated datasets +- Implement I/O operation on FITS files -##### 1st evaluation +#### 1st evaluation -* Implement a series of tests in Julia that the new code will have to pass -* Extend basic operations (periodograms and cross spectra) to event lists and light curves -* Time lags and coherence spectra +- Implement a series of tests in Julia that the new code will have to pass +- Extend basic operations (periodograms and cross spectra) to event lists and light curves +- Time lags and coherence spectra -##### Final evaluation +#### Final evaluation -* A working framework for variability vs energy spectra (covariance spectra, time lags) +- A working framework for variability vs energy spectra (covariance spectra, time lags) diff --git a/_projects/2025/radis/Exomol_electronic_spectra.md b/src/content/pages/gsoc/2025/radis/Exomol_electronic_spectra.md similarity index 56% rename from _projects/2025/radis/Exomol_electronic_spectra.md rename to src/content/pages/gsoc/2025/radis/Exomol_electronic_spectra.md index a43a1df8..b0aad192 100644 --- a/_projects/2025/radis/Exomol_electronic_spectra.md +++ b/src/content/pages/gsoc/2025/radis/Exomol_electronic_spectra.md @@ -3,34 +3,33 @@ name: Electronic spectra for RADIS # add a short one line description of your project desc: The project aims at adding the possibility to calculated electronic spectra with RADIS, mainly using the newly available molecules in ExoMol requirements: -# Student requirements: - - Knowledge of Pandas or other DataFrame libraries + # Student requirements: + - Knowledge of Pandas or other DataFrame libraries difficulty: medium issues: -- https://github.com/radis/radis/issues/724 + - https://github.com/radis/radis/issues/724 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - minouHub - - erwanp + # First person in contact; mentors may change before project starts. + # GitHub handles + - minouHub + - erwanp initiatives: - - GSOC + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - Python - - Vaex - - Pandas - - Git + # Different technologies needed + - Python + - Vaex + - Pandas + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- #### Description - The RADIS code was developed for the characterization of plasmas, flames and atmospheres. High-temperature spectral calculations require to resolve the shape of tens of millions of lines, which is the usual performance bottleneck. RADIS implements a new algorithm to compute these lineshapes, and is already one of the fastest line-by-line spectral codes available. @@ -43,42 +42,42 @@ Currently, it supports the computation of rovibrational spectra, which correspon Other codes allow to compute electronic spectra of diatomic molecules and can be used as a reference or comparison point: -* Moose - https://github.com/AntoineTUE/Moose -* MassiveOES - https://bitbucket.org/OES_muni/massiveoes (with Radis/MassiveOES example in https://github.com/radis/massiveOES-examples) -* ExoMol list - https://www.exomol.com/software/ +- Moose - +- MassiveOES - (with Radis/MassiveOES example in ) +- ExoMol list - #### Milestones ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) ##### 1st Evaluation -* Adapt how the EXOMOL database is currently employed to allow the computation of electronic spectra at **thermal equilibrium** (single temperature) +- Adapt how the EXOMOL database is currently employed to allow the computation of electronic spectra at **thermal equilibrium** (single temperature) -* Add documentation and example. Add tests against other spectral codes. +- Add documentation and example. Add tests against other spectral codes. -* To ease the understand of the physics behind the code, the contributor could start with non-equilibrium spectra of atomic species (see Secondary goals). This is entirely optional and up to the contributor. +- To ease the understand of the physics behind the code, the contributor could start with non-equilibrium spectra of atomic species (see Secondary goals). This is entirely optional and up to the contributor. ##### 2nd Evaluation -* Add the possibility to compute electronic spectra at **thermal non-equilibrium** (electronic temperature != translational temperature) +- Add the possibility to compute electronic spectra at **thermal non-equilibrium** (electronic temperature != translational temperature) -* Add documentation and example. Add tests against other spectral codes. +- Add documentation and example. Add tests against other spectral codes. -* For diatomic species, start a new database based on MassiveOES sources. +- For diatomic species, start a new database based on MassiveOES sources. ##### Final evaluation -* Have all code, tests, and documentation in GitHub. +- Have all code, tests, and documentation in GitHub. #### Secondary Goals -* RADIS can compute atomic spectra thanks to the hard work of GSOC 2023 and 2024 contributors, see https://github.com/radis/radis/pull/689. An interesting approach would be to start with non-equilibrium spectra of atomic species as the physics is slighly easier than for molecule. +- RADIS can compute atomic spectra thanks to the hard work of GSOC 2023 and 2024 contributors, see . An interesting approach would be to start with non-equilibrium spectra of atomic species as the physics is slighly easier than for molecule. -* Document architecture and developer guide when facing unclear points that may appear. +- Document architecture and developer guide when facing unclear points that may appear. -* Review pull requests from other RADIS contributors +- Review pull requests from other RADIS contributors diff --git a/_projects/2025/radis/Fast_Parsing.md b/src/content/pages/gsoc/2025/radis/Fast_Parsing.md similarity index 62% rename from _projects/2025/radis/Fast_Parsing.md rename to src/content/pages/gsoc/2025/radis/Fast_Parsing.md index 9e23d5a7..e305787f 100644 --- a/_projects/2025/radis/Fast_Parsing.md +++ b/src/content/pages/gsoc/2025/radis/Fast_Parsing.md @@ -3,30 +3,30 @@ name: Fast parsing of large databases and execution bottlenecks # add a short one line description of your project desc: The conversion of large files from a compressed format to hdf5 should be accelerated. requirements: -# Student requirements: - - Knowledge of Pandas or other DataFrame libraries + # Student requirements: + - Knowledge of Pandas or other DataFrame libraries difficulty: medium issues: -- https://github.com/radis/radis/issues/510 + - https://github.com/radis/radis/issues/510 mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - minouHub - - TranHuuNhatHuy - - dcmvdbekerom + # First person in contact; mentors may change before project starts. + # GitHub handles + - minouHub + - TranHuuNhatHuy + - dcmvdbekerom initiatives: - - GSOC + - GSOC project_size: - - 175 h + - 175 h tags: -# Different technologies needed - - Python - - Vaex - - Pandas - - Git + # Different technologies needed + - Python + - Vaex + - Pandas + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- #### Description @@ -47,32 +47,32 @@ The objective of this project is to accelerate the parsing to HDF5 files. ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Have set up a development environment, be familiar with open-source tools (GitHub / Git / Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) ##### 1st Evaluation -* Based on the demonstration of @dcmvdbekerom, implement a C++ new parsing algorithm in RADIS. The demonstration can be found [here](https://github.com/radis/radis/issues/510#issuecomment-2037688815), which includes a detailed explanation and code examples. +- Based on the demonstration of @dcmvdbekerom, implement a C++ new parsing algorithm in RADIS. The demonstration can be found in the [RADIS issue comment](https://github.com/radis/radis/issues/510#issuecomment-2037688815), which includes a detailed explanation and code examples. -* Add documentation and example. Add tests against other spectral codes. +- Add documentation and example. Add tests against other spectral codes. ##### 2nd Evaluation -* Propose a solution to save several HDF5 files instead of a large one in `.radisdb`. For example, save 10 files of 7 GB each instead of a single 70-GB file for HITEMP CO2 +- Propose a solution to save several HDF5 files instead of a large one in `.radisdb`. For example, save 10 files of 7 GB each instead of a single 70-GB file for HITEMP CO2 -* Write a review of current bottleneck in 1/ the **parsing** and 2/ the **computation** of spectra. This bottleneck review should be uploaded on the documentation, with working examples for small (~1 cm-1) and large (~100 cm-1) spectra. See this example: https://github.com/radis/radis/issues/685 +- Write a review of current bottleneck in 1/ the **parsing** and 2/ the **computation** of spectra. This bottleneck review should be uploaded on the documentation, with working examples for small (~1 cm-1) and large (~100 cm-1) spectra. See this example: -* Tackle some of the bottleneck by either modifying the code, leveraging numba, or writing a C++ code. +- Tackle some of the bottleneck by either modifying the code, leveraging numba, or writing a C++ code. ##### Final evaluation -* Have all code, tests, and documentation in GitHub. +- Have all code, tests, and documentation in GitHub. #### Secondary Goals -* Document architecture and developer guide when facing unclear points that may appear. +- Document architecture and developer guide when facing unclear points that may appear. -* Review pull requests from other RADIS contributors +- Review pull requests from other RADIS contributors -* Although this project is devoted to CPU computation, the interested contributor can also contribute to the resolution of GPU bottlenecks. For instance: in a GPU computation, the database first needs to be copied to a host buffer (i.e. CPU side), a so called 'staging buffer'. After that, the database can be copied to the GPU. For integrated GPU's, i.e. when the GPU is part of the CPU chip (like most Intel and AMD processors), the CPU and GPU memory is shared. Ideally, the database would directly be loaded into the staging buffer to prevent copying the same database 3 times (1: regular load, 2: staging buffer, 3: GPU buffer). +- Although this project is devoted to CPU computation, the interested contributor can also contribute to the resolution of GPU bottlenecks. For instance: in a GPU computation, the database first needs to be copied to a host buffer (i.e. CPU side), a so called 'staging buffer'. After that, the database can be copied to the GPU. For integrated GPU's, i.e. when the GPU is part of the CPU chip (like most Intel and AMD processors), the CPU and GPU memory is shared. Ideally, the database would directly be loaded into the staging buffer to prevent copying the same database 3 times (1: regular load, 2: staging buffer, 3: GPU buffer). diff --git a/_projects/2025/radis/Optimizing_Radis_app.md b/src/content/pages/gsoc/2025/radis/Optimizing_Radis_app.md similarity index 84% rename from _projects/2025/radis/Optimizing_Radis_app.md rename to src/content/pages/gsoc/2025/radis/Optimizing_Radis_app.md index 72d0ad0a..f1bbd725 100644 --- a/_projects/2025/radis/Optimizing_Radis_app.md +++ b/src/content/pages/gsoc/2025/radis/Optimizing_Radis_app.md @@ -3,36 +3,36 @@ name: Optimizing Radis app desc: Our project is all about enhancing user experience to the next level! We're committed to bringing you cutting-edge features and fine-tuning these features for maximum performance and efficiency, and rigorous testing to ensure they meet the needs of our highly valued end users. # add a short one line description of your project requirements: -# Student requirements - - TypeScript - - React - - FastApi - - Testing (pytest && vitest) + # Student requirements + - TypeScript + - React + - FastApi + - Testing (pytest && vitest) difficulty: medium issues: - - https://github.com/arunavabasucom/radis-app/issues/85 - - https://github.com/arunavabasucom/radis-app/issues/674 + - https://github.com/arunavabasucom/radis-app/issues/85 + - https://github.com/arunavabasucom/radis-app/issues/674 mentors: -# First person in contact; mentors may change before project starts -# GitHub handles - - erwanp - - arunavabasucom + # First person in contact; mentors may change before project starts + # GitHub handles + - erwanp + - arunavabasucom initiatives: - - GSOC + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - Python - - TypeScript - - JavaScript - - React - - Fastapi - - Pandas - - Git + # Different technologies needed + - Python + - TypeScript + - JavaScript + - React + - Fastapi + - Pandas + - Git collaborating_projects: -# suborganisation(s) to which this project belongs - - radis + # suborganization(s) to which this project belongs + - radis --- #### Description diff --git a/_projects/2025/stingray/interactive_database.md b/src/content/pages/gsoc/2025/stingray/interactive_database.md similarity index 78% rename from _projects/2025/stingray/interactive_database.md rename to src/content/pages/gsoc/2025/stingray/interactive_database.md index 2146ba53..fc7b3d79 100644 --- a/_projects/2025/stingray/interactive_database.md +++ b/src/content/pages/gsoc/2025/stingray/interactive_database.md @@ -1,57 +1,57 @@ --- -name: Interactive Database for X-ray observations +name: Interactive Database for X-ray observations # add a short one line description of your project desc: Create an interactive database for analyzing, storing, and classifying X-ray observations of accreting black holes # Student requirements: requirements: - - Understanding Python code - - Manages database + - Understanding Python code + - Manages database difficulty: medium issues: # Related issues (if any) to this project. # First person in contact; mentors may change before project starts. # GitHub handles mentors: -- mgullik -- matteobachetti + - mgullik + - matteobachetti # The programme under this project wish to run. initiatives: - - GSOC + - GSOC project_size: - - 350 h + - 350 h # Different technologies needed tags: - - python - - database - - time series analysis - - machine learning -# suborganisation(s) to which this project belongs. + - python + - database + - time series analysis + - machine learning +# suborganization(s) to which this project belongs. collaborating_projects: - - stingray + - stingray --- -# Interactive Database for X-ray observations +# Interactive Database for X-ray observations ## Description -The increasing number of X-ray telescopes observing accreting black hole sources -has led to an incredibly large amount of available observational data. -To build a comprehensive understanding of stellar-mass black hole phenomenology, +The increasing number of X-ray telescopes observing accreting black hole sources +has led to an incredibly large amount of available observational data. +To build a comprehensive understanding of stellar-mass black hole phenomenology, it is essential to access and analyze this information in an intuitive and structured manner. -This project aims at developing a tool that analyzes, stores, and organizes -key data products of multiple observations in a database. Users will be able to interactively explore -the database and classify individual observations based on data products -retrieved with Stingray, potentially leveraging innovative machine learning techniques. -Beyond enabling large-scale classification and the discovery of general trends -in accreting black hole binaries, the tool will allow astronomers to identify +This project aims at developing a tool that analyzes, stores, and organizes +key data products of multiple observations in a database. Users will be able to interactively explore +the database and classify individual observations based on data products +retrieved with Stingray, potentially leveraging innovative machine learning techniques. +Beyond enabling large-scale classification and the discovery of general trends +in accreting black hole binaries, the tool will allow astronomers to identify peculiar features hidden within the vast dataset. -Challenges: Efficient storage and fast retrieval of data products, +Challenges: Efficient storage and fast retrieval of data products, ensuring interactivity of the tool, and enabling comparisons across different X-ray instruments. ### Milestones - + #### Coding starts - Gain familiarity with the observations (different type of X-ray telescopes) and with the products diff --git a/_projects/2026/astropy/astropy_core_improvements.md b/src/content/pages/gsoc/2026/astropy/astropy_core_improvements.md similarity index 71% rename from _projects/2026/astropy/astropy_core_improvements.md rename to src/content/pages/gsoc/2026/astropy/astropy_core_improvements.md index db5306a0..fbd4c7a6 100644 --- a/_projects/2026/astropy/astropy_core_improvements.md +++ b/src/content/pages/gsoc/2026/astropy/astropy_core_improvements.md @@ -4,39 +4,39 @@ name: Hardening astropy's core stability desc: Improvements to astropy low level extension modules (C/C++/Cython) # Student requirements: requirements: - - at least one low level language (C or C++ prefered) - - testing in Python + - at least one low level language (C or C++ prefered) + - testing in Python # How difficult would you consider the project to be: low, medium, high difficulty: medium to high, depending on candidate # Related issues (if any) to this project. # Ideally you want at least one that describes the problem it is trying to solve issues: - - https://github.com/neutrinoceros/astropy-APEs/pull/1 - - https://github.com/astropy/astropy/issues/17760 - - https://github.com/astropy/astropy/issues/19249 + - https://github.com/neutrinoceros/astropy-APEs/pull/1 + - https://github.com/astropy/astropy/issues/17760 + - https://github.com/astropy/astropy/issues/19249 # First person in contact; mentors may change before project starts. # GitHub or GitLab handles mentors: - - neutrinoceros - - astrofrog - - nstarkman + - neutrinoceros + - astrofrog + - nstarkman # The programme under this project wish to run. At the moment only GSOC is available initiatives: - - GSOC + - GSOC project_size: - - 175 h + - 175 h # Different technologies needed tags: - - python - - meson-python - - C - - C++ - - Cython - - pytest -# suborganisation(s) to which this project belongs. + - python + - meson-python + - C + - C++ + - Cython + - pytest +# suborganization(s) to which this project belongs. collaborating_projects: - - astropy + - astropy --- # Hardening astropy's core stability @@ -47,8 +47,8 @@ Astropy is a mixed-language code base. Most of it is pure Python, but many hotpa written in lower level languages (Cython, C and C++). The former is where the vast majority of past and current development is conducted, while the latter in much more slowly paced. Meanwhile, the low-level layer overwhemingly dominates other important -aspects like complexity of *building* and distributing astropy releases, and takes an -estimated 20 to 50% share of astropy CI time for recompilation *of code that almost never changes*. +aspects like complexity of _building_ and distributing astropy releases, and takes an +estimated 20 to 50% share of astropy CI time for recompilation _of code that almost never changes_. It would be possible to decouple the bulk of the code base from its low level layer, for instance by splitting the latter into a separate package, but this new package would @@ -62,6 +62,7 @@ This project would be highly related to (although separable from) the [following APE](https://github.com/neutrinoceros/astropy-APEs/pull/1), which also contains more details on why the separation is desirable As such, it would also provide opportunities for exploratory works like + - migrating to a modern, externally maintained build system like Meson - rewritting, or incorporating `rust`-based extensions - exploring PEP 803/809 Limited API for Python 3.15 @@ -73,15 +74,15 @@ interests and time allocated. ### Coding starts -* set up dev env and tooling -* define a subset of astropy's extension modules to test, and testing strategy(ies) +- set up dev env and tooling +- define a subset of astropy's extension modules to test, and testing strategy(ies) ### 1st evaluation -* Write a test suite for a single subpackage's extensions -* Report on any difficulties met along the way, and identify (general ?) solutions +- Write a test suite for a single subpackage's extensions +- Report on any difficulties met along the way, and identify (general ?) solutions ### Final evaluation -* Complete test coverage for as many subpackages as possible -* Report on what (if anything) is still missing and identify a path forward +- Complete test coverage for as many subpackages as possible +- Report on what (if anything) is still missing and identify a path forward diff --git a/src/content/pages/gsoc/2026/index.md b/src/content/pages/gsoc/2026/index.md new file mode 100644 index 00000000..fa7dc964 --- /dev/null +++ b/src/content/pages/gsoc/2026/index.md @@ -0,0 +1,5 @@ +--- +title: "Ideas page for Google Summer of Code 2026" +show_main: false +season: 2026 +--- diff --git a/_projects/2026/juliaastro/spectra.md b/src/content/pages/gsoc/2026/juliaastro/spectra.md similarity index 82% rename from _projects/2026/juliaastro/spectra.md rename to src/content/pages/gsoc/2026/juliaastro/spectra.md index 87f56c3a..39b3a146 100644 --- a/_projects/2026/juliaastro/spectra.md +++ b/src/content/pages/gsoc/2026/juliaastro/spectra.md @@ -2,29 +2,29 @@ name: Spectra.jl across the electromagnetic spectrum desc: Help develop Spectrajl and friends with JuliaAstro! requirements: - - Familiarity with Julia + - Familiarity with Julia difficulty: medium # Related issues (if any) to this project. # Ideally you want at least one that describes the problem it is trying to solve issues: - - https://github.com/JuliaAstro/Spectra.jl/issues/41 + - https://github.com/JuliaAstro/Spectra.jl/issues/41 # First person in contact; mentors may change before project starts. # GitHub or GitLab handles mentors: - - fjebaker - - icweaver - - cgarling - - barrettp + - fjebaker + - icweaver + - cgarling + - barrettp initiatives: - - GSOC + - GSOC project_size: - - 175 h (Medium) + - 175 h (Medium) # Different technologies needed tags: - - Julia -# suborganisation(s) to which this project belongs. + - Julia +# suborganization(s) to which this project belongs. collaborating_projects: - - juliaAstro + - juliaAstro --- ## Spectra.jl across the electromagnetic spectrum @@ -59,40 +59,41 @@ uniform interface in Spectra.jl for loading datasets and their associated metadata, and for performing basic manipulations and first-look analyses. For some further discussion, see: + - https://github.com/JuliaAstro/Spectra.jl/pull/24 #### Project Milestones ##### Coding starts -* Learn about the different spectral data types and what makes, e.g. radio or +- Learn about the different spectral data types and what makes, e.g. radio or X-ray, spectra unusual. -* Learn about [FITS](https://en.wikipedia.org/wiki/FITS) tables and other common +- Learn about [FITS](https://en.wikipedia.org/wiki/FITS) tables and other common astronomical data formats for spectra. -* Learn about [Test Driven Development +- Learn about [Test Driven Development (TDD)](https://en.wikipedia.org/wiki/Test-driven_development), and techniques for writing robust and reliable software. We are curating a library of spectral data that Spectra.jl needs to be compatible with, and so TDD will be our guide in staying focused. -* Familiarise yourself with the existing routines in Spectra.jl, and the +- Familiarise yourself with the existing routines in Spectra.jl, and the [OGIP](https://heasarc.gsfc.nasa.gov/docs/heasarc/ofwg/docs/spectra/ogip_92_007.pdf) parser in SpectralFitting.jl. ##### 1st evaluation -* To have moved and integrated the OGIP parser from SpectralFitting.jl to +- To have moved and integrated the OGIP parser from SpectralFitting.jl to Spectra.jl. This should be a relatively easy and informative way to start, as all the code and tests have been written, and you will learn about the internals of Spectra.jl in the process. -* To have implemented data loading for (at least) one spectral datatype of your +- To have implemented data loading for (at least) one spectral datatype of your choice. In choosing which to implement, you can pick the difficulty that you feel is appropriate. ##### Final evaluation -* A revamped Spectra.jl; that is: -* To have implemented data loading for a significant portion of our library of +- A revamped Spectra.jl; that is: +- To have implemented data loading for a significant portion of our library of example spectra (ideally, for at least three different file formats). -* To provide some common routines, such as rebinning according to different +- To provide some common routines, such as rebinning according to different heuristics (e.g. minimum flux, signal to noise, count rates, ...), adjusting the wavelength or energy shifts, or converting between common units. diff --git a/_projects/2026/juliaastro/stingray_porting.md b/src/content/pages/gsoc/2026/juliaastro/stingray_porting.md similarity index 60% rename from _projects/2026/juliaastro/stingray_porting.md rename to src/content/pages/gsoc/2026/juliaastro/stingray_porting.md index 0a5bc58d..dd0d2748 100644 --- a/_projects/2026/juliaastro/stingray_porting.md +++ b/src/content/pages/gsoc/2026/juliaastro/stingray_porting.md @@ -3,44 +3,46 @@ name: Spectral timing in Julia desc: Create a set of timing and spectral timing methods in Julia. # add a short one line description of your project requirements: -# Student requirements: - - Understanding Python code - - Julia knowledge + # Student requirements: + - Understanding Python code + - Julia knowledge difficulty: medium issues: # Related issues (if any) to this project. mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - fjebaker - - matteobachetti + # First person in contact; mentors may change before project starts. + # GitHub handles + - fjebaker + - matteobachetti initiatives: -# The programme under this project wish to run. - - GSOC + # The programme under this project wish to run. + - GSOC project_size: - - 350 h + - 350 h tags: -# Different technologies needed - - python - - Julia - - time series analysis + # Different technologies needed + - python + - Julia + - time series analysis collaborating_projects: -# suborganisation(s) to which this project belongs. - - stingray - - juliaAstro + # suborganization(s) to which this project belongs. + - stingray + - juliaAstro --- + ## Spectral timing in Julia #### Description -The analysis of time series from astronomical observations in the X-rays is an + +The analysis of time series from astronomical observations in the X-rays is an excellent tool to test advanced physical theories. -Of particular interest are the periodicities that are often observed in the +Of particular interest are the periodicities that are often observed in the X-ray signals coming from the surroundings of accreting black holes, and the evolution of the rotation period of neutron stars. -The essential toolbox for X-ray timing analysis includes different kinds of +The essential toolbox for X-ray timing analysis includes different kinds of periodograms, cross spectra, and a number of "variability vs energy spectra", that allow to understand the variability at different energies. -This project is about the implementation of a basic set of X-ray timing analysis +This project is about the implementation of a basic set of X-ray timing analysis operations in Julia, continuing the porting of the core operations from the `stingray` Python package [initiated during Google Summer of Code 2022 and 2025] (https://github.com/StingraySoftware/Stingray.jl) @@ -49,16 +51,16 @@ operations in Julia, continuing the porting of the core operations from the ##### Coding starts -* Gain familiarity with the codebase -* Apply existing analysis to simulated datasets -* Implement I/O operation on FITS files +- Gain familiarity with the codebase +- Apply existing analysis to simulated datasets +- Implement I/O operation on FITS files ##### 1st evaluation -* Implement a series of tests in Julia that the new code will have to pass -* Extend basic operations (periodograms and cross spectra) to event lists and light curves -* Time lags and coherence spectra +- Implement a series of tests in Julia that the new code will have to pass +- Extend basic operations (periodograms and cross spectra) to event lists and light curves +- Time lags and coherence spectra ##### Final evaluation -* A working framework for variability vs energy spectra (covariance spectra, time lags) +- A working framework for variability vs energy spectra (covariance spectra, time lags) diff --git a/_projects/2026/lincc-fw/pyarrow4astro.md b/src/content/pages/gsoc/2026/lincc-fw/pyarrow4astro.md similarity index 72% rename from _projects/2026/lincc-fw/pyarrow4astro.md rename to src/content/pages/gsoc/2026/lincc-fw/pyarrow4astro.md index 43e273ed..db196a81 100644 --- a/_projects/2026/lincc-fw/pyarrow4astro.md +++ b/src/content/pages/gsoc/2026/lincc-fw/pyarrow4astro.md @@ -4,39 +4,39 @@ name: PyArrow improvements for astronomy desc: Improve and speed up PyArrow for nested arrays to enable on-scale time-domain analysis in astronomy. # Student requirements: requirements: - - Be familiar with C++ - - Basic Python - - Basic Git + - Be familiar with C++ + - Basic Python + - Basic Git # How difficult would you consider the project to be: low, medium, high difficulty: medium # Related issues (if any) to this project. # Ideally you want at least one that describes the problem it is trying to solve issues: - - https://github.com/apache/arrow/issues/48636 - - https://github.com/apache/arrow/issues/44544 - - https://github.com/apache/arrow/issues/46329 - - https://github.com/apache/arrow/issues/29558 - - https://github.com/lincc-frameworks/nested-pandas/issues/52 - - https://github.com/lincc-frameworks/nested-pandas/issues/421 - - https://github.com/pandas-dev/pandas/issues/60073 + - https://github.com/apache/arrow/issues/48636 + - https://github.com/apache/arrow/issues/44544 + - https://github.com/apache/arrow/issues/46329 + - https://github.com/apache/arrow/issues/29558 + - https://github.com/lincc-frameworks/nested-pandas/issues/52 + - https://github.com/lincc-frameworks/nested-pandas/issues/421 + - https://github.com/pandas-dev/pandas/issues/60073 # First person in contact; mentors may change before project starts. # GitHub or GitLab handles mentors: - - hombit - - delucchi-cmu - - nevencaplar + - hombit + - delucchi-cmu + - nevencaplar # The programme under this project wish to run. At the moment only GSOC is available initiatives: - - GSOC + - GSOC project_size: - - 350 h (Large) + - 350 h (Large) # Different technologies needed tags: - - c++ - - python -# suborganisation(s) to which this project belongs. + - c++ + - python +# suborganization(s) to which this project belongs. collaborating_projects: - - lincc-frameworks + - lincc-frameworks --- ## pyarrow Improvements for Astronomy @@ -65,18 +65,18 @@ This project will contribute improvements directly to Apache Arrow, benefiting b ##### Coding starts -* Set up Arrow development environment and build from source -* Familiarize with Arrow's C++ codebase, compute kernel architecture, and Parquet reader -* Review linked issues and create detailed implementation plan +- Set up Arrow development environment and build from source +- Familiarize with Arrow's C++ codebase, compute kernel architecture, and Parquet reader +- Review linked issues and create detailed implementation plan ##### 1st evaluation -* Implement at least one new compute kernel or Parquet reader improvement -* Write unit tests and benchmarks for new functionality -* Submit initial PR to Apache Arrow +- Implement at least one new compute kernel or Parquet reader improvement +- Write unit tests and benchmarks for new functionality +- Submit initial PR to Apache Arrow ##### Final evaluation -* Complete implementation of planned improvements -* Address code review feedback and get PRs merged -* Document new functionality with examples relevant to astronomy use cases +- Complete implementation of planned improvements +- Address code review feedback and get PRs merged +- Document new functionality with examples relevant to astronomy use cases diff --git a/_projects/2026/radis/vaex_alternatives.md b/src/content/pages/gsoc/2026/radis/vaex_alternatives.md similarity index 67% rename from _projects/2026/radis/vaex_alternatives.md rename to src/content/pages/gsoc/2026/radis/vaex_alternatives.md index 41af2ba4..2eb78f14 100644 --- a/_projects/2026/radis/vaex_alternatives.md +++ b/src/content/pages/gsoc/2026/radis/vaex_alternatives.md @@ -3,35 +3,35 @@ name: Integrate a modern lazy-loading alternative for large-scale spectroscopic # add a short one line description of your project desc: Replace the unmaintained Vaex library with an actively-maintained alternative (Polars, DuckDB, or Dask) to efficiently handle large spectroscopic databases (50GB+) through lazy loading, memory mapping, and optimized I/O operations. requirements: -# Student requirements: - - Proficiency in Python and DataFrame libraries (Pandas, Polars, or similar) - - Familiarity with benchmarking and performance profiling - - Understanding of memory-efficient data processing techniques - - Experience with HDF5 or Parquet file formats is a plus + # Student requirements: + - Proficiency in Python and DataFrame libraries (Pandas, Polars, or similar) + - Familiarity with benchmarking and performance profiling + - Understanding of memory-efficient data processing techniques + - Experience with HDF5 or Parquet file formats is a plus difficulty: medium mentors: -# First person in contact; mentors may change before project starts. -# GitHub handles - - Prtm2110 - - minouHub + # First person in contact; mentors may change before project starts. + # GitHub handles + - Prtm2110 + - minouHub initiatives: - - GSOC + - GSOC project_size: - - 350 h (Large) + - 350 h (Large) tags: -# Different technologies needed - - Python - - Polars - - DuckDB - - Dask - - Pandas - - HDF5 - - Parquet - - Benchmarking - - Git + # Different technologies needed + - Python + - Polars + - DuckDB + - Dask + - Pandas + - HDF5 + - Parquet + - Benchmarking + - Git collaborating_projects: -# suborganisation(s) to which this project belongs. - - radis + # suborganization(s) to which this project belongs. + - radis --- ## Integrate a modern lazy-loading alternative for large-scale spectroscopic database processing @@ -54,54 +54,54 @@ The selected solution should maintain or improve upon Vaex's memory efficiency w ##### Coding starts -* Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) +- Engage with the community on [💬 RADIS Slack](https://github.com/radis/slack-invite) -* Set up a development environment, become familiar with open-source tools (GitHub/Git/Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) +- Set up a development environment, become familiar with open-source tools (GitHub/Git/Tests) and [RADIS architecture](https://radis.readthedocs.io/en/latest/dev/developer.html#architecture) ##### 1st Evaluation -* Research and benchmark alternatives: Conduct systematic performance evaluation comparing Polars, DuckDB, and Dask against current Vaex implementation +- Research and benchmark alternatives: Conduct systematic performance evaluation comparing Polars, DuckDB, and Dask against current Vaex implementation -* Generate comprehensive benchmark report covering: +- Generate comprehensive benchmark report covering: - Memory usage patterns (peak memory, memory mapping efficiency) - Lazy evaluation capabilities - Integration complexity with existing RADIS codebase -* Select the optimal alternative based on benchmarking results and present findings to mentors +- Select the optimal alternative based on benchmarking results and present findings to mentors ##### 2nd Evaluation -* Implement the selected alternative in RADIS codebase: +- Implement the selected alternative in RADIS codebase: - Refactor database loading functions to use the new library - Ensure backward compatibility with existing HDF5 files - Implement lazy loading for HITEMP CO2 and H2O databases -* Develop comprehensive unit tests and integration tests +- Develop comprehensive unit tests and integration tests -* Profile and optimize memory usage for 50GB+ files to ensure they remain under memory limits +- Profile and optimize memory usage for 50GB+ files to ensure they remain under memory limits -* Document migration strategy and API changes +- Document migration strategy and API changes ##### Final evaluation -* Complete integration with production-ready code: +- Complete integration with production-ready code: - Addition of a new package able to fully replace the Vaex dependencies. The choice of the package to use will be done by the user using parameters in `radis.json` via the parameter `DATAFRAME_ENGINE` - Performance validation showing maintained or improved speed -* Comprehensive documentation: +- Comprehensive documentation: - User guide for database operations with the new system - Performance comparison report (before/after metrics), see vaex_vs_pandas_performance.py -* Identify and document additional I/O bottlenecks discovered during implementation +- Identify and document additional I/O bottlenecks discovered during implementation -* All code merged to main branch with passing CI/CD tests +- All code merged to main branch with passing CI/CD tests #### Secondary Goals -* Explore file format alternatives to HDF5 (e.g., Parquet with better compression ratios and faster I/O) +- Explore file format alternatives to HDF5 (e.g., Parquet with better compression ratios and faster I/O) -* Profile GPU acceleration opportunities for data processing operations if time permits +- Profile GPU acceleration opportunities for data processing operations if time permits -* Document architecture and developer guide for future maintainers +- Document architecture and developer guide for future maintainers -* Review pull requests from other RADIS contributors +- Review pull requests from other RADIS contributors diff --git a/_projects/2026/reltrans/profiling_reltrans.md b/src/content/pages/gsoc/2026/reltrans/profiling_reltrans.md similarity index 64% rename from _projects/2026/reltrans/profiling_reltrans.md rename to src/content/pages/gsoc/2026/reltrans/profiling_reltrans.md index 51f5f1fc..22fe9b3f 100644 --- a/_projects/2026/reltrans/profiling_reltrans.md +++ b/src/content/pages/gsoc/2026/reltrans/profiling_reltrans.md @@ -3,33 +3,34 @@ name: Profiling and Performance Optimization of Reltrans desc: Code profiling to identify performance bottlenecks and implement targeted optimizations # add a short one line description of your project requirements: -# Student requirements: - - Fortran knowledge - - Use of code profiling tools + # Student requirements: + - Fortran knowledge + - Use of code profiling tools difficulty: medium # How difficult would you consider the project to be: low, medium, high issues: -# Related issues (if any) to this project. -# Ideally you want at least one that describes the problem it is trying to solve -- https://github.com/reltrans/reltrans/issues/61 + # Related issues (if any) to this project. + # Ideally you want at least one that describes the problem it is trying to solve + - https://github.com/reltrans/reltrans/issues/61 mentors: -# First person in contact; mentors may change before project starts. -# GitHub or GitLab handles - - mgullik - - matteolucchini1 + # First person in contact; mentors may change before project starts. + # GitHub or GitLab handles + - mgullik + - matteolucchini1 initiatives: -# The programme under this project wish to run. At the moment only GSOC is available - - GSOC + # The programme under this project wish to run. At the moment only GSOC is available + - GSOC project_size: - - 175 h (Medium) + - 175 h (Medium) tags: -# Different technologies needed - - fortran - - code profiling tools + # Different technologies needed + - fortran + - code profiling tools collaborating_projects: -# suborganisation(s) to which this project belongs. - - reltrans + # suborganization(s) to which this project belongs. + - reltrans --- + ## Profiling and Performance Optimization of Reltrans #### Description @@ -52,20 +53,19 @@ will be implemented to reduce runtime while preserving numerical accuracy and sc The outcome will be faster model evaluations, improved scalability, and a more sustainable codebase for future development. - #### Project Milestones ##### Coding starts -* Familiarization with the code -* Setup of profiling tools and baseline performance measurements +- Familiarization with the code +- Setup of profiling tools and baseline performance measurements ##### 1st evaluation -* Identification of main performance bottlenecks -* Initial optimization and benchmarking of the most critical portion of the code +- Identification of main performance bottlenecks +- Initial optimization and benchmarking of the most critical portion of the code ##### Final evaluation -* Implementation of further targeted optimizations -* Documentation of profiling methods and optimization results \ No newline at end of file +- Implementation of further targeted optimizations +- Documentation of profiling methods and optimization results diff --git a/_projects/2026/reltrans/tutorial_and_unit-testing.md b/src/content/pages/gsoc/2026/reltrans/tutorial_and_unit-testing.md similarity index 65% rename from _projects/2026/reltrans/tutorial_and_unit-testing.md rename to src/content/pages/gsoc/2026/reltrans/tutorial_and_unit-testing.md index 26eb5482..043f6c48 100644 --- a/_projects/2026/reltrans/tutorial_and_unit-testing.md +++ b/src/content/pages/gsoc/2026/reltrans/tutorial_and_unit-testing.md @@ -3,36 +3,37 @@ name: Interactive Tutorials and Automated Testing for the Reltrans Code desc: Create a series of tutorials on how to use the reltrans code and a suite of unit tests # add a short one line description of your project requirements: -# Student requirements: - - Basic Fortran knowledge - - Implementation of Python code - - Use of python notebook + # Student requirements: + - Basic Fortran knowledge + - Implementation of Python code + - Use of python notebook difficulty: medium # How difficult would you consider the project to be: low, medium, high issues: -# Related issues (if any) to this project. -# Ideally you want at least one that describes the problem it is trying to solve -- https://github.com/reltrans/reltrans/issues/59 -- https://github.com/reltrans/reltrans/issues/60 -- https://github.com/reltrans/reltrans/issues/13 + # Related issues (if any) to this project. + # Ideally you want at least one that describes the problem it is trying to solve + - https://github.com/reltrans/reltrans/issues/59 + - https://github.com/reltrans/reltrans/issues/60 + - https://github.com/reltrans/reltrans/issues/13 mentors: -# First person in contact; mentors may change before project starts. -# GitHub or GitLab handles - - mgullik - - fjebaker + # First person in contact; mentors may change before project starts. + # GitHub or GitLab handles + - mgullik + - fjebaker initiatives: -# The programme under this project wish to run. At the moment only GSOC is available - - GSOC + # The programme under this project wish to run. At the moment only GSOC is available + - GSOC project_size: - - 350 h (Large) + - 350 h (Large) tags: -# Different technologies needed - - python - - fortran + # Different technologies needed + - python + - fortran collaborating_projects: -# suborganisation(s) to which this project belongs. - - reltrans + # suborganization(s) to which this project belongs. + - reltrans --- + ## Interactive Tutorials and Automated Testing for the Reltrans Code #### Description @@ -70,25 +71,23 @@ Reltrans as a community-driven scientific software package. ##### Coding starts -* Familiarization with the Reltrans codebase, including the Fortran core and existing Python wrappers -* Review of current documentation and identification of key user workflows -* Design of the tutorial structure and outline of individual Python notebooks -* Setup of the testing framework and definition of testing standards and conventions - +- Familiarization with the Reltrans codebase, including the Fortran core and existing Python wrappers +- Review of current documentation and identification of key user workflows +- Design of the tutorial structure and outline of individual Python notebooks +- Setup of the testing framework and definition of testing standards and conventions ##### 1st evaluation -* Delivery of initial Python notebook tutorials covering: +- Delivery of initial Python notebook tutorials covering: - Installation and environment setup - Basic usage of the Python interface - Core functionality and typical analysis workflows -* Implementation of unit tests for the most critical components of the Python wrappers -* Initial integration of tests into the existing development workflow - +- Implementation of unit tests for the most critical components of the Python wrappers +- Initial integration of tests into the existing development workflow ##### Final evaluation -* Completion of the full tutorial series, including advanced usage examples and best practices -* Expanded unit test coverage, including edge cases and regression tests -* Documentation for contributors explaining how to extend both the tutorials and the test suite -* Final code cleanup and preparation for long-term maintenance +- Completion of the full tutorial series, including advanced usage examples and best practices +- Expanded unit test coverage, including edge cases and regression tests +- Documentation for contributors explaining how to extend both the tutorials and the test suite +- Final code cleanup and preparation for long-term maintenance diff --git a/_projects/2026/sunpy/radiospectra.md b/src/content/pages/gsoc/2026/sunpy/radiospectra.md similarity index 89% rename from _projects/2026/sunpy/radiospectra.md rename to src/content/pages/gsoc/2026/sunpy/radiospectra.md index 7dd6bde3..049d5d01 100644 --- a/_projects/2026/sunpy/radiospectra.md +++ b/src/content/pages/gsoc/2026/sunpy/radiospectra.md @@ -4,34 +4,34 @@ name: Improving radiospectra’s Functionality and Interoperability desc: Improving radiospectra’s interoperability by redesining the spectral data container and adding commonly requested usability features # Student requirements: requirements: - - python + - python # How difficult would you consider the project to be: low, medium, high difficulty: high # Related issues (if any) to this project. # Ideally you want at least one that describes the problem it is trying to solve issues: -- https://github.com/sunpy/radiospectra/issues/82 -- https://github.com/sunpy/radiospectra/issues/85 -- https://github.com/sunpy/radiospectra/issues/129 -- https://github.com/sunpy/radiospectra/issues/53 + - https://github.com/sunpy/radiospectra/issues/82 + - https://github.com/sunpy/radiospectra/issues/85 + - https://github.com/sunpy/radiospectra/issues/129 + - https://github.com/sunpy/radiospectra/issues/53 # First person in contact; mentors may change before project starts. # GitHub or GitLab handles mentors: - - samaloney - - hayesla + - samaloney + - hayesla # The programme under this project wish to run. At the moment only GSOC is available initiatives: - - GSOC + - GSOC project_size: - - 350 h (Large) + - 350 h (Large) # Different technologies needed tags: - - python + - python -# suborganisation(s) to which this project belongs. +# suborganization(s) to which this project belongs. collaborating_projects: - - sunpy + - sunpy --- ## Improving radiospectra's functionality and interoperability @@ -47,6 +47,7 @@ The result will be a modern, extensible, and user-friendly foundation for radio ##### Expected Outcomes By the end of the project the contributor will deliver: + - A redesigned, coordinate-aware Spectra object with a clear external API that: - Provides a WCS-like mapping from physical coordinates (time, frequency) to array indices - Supports axis-aware operations (e.g., slicing, scaling, statistics) by index or coordinate @@ -59,13 +60,13 @@ By the end of the project the contributor will deliver: - Coordinate slicing and analysis workflows - Background subtraction use cases - Improved plotting of gappy spectral data - - Updated documentation and test coverage to support new functionality +- Updated documentation and test coverage to support new functionality #### Project Milestones ##### Coding starts -- Get familiar with the SunPy organisation and the radiospectra codebase +- Get familiar with the SunPy organization and the radiospectra codebase - Review existing radiospectra functionality and open issues - Discuss and refine design choices for the Spectra data model with mentors - Survey existing approaches (NDCube, xarray, Astropy WCS) and agree on an implementation plan diff --git a/_projects/_template.md b/src/content/pages/gsoc/_project_template.md similarity index 74% rename from _projects/_template.md rename to src/content/pages/gsoc/_project_template.md index 9b42ab51..db3c3315 100644 --- a/_projects/_template.md +++ b/src/content/pages/gsoc/_project_template.md @@ -1,40 +1,41 @@ --- name: Example project # Add a short one line description of your project -desc: This is the first idea for suborg +desc: This is the first idea for sub-org # Student requirements: requirements: - - Knowledge on pythonic physics. - - Familiar with numerical methods + - Knowledge on pythonic physics. + - Familiar with numerical methods # How difficult would you consider the project to be: low, medium, high difficulty: low # Related issues (if any) to this project. # Ideally you want at least one that describes the problem it is trying to solve issues: - - https://github.com/org/org_repo/issues/4444 - - https://github.com/org/org_repo/issues/5555 + - https://github.com/org/org_repo/issues/4444 + - https://github.com/org/org_repo/issues/5555 # First person in contact; mentors may change before project starts. # GitHub or GitLab handles mentors: - - astrorobot + - astrorobot # The programme under this project wish to run. At the moment only GSOC is available initiatives: - - GSOC + - GSOC +# Pick one size. project_size: - - 90 h (Small) - - 175 h (Medium) - - 350 h (Large) + - 90 h (Small) + - 175 h (Medium) + - 350 h (Large) # Different technologies needed tags: - - python - - postgres -# suborganisation(s) to which this project belongs. + - python + - postgres +# Sub-organization(s) to which this project belongs. collaborating_projects: - - astropy - - juliaAstro + - astropy + - juliaAstro --- -# This is an awesome project idea for suborg. +# This is an awesome project idea for suborg ## Description @@ -54,12 +55,12 @@ quam. ### Coding starts -* Be awesome +- Be awesome ### 1st evaluation -* Have done awesome stuff. +- Have done awesome stuff. ### Final evaluation -* Finished the awesome stuff. +- Finished the awesome stuff. diff --git a/gsoc/background.md b/src/content/pages/gsoc/background.md similarity index 50% rename from gsoc/background.md rename to src/content/pages/gsoc/background.md index 0df559e4..c607c8ac 100644 --- a/gsoc/background.md +++ b/src/content/pages/gsoc/background.md @@ -1,66 +1,51 @@ --- -layout: default -title: "Background on GSoC: start here!" +title: "Background on GSoC: Start Here!" show_main: false --- -# Background: Start Here! +# Background on GSoC: Start Here -### What is GSoC? +## What is Google Summer of Code (GSoC)? -Google Summer of Code is a remote summer coding program funded by -Google. Google distributes funds to open software development organizations to -recruit new developers and mentors for summer mentorships. You get paid to write -software at home (or wherever you like), with guidance from expert mentors -distributed around the globe. +Google Summer of Code is a remote summer coding program funded by Google. +Google distributes funds to open software development organizations to recruit new developers and mentors for summer mentorships. +You will get paid to write software at home (or wherever you like), with guidance from expert mentors distributed around the globe. -To apply to be a GSoC contributor, you must write an application to [GSoC] for one or -more OpenAstronomy project ideas. Each summer, [several projects][oa projects] are offered by -[OpenAstronomy mentors][oa mentors], with well-defined scope and pre-requisite -experience. If you are selected by OpenAstronomy, you will be a GSoC contributor. +To apply to be a GSoC contributor, you must write an application to [GSoC] for one or more OpenAstronomy project ideas. +Each summer, [several projects][oa projects] are offered by [OpenAstronomy mentors][oa mentors], with well-defined scope and pre-requisite experience. +If you are selected by OpenAstronomy, you will become a GSoC contributor. -### What is OpenAstronomy? +## What is OpenAstronomy (OA)? -OpenAstronomy is an umbrella organization which acts as an interface between -the Google Summer of Code and several open source, open development projects -in the astronomical community, including [astropy], [sunpy], and [several -other astronomy projects][oa members]. It coordinates mentors and projects -for Google Summer of Code mentorships related to astronomy. +OpenAstronomy is an umbrella organization which acts as an interface between the Google Summer of Code and several open source, open development projects in the astronomical community, including [astropy], [sunpy], and [several other astronomy projects][oa members]. +It coordinates mentors and projects for Google Summer of Code mentorships related to astronomy. -### What is the application process? +## What is the application process? -You must submit your application to the [Google Summer of Code][GSoC], but -it's preferable that you also share it well before the deadline with your -potential project mentors or the rest of the community. Then they will be -able to give you feedback before officially submitting it. Check the -[application template][application]. You can also find applications from -previous years in the GitHub wiki pages of some of the OpenAstronomy -members. +You must submit your application to the [Google Summer of Code][GSoC], but it's preferable that you also share it well before the deadline with your potential project mentors or the rest of the community. +Then they will be able to give you feedback before officially submitting it. +While OpenAstronomy has a [application template on the wiki][application], it is very possible that the project has its own template and you should use that instead. +You can also find applications from previous years in the GitHub wiki pages of some of the OpenAstronomy members. The complete details on applying are in the [GSoC Contributor Guide]. -### Who is eligible to apply to GSoC? +## Who is eligible to apply to GSoC? Until 2021, GSoC was a programme eligible exclusively to university students. -The ultimate goal of GSoC has always been to attract and retain new open source -contributors. Hence, as of its 2022 edition, the student status is no longer required, -and one is eligible to take part in GSoC as long as they are an "open source beginner". +The ultimate goal of GSoC has always been to attract and retain new open source contributors. +Hence, as of its 2022 edition, the student status is no longer required, and one is eligible to take part in GSoC as long as they are an "open source beginner". -On the OpenAstronomy side, we actively seek self-motivated applicants -with _some_ experience developing software in -Python and other languages. We are especially looking -for individuals who are genuinely interested in developing open source software. -You don't need to be a Python guru or an astronomical coordinate system expert to be -eligible -- projects are available that cover a range of previous experience -in Python and astronomy. Individuals from any background from anywhere around -the world are encouraged to apply. +On the OpenAstronomy side, we actively seek self-motivated applicants with _some_ experience developing software regardless of programming language. +We are especially looking for individuals who are genuinely interested in developing open source software. +You don't need to be a Python guru or an astronomical coordinate system expert to be eligible -- projects are available that cover a range of previous experience in Python and astronomy. +Individuals from any background from anywhere around the world are encouraged to apply. -### Testimonials +## Testimonials > In the summer after my second year of graudate school, I didn't have funding > to work on any projects in my home department. I applied and was selected for > GSoC 2015, and I worked with another student and several encouraging mentors on -> developing a new astropy affliated package, called +> developing a new astropy affiliated package, called > [astroplan](http://astroplan.readthedocs.io/). The program greatly improved > my coding style, taught me loads about managing large projects, version control, > testing, and packaging. Do you have a summer without research funding? Apply! @@ -82,26 +67,17 @@ the world are encouraged to apply. [Zé Vinícius][mirca], EE undergraduate student, GSoC 2016 -### Apply! +## Apply -Now that you know you're a good candidate, check out the [GSoC Contributor Guide] -to learn how to apply. - -{% assign year = 2015 %} -{% for pro in site.projects %} - {% assign path_project = pro.path | split: '/' %} - {% assign year_project = path_project[1] | abs %} - {% if year_project > year %} - {% assign year = year_project %} - {% endif %} -{% endfor %} +Now that you know you're a good candidate, check out the [GSoC Contributor Guide] to learn how to apply. +Also check out [the OpenAstronomy Contributor Guidelines.](../contributor_guidelines/) [GSoC]: https://summerofcode.withgoogle.com/ -[oa projects]: /gsoc/gsoc{{ year }}/ -[oa mentors]: /gsoc/gsoc{{ year }}/#/mentors +[oa projects]: ../2026/ +[oa mentors]: ../2026/#mentors [astropy]: http://www.astropy.org [sunpy]: http://sunpy.org -[oa members]: /members/ +[oa members]: ../../members/ [application]: https://github.com/OpenAstronomy/gsoc-proposals/blob/main/template.md [GSoC Contributor Guide]: https://google.github.io/gsocguides/student/ [bmorris3]: https://github.com/bmorris3 diff --git a/src/content/pages/gsoc/contributor_guidelines.md b/src/content/pages/gsoc/contributor_guidelines.md new file mode 100644 index 00000000..b6590663 --- /dev/null +++ b/src/content/pages/gsoc/contributor_guidelines.md @@ -0,0 +1,107 @@ +--- +title: "GSoC Contributor Application Guidelines" +show_main: false +--- + +# GSoC Contributor Application Guidelines + +## What are the requirements to be accepted for GSoC? + +[These are the formal requirements from Google](https://developers.google.com/open-source/gsoc/faq#what_are_the_eligibility_requirements_for_participation). +There are OpenAstronomy requirements below which you have to also follow. + +## Communication Channels + +OpenAstronomy is a collaboration between open source astronomy and astrophysics projects and as such, to get help you need to find the specific project you are interested in: + +1. Browse the **[Project Ideas Page](../)** to find a project that interests you. +2. Check the **[Members Page](../../members/)** to find the chat links for that specific organization. +3. Join _that_ organization's chat to talk to the mentors! + +--- + +If you want to apply to OpenAstronomy to participate in GSoC there are many things you can do to improve your application. +Many of OpenAstronomy's admins and mentors have participated in previous editions of GSoC with their projects, so will be able to answer any questions you might have, come talk to us on the [OpenAstronomy discourse](https://community.openastronomy.org). + +There are many guidelines on writing a good application and how to increase your chances, this guide covers the most important things to OpenAstronomy. +However, you should also checkout the [GSoC Contributor Guide], the [Python Software Foundation] guide, the [Astropy GSoC guidelines] and the [SymPy Guidelines] to name but a few. +It is also possible each OA member has their own guidelines, and you should ask when you interact with them. + +Some general pointers to follow are: + +- **The better we know you, the better we can judge your application.** + There are many ways to get yourself known by the community, you can introduce yourself through the [OpenAstronomy discourse](https://community.openastronomy.org) and if required contact the mentors to know more about certain project. + However, contacting mentors through email or direct messages is discouraged, and contacting them in public channels is the preferred way to provide answers to multiple people at once. + Also, when you have a particular idea in mind, get in touch with that project and introduce yourself. + For example, `astropy` projects, follow the contact guidance in the [Astropy GSoC guidelines] and do not send an email to the `astropy-dev` list. + It is important that you follow the guidance for any OA member. + +- **Become a user!** + Download one or more of the OpenAstronomy projects and start experimenting with the code. + Look at the [latest pictures of the million degree Sun] with [SunPy](http://sunpy.org/), [volume render a simulation of the galaxy] with [yt](http://yt-project.org/), or [plan some astronomical observations] with [Astropy](http://www.astropy.org) + There are loads of things to do with all the projects involved with OpenAstronomy, get involved! + +- **Set yourself up as a developer.** + Create an account on [GitHub](http://github.com) or the code hosting platform the organization is using. + Don't know how to use [git](http://www.git-scm.com/)? + Don't worry, there are lots of git [tutorials](http://try.github.com) [online](http://gitimmersion.com/) that will help you to get quite confident with it in a short time. + Also both the [Astropy](http://docs.astropy.org/en/stable/index.html#developer-documentation) + and [yt](http://yt-project.org/docs/dev/developing/developing.html) developer guides are great reads no matter what project you are thinking of working on. + +
      + +**If you get stuck ask on the forum or chat rooms for help and volunteers will support you.** + +
      + +0. **Respect the AI policies.** + Much of the [open source ecosystem is suffering due to AI slop][ai-slop-summary]. + Do not contribute low-quality AI-generated content; doing so can lead to being banned from the organization. + This is not to say that you cannot use AI tools to support learning. + You can, while following each sub-org policy. + If you do not find an AI policy for a sub-org, assume AI-generated contributions are not allowed. + +1. **Start to be a developer.** + Checkout the issue lists of the projects to see if there is something that you could do. + **You will be expected to submit a pull request to one of the OpenAstronomy projects before you submit your application (it does not have to be accepted, but it has to be something that shows your code abilities!).** + This requirement is to show that you know how git, github, pull requests and reviews work and allows mentors to evaluate all applications based on a real code contribution, instead of e.g., the name of a specific school. + GSoC is a short program and we want to make sure you are ready to start immediately. + If you have previously contributed to OpenAstronomy projects, you can point to those pull requests, too. + +2. **Plan your application.** + Think which is your favorite project from the [ideas page](../) or think of a new one that will help out one of the OpenAstronomy members. + Prepare a plan on how you will tackle that project and the time it will take you to solve it. + Do not worry much in providing exact dates, but plan it as best as you can (if you are planing to have some holidays during the GSoC programme, then you should mention it too). + Use [our application template][gsoc-proposal-template] to describe how you plan to do the work during the programme. + Add your draft to the [gsoc-proposals](https://github.com/OpenAstronomy/gsoc-proposals) repository. + This is where to receive feedback. + Follow the instructions in that repository to submit your proposal. + Also, don't be afraid to ask your potential mentors for help. + Don't be shy when describing yourself! + +3. **Submit your application.** + Besides adding your proposal to the gsoc-proposals repository, you also need to [submit your application](https://summerofcode.withgoogle.com/) before the deadline. + **You must submit it there.** + Please include the sub-org name at the start of your proposal title as `[] `, + where `` should be the name of the sub-org in lower case (e.g., `sunpy`, `stingray`, `radis`), + or the combination of two if it's the case (e.g., `astropy|sunpy`). + Only proposals present in both the gsoc-proposals repository and the GSoC platform will be considered. + +### What are my obligations as a contributor during GSoC? + +We expect you to: + +- Be online and active during your working hours in your sub-organization chat. +- Publish a blog post at least once every two weeks. +- Participate in weekly meetings with your mentors. +- Contact your mentors or OpenAstronomy admins early if any issues arise. + +[SymPy Guidelines]: https://github.com/sympy/sympy/wiki/GSoC-2017-Application-Template +[Python Software Foundation]: http://python-gsoc.org/ +[GSoC Contributor Guide]: https://google.github.io/gsocguides/student/ +[Astropy GSoC guidelines]: https://github.com/astropy/astropy/wiki/GSoC-Guidelines +[latest pictures of the million degree Sun]: http://docs.sunpy.org/en/stable/generated/gallery/plotting/aia_example.html +[volume render a simulation of the galaxy]: http://yt-project.org/docs/dev/quickstart/volume_rendering.html +[plan some astronomical observations]: https://learn.astropy.org/tutorials/1-Coordinates-Intro.html +[gsoc-proposal-template]: https://github.com/OpenAstronomy/gsoc-proposals/blob/main/template.md +[ai-slop-summary]: https://redmonk.com/kholterhoff/2026/02/03/ai-slopageddon-and-the-oss-maintainers/ diff --git a/src/content/pages/gsoc/index.md b/src/content/pages/gsoc/index.md new file mode 100644 index 00000000..4fa3ec89 --- /dev/null +++ b/src/content/pages/gsoc/index.md @@ -0,0 +1,66 @@ +--- +title: Google Summer of Code +--- + +## New to Google Summer of Code (GSoC)? + +[We provide some background on GSoC right here!](./background/) + +## GSoC & OpenAstronomy + +OpenAstronomy is an umbrella organization which collects project ideas from any of its members and has been a mentoring organization since 2016. + +Contributor applications to OpenAstronomy projects follows the same rules as the [Python Software Foundation] and the [GSoC Contributor Guide]. +[We have also our own guide on what we consider a good application for OpenAstronomy.][OpenAstronomy Contributor Guide]. + +All contributors blogs are collected on the [OpenAstronomy Universe] site. + +## Quick Links + +- [OpenAstronomy Contributor Guide] +- [GSoC Contributor Guide] +- [Now You Know It!: Getting selected in Outreachy by Kriti Singh] + +

      Current Project ideas for GSoC 2026

      + +- [2026](./2026/) + +
      + +
      +Previous editions + +
      + +## Info for sub-organizations' admins + +Whether you have been participating for years or this is your first time [read our guide for sub-org admins.](./suborg_guidelines/) + +## Related Organizations + +OpenAstronomy is closely related to other organizations that support open-source scientific computing: + +- [NumFOCUS](https://numfocus.org/) - Supports open-source scientific computing projects, including many under OpenAstronomy [and also participates in GSoC.](https://numfocus.org/community/google-summer-of-code) +- [Python Software Foundation](https://www.python.org/) - Oversees GSoC projects for the broader Python ecosystem [and also participates in GSoC.](http://python-gsoc.org/) +- [TARDIS](https://tardis-sn.github.io/) - A radiative transfer code for supernovae, [also participating in GSoC](https://tardis-sn.github.io/summer_of_code/gsoc_start/) + +These organizations collaborate on various scientific computing initiatives and GSoC at times. + +[OpenAstronomy Contributor Guide]: ./contributor_guidelines/ +[Python Software Foundation]: http://python-gsoc.org/ +[GSoC Contributor Guide]: https://google.github.io/gsocguides/student/ +[OpenAstronomy Universe]: http://openastronomy.org/Universe_OA/ +[Now You Know It!: Getting selected in Outreachy by Kriti Singh]: https://github.com/kritisingh1/numpy/wiki/Now-You-Know-It!-:-Getting-selected-in-Outreachy diff --git a/src/content/pages/gsoc/suborg_guidelines.md b/src/content/pages/gsoc/suborg_guidelines.md new file mode 100644 index 00000000..ef91e1c6 --- /dev/null +++ b/src/content/pages/gsoc/suborg_guidelines.md @@ -0,0 +1,159 @@ +--- +title: "GSoC Sub-organizations Guidelines" +show_main: false +--- + +# GSoC Sub-organizations Guidelines + +OpenAstronomy has been accepted as an umbrella organization since 2016. +We will keep applying every year, but that doesn't mean we will always be selected. +If selected, we don't know the number of slots we will get till the contributor selection process ends. +However, it's our intention to keep the process fair for the sub-organizations and contributors. + +## I want to propose a new sub-org, what do I do? + +First, we recommend you to carefully read [Google's notes for first year organizations][Google-notes] and [the PSF guidelines for sub orgs][PSF-sub-orgs], which provide a general idea about the goals and concepts underpinning the Google Summer of Code program. +Then, you need to be a member of the OpenAstronomy team. +That process is simple (and free!). +You need to be an open-development organization and be related with astronomy. +Then make a pull-request to [our repository][OA repository] adding a logo, a short description, etc. +Follow the instructions in the example at the bottom of [the `members.json` file][members PR]. +The steering council will review your application and give you feedback. + +Once a member, you can start the path to participate on GSoC! +First you should get familiarized with the program, [Google's mentor guide] is a wonderful resource with detailed information of every aspect of it. +You need the following: + +- Time! How much? a fair bit. +- Ideas! How many? One is enough. How good? more about this below. +- Helpers! You need mentors, at least two mentors per idea. + +Let's look into that in more detail: + +### Time + +The program has a few deadlines, and Google won't extend them even if their system is down closer to the end. +They always allow a fair amount of time to submit whatever is needed. +To be on the safe side of this, OpenAstronomy imposes a deadline of one day before Google's. +You (and the contributors) will receive a reminder from the OpenAstronomy admins before such deadline. +If you fail to meet these deadlines, your sub-org and contributors may be affected. + +Besides these deadlines, as a sub-org admin, you will have to keep track of all your contributors and mentors, following how they are doing with their projects and making sure they communicate regularly. + +### Ideas + +Normally organizations provide a list of ideas that can be done by a contributor in approximately three months (working full-time). +Take a look at what [Google says on how to define a project](https://google.github.io/gsocguides/mentor/defining-a-project-ideas-list), then look at [other ideas OpenAstronomy's members have proposed this or previous years.](../#current-projects). + +To add your own, you will have to create a pull-request to [our repository][OA repository] following the [template](https://github.com/OpenAstronomy/openastronomy.github.io/blob/master/src/content/pages/gsoc/_project_template.md). +Take a look at [how others have done it before](https://github.com/OpenAstronomy/openastronomy.github.io/pull/182). +The admins and other members will review your ideas and provide feedback. +Once done, they will be merged and displayed on our website. + +It's also possible that a contributor comes up with their own ideas! +That's OK, the only limitation is that either the contributor or the admin will have to find a mentor for that idea who is familiar with the programming language, the repository, and the idea in itself. + +#### What do I need for my project idea? + +Everything you need is a title and description of the project idea, a set of requirements for potential contributors (_e.g._, proficiency with `astropy.tables` and `astropy.units`), and a list of potential mentors. +In addition, please link any related issues or tickets to the project idea, if any. +Lastly, make sure to indicate the level of difficulty of the project. + +In case your project idea already has specific milestones, please add them so as to make contributors aware when they start writing their applications. +If the project milestones are open ended and you would like to hear input from other members of the community, that is fine too! + +### Mentors + +For each project idea you need to have at least **two** mentors that are committed to participate in the programme. +The mentors need most importantly be familiar with the repository, normally they are real core-contributors, they need to be familiar with the idea and have some idea on how that could be implemented. + +The mentors also need to have time for the project. +We expect around 10 hours per week (not only to mentoring, but to the organization in itself). +That time varies depending from project to project. +But a minimum they should have a hour per week to discuss with the contributor their progress. +This can be done as a 10 minutes per day, or as 1 hour video-call. +Additionally, they will need to review the contributor code, discuss with other core-members to tell how the project is evolving, etc. + +Why two mentors? +Mentors do also need a break. +They may have a conference to attend or simply they could disappear from the project. +Having two mentors will help to keep continuity to the contributor project and brings more knowledge to the table. + +Though we are not too strict about the availability of the mentors, we suggest they are at least one hour per day - in a non-crazy hour for contributor and mentor - at the chat room of the organization. +So the contributor can ask the questions needed on the organization room. +This can also be done via e-mail, but we believe the contributors need to familiarize with the rest of the community. +(Plus others can help if the mentors are unavailable). + +Oh, and yes, **you** as an admin can also be a mentor and don't forget to tell them to read [Google's mentor guide]. + +## GSoC starts + +If we are accepted... what happens next? +First, have you read the [mentor guide][Google's mentor guide]? +If so, take a look at it again as a refresher! + +The application period for contributors is open just for two weeks. +However, they will know for more than a month which organizations are participating. +Even some contributors start to show interest from way before that!! +The main purpose of the programme is to bring new contributors to the organization, so the more they engage the better for your organization. +The dream contributor is that one that becomes mentor in the following years. + +### Contributor application + +Contributors will apply via the [GSoC portal][GSOC]. +If it's not there, their application doesn't count. +OpenAstronomy offers [a template for the contributors to apply][template-application-wiki]. S +Some sub-orgs require they post publicly their application on their wiki ([see for example SunPy's](https://github.com/sunpy/sunpy/wiki/GSoC)), others don't. +In any case, it's good to encourage the contributors to share the draft of their applications with the mentors, so they can improve it before the deadline. + +OpenAstronomy has [certain rules for an application to be considered][contributor guidelines]. +Familiarize with them to be able to inform your mentors and candidates. + +### Applications evaluation + +Each sub-org will have to evaluate the contributor application using a shared document within all the mentors. +The OpenAstronomy administrators will share them with you. +There you will grade the application, the engagement of the contributor shown so far, the quality of the pull request to the organization, any notes from an interview you may do, etc. + +### Slots allocation + +Based on the numbers of mentors and outstanding applications your sub-org has, you will ask for a number of slots to the Open Astronomy administrators. +They will collect these numbers from all the other sub-org and request them to Google. + +Google will then, after a few days, tell us how many slots we get. +Nobody knows them _a priori_, and they vary considerably year after year. + +If the number of slots obtained is smaller than the requested, then the steering council will decide the distribution of the slots using the following points as guidelines: + +- The quality of the contributor proposal. + A well-structured and described project will be favored, not simply a copy/paste from the ideas page. +- What's the likelihood of that candidate contributor to become a long-term contributor? + How has the contributor engaged till now? +- Commitment of the mentors for the project. + The mentors need to show they have committed to the sub-org and OpenAstronomy, and evidence of this will make the slot more likely to be allocated. + For example, it is best to have mentors that have contributed to the organization's codebase and are familiar with the language and topic. +- A project that enables cooperation with other sub-organizations of OpenAstronomy will generally be favored over those that do not. + +The process will be as open as possible including only the admins and mentors involved in the selection. +Remember, we cannot disclose any information on contributor selection to the contributors before Google announces the selected contributors + +Note that OpenAstronomy usually assigns one slot for first year sub-orgs. +That may change in a case-by-case basis, e.g., the sub-organization already participated in previous editions of the GSoC (either by itself or with another umbrella organization), or has experience with similar coding outreach programmes, such as [ESA-SOCIS][ESA-SOCIS]. + +### Evaluations + +Once the programme starts each contributor has to pass an evaluation per month. +If one of them is failed (or not provided on time), the contributor cannot continue in the programme and therefore, not get paid. + +OpenAstronomy has also set a set of obligations for the contributors to do during the programme (e.g., a blog post every two weeks describing their progress, telecommuting with mentors weekly). +If they are not followed the administrators will fail the contributors. + +[OA repository]: https://github.com/OpenAstronomy/openastronomy.github.io +[contributor guidelines]: ./contributor_guidelines/ +[Google's mentor guide]: https://google.github.io/gsocguides/mentor/ +[GSOC]: https://summerofcode.withgoogle.com/ +[members PR]: https://github.com/OpenAstronomy/openastronomy.github.io/blob/master/_data/members.yaml +[ESA-SOCIS]: https://www.esa.int/Enabling_Support/Space_Engineering_Technology/SOCIS_The_ESA_Summer_of_Code_in_Space +[Google-notes]: https://google.github.io/gsocguides/mentor/notes-for-first-year-organizations +[PSF-sub-orgs]: https://python-gsoc.org/mentors.html#sub-orgs +[template-application-wiki]: https://github.com/OpenAstronomy/openastronomy.github.io/wiki/Contributor-Application-template diff --git a/_posts/2016-01-15-Workshop.md b/src/content/posts/2016-01-15-Workshop.md similarity index 93% rename from _posts/2016-01-15-Workshop.md rename to src/content/posts/2016-01-15-Workshop.md index bfcb58ff..22da21ae 100644 --- a/_posts/2016-01-15-Workshop.md +++ b/src/content/posts/2016-01-15-Workshop.md @@ -1,5 +1,4 @@ --- -layout: post title: First OpenAstronomy - Software Carpentry Workshop date: 2016-01-15 @@ -12,13 +11,13 @@ We all brought different expertise and shared the teaching out to keep the works We used the red-green post-it technique suggested by software carpentry as a way to know how people were getting on during the sessions, also, for every session the learners were asked to use these post-it notes to give us feedback on the session (green for something good you've learnt, red for something that can be improved). This not just helped us for the next workshop, but it also helped to the next instructor that day! -David teaching bash +David teaching bash As usual there were some software setup issues at the beginning of the week, however we were very close! Only one person from the whole class has troubles with the Jupyter notebook - it simply was not able to execute any command within. We didn't manage to fix the problem, but probably it was the oldest laptop (running Windows 7) in the class. Beside that case, we come across a couple of other problems with other windows machines, in one of them `git log` was blocking the screen and the other could not open the text editor (Notepad++ in this case) when executing `commit` (or `merge` with the default message). -Each day we updated the [official repository](https://github.com/OpenAstronomy/2016-01-11_Sheffield_Notes) with lesson templates in Jupyter notebook format, where an outline of the class was available, and the code cells were empty to be filled in while following the lecture. Once we completed a session, the notes can be browsed [here](http://nbviewer.jupyter.org/github/OpenAstronomy/2016-01-11_Sheffield_Notes/blob/master/index.ipynb). +Each day we updated the [official repository](https://github.com/OpenAstronomy/2016-01-11_Sheffield_Notes) with lesson templates in Jupyter notebook format, where an outline of the class was available, and the code cells were empty to be filled in while following the lecture. Once we completed a session, the notes can be browsed in [the workshop notes](http://nbviewer.jupyter.org/github/OpenAstronomy/2016-01-11_Sheffield_Notes/blob/master/index.ipynb). In this way everyone had to `fork` our repository on github, then `pull` at the start of every session from `upstream` and `push` at the end to their `origin`. This cemented the work at the start of the week on git+GitHub, while making sure everyone had a backup of all the work they had completed during the week and learning the usual git workflow of contributing to a larger project on GitHub. Thanks to the visualisations on GitHub we can see how all [these forks evolved](https://github.com/OpenAstronomy/2016-01-11_Sheffield_Notes/network), and see if the participants keep using GitHub!! diff --git a/_posts/2018-08-14-GSoC.md b/src/content/posts/2018-08-14-GSoC.md similarity index 91% rename from _posts/2018-08-14-GSoC.md rename to src/content/posts/2018-08-14-GSoC.md index aeb7f3fb..ded6d1de 100644 --- a/_posts/2018-08-14-GSoC.md +++ b/src/content/posts/2018-08-14-GSoC.md @@ -1,5 +1,4 @@ --- -layout: post title: "2018 August 14: GSoC - End of Coding" date: 2018-08-14 --- diff --git a/_posts/2018-09-24-dotastro.md b/src/content/posts/2018-09-24-dotastro.md similarity index 94% rename from _posts/2018-09-24-dotastro.md rename to src/content/posts/2018-09-24-dotastro.md index 2fe46f80..22889568 100644 --- a/_posts/2018-09-24-dotastro.md +++ b/src/content/posts/2018-09-24-dotastro.md @@ -1,5 +1,4 @@ --- -layout: post title: 2018 September 24-27 - .Astronomy X date: 2018-09-24 diff --git a/_posts/2019-07-29-pyastro.md b/src/content/posts/2019-07-29-pyastro.md similarity index 95% rename from _posts/2019-07-29-pyastro.md rename to src/content/posts/2019-07-29-pyastro.md index 5b306737..d3a7a077 100644 --- a/_posts/2019-07-29-pyastro.md +++ b/src/content/posts/2019-07-29-pyastro.md @@ -1,5 +1,4 @@ --- -layout: post title: 2019 Jul 29 - Aug 2 - Python in Astronomy date: 2019-07-29 @@ -8,4 +7,3 @@ date: 2019-07-29 The Python in Astronomy conference will be held at the Space Telescope Science Institute in Baltimore during July 29th - August 2nd. Check out the [conference website](http://openastronomy.org/pyastro/2019/) for more information. - diff --git a/src/data/gsoc-admins.json b/src/data/gsoc-admins.json new file mode 100644 index 00000000..e275dc2c --- /dev/null +++ b/src/data/gsoc-admins.json @@ -0,0 +1,12 @@ +{ + "2017": ["dpshelio", "Cadair", "taldcroft", "eteq"], + "2018": ["dpshelio", "bsipocz"], + "2019": ["dpshelio", "bsipocz", "mirca"], + "2020": ["dpshelio", "bsipocz", "mirca"], + "2021": ["dpshelio", "bsipocz", "mirca"], + "2022": ["dpshelio", "bsipocz", "mirca"], + "2023": ["dpshelio", "bsipocz", "mirca"], + "2024": ["dpshelio", "bsipocz", "mirca"], + "2025": ["dpshelio", "bsipocz", "mirca", "nabobalis"], + "2026": ["dpshelio", "bsipocz", "mirca", "nabobalis"] +} diff --git a/src/data/icons.json b/src/data/icons.json new file mode 100644 index 00000000..a250869d --- /dev/null +++ b/src/data/icons.json @@ -0,0 +1,8 @@ +{ + "gh_logo": "M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z", + "bb_logo": "M29.208,3.519c-0.203-0.285-0.451-0.525-0.729-0.738c-0.61-0.475-1.297-0.814-2.01-1.102c-1.516-0.611-3.097-0.971-4.701-1.229C19.81,0.137,17.836,0.012,15.762,0c-1.854,0.016-3.797,0.133-5.725,0.434C8.668,0.649,7.316,0.94,6.002,1.385c-0.869,0.297-1.71,0.649-2.477,1.164C3.16,2.793,2.824,3.07,2.549,3.418C2.205,3.856,2.058,4.344,2.147,4.897C2.32,5.989,2.48,7.082,2.66,8.169c0.264,1.611,0.537,3.222,0.811,4.828c0.306,1.787,0.62,3.573,0.918,5.36c0.07,0.416,0.246,0.769,0.526,1.07c0.179,0.193,0.37,0.377,0.574,0.543c0.73,0.59,1.562,1.01,2.432,1.354c2.082,0.83,4.259,1.205,6.485,1.328c1.616,0.09,3.23,0.033,4.838-0.187c1.369-0.185,2.709-0.479,4.011-0.948c0.965-0.349,1.891-0.775,2.725-1.382c0.355-0.26,0.683-0.547,0.945-0.901c0.181-0.238,0.305-0.504,0.354-0.805c0.397-2.341,0.809-4.679,1.196-7.021c0.362-2.172,0.701-4.346,1.058-6.518C29.617,4.388,29.502,3.935,29.208,3.519z M15.82,19.64c-2.4-0.008-4.341-1.971-4.333-4.383c0.006-2.41,1.958-4.347,4.369-4.338c2.425,0.008,4.359,1.961,4.35,4.387C20.195,17.704,18.227,19.648,15.82,19.64z M24.522,4.394c-0.124,0.139-0.274,0.262-0.436,0.357c-0.45,0.268-0.951,0.409-1.454,0.541c-0.952,0.243-1.923,0.383-2.896,0.485c-1.281,0.136-2.565,0.183-3.791,0.188c-1.49-0.008-2.914-0.068-4.332-0.238c-1.064-0.129-2.124-0.291-3.146-0.633C8.164,4.99,7.869,4.858,7.584,4.713C7.438,4.641,7.309,4.528,7.198,4.409c-0.197-0.215-0.196-0.45,0.005-0.663C7.32,3.621,7.463,3.514,7.61,3.43C8.034,3.184,8.5,3.041,8.969,2.918c0.983-0.256,1.985-0.402,2.994-0.509c1.652-0.17,3.308-0.221,4.967-0.172c1.524,0.045,3.045,0.158,4.55,0.431c0.706,0.127,1.407,0.274,2.075,0.545c0.236,0.096,0.463,0.217,0.683,0.346c0.109,0.064,0.208,0.164,0.288,0.266C24.668,4.007,24.674,4.222,24.522,4.394z M26.186,22.761c0.009,0.088-0.004,0.183-0.021,0.271c-0.305,1.604-0.614,3.205-0.911,4.811c-0.101,0.539-0.344,0.99-0.724,1.377c-0.422,0.432-0.918,0.752-1.448,1.023c-0.979,0.498-2.018,0.811-3.085,1.031c-1.377,0.286-2.771,0.414-3.563,0.407c-2.41-0.006-4.184-0.198-5.917-0.698c-0.802-0.23-1.577-0.529-2.3-0.953c-0.379-0.222-0.732-0.478-1.042-0.789c-0.388-0.392-0.64-0.846-0.741-1.396c-0.296-1.604-0.609-3.207-0.915-4.81c-0.016-0.081-0.021-0.163-0.019-0.245c0.019-0.394,0.37-0.597,0.724-0.423c0.036,0.021,0.072,0.041,0.105,0.063c1.174,0.853,2.484,1.423,3.858,1.856c1.262,0.4,2.556,0.641,3.873,0.758c1.52,0.138,3.031,0.104,4.54-0.11c2-0.28,3.91-0.851,5.687-1.827c0.354-0.194,0.686-0.43,1.025-0.646c0.056-0.035,0.108-0.076,0.167-0.104C25.819,22.206,26.153,22.395,26.186,22.761z M18.027,15.284c-0.005,1.203-0.992,2.184-2.197,2.178c-1.205-0.004-2.178-0.987-2.172-2.196c0.004-1.212,0.98-2.181,2.192-2.175C17.059,13.097,18.03,14.073,18.027,15.284z", + "sf_logo": "m0.10973,10.304c-0.063715-0.064-0.10973-0.3695-0.10973-0.7287,0-0.518,0.028754-0.6339,0.17686-0.7132,0.10645-0.056966,0.97285-0.094654,2.1762-0.094654,1.4331,0,2.0304-0.031075,2.109-0.10973,0.14226-0.14226,0.14226-0.9184,0-1.0607-0.077134-0.077135-0.59397-0.10973-1.7402-0.10973-1.7693,0-2.0378-0.054672-2.4475-0.49821-0.22016-0.2382-0.22973-0.2998-0.25796-1.6592-0.027012-1.3006-0.014301-1.4361,0.16145-1.7204,0.37101-0.6003,0.58673-0.6448,3.2814-0.6767,2.9042-0.034316,2.8498-0.050242,2.8498,0.83519,0,0.32448-0.047689,0.62163-0.10972,0.68366-0.078762,0.078762-0.69147,0.11012-2.1716,0.11112-1.134,0.0007216-2.1155,0.035443-2.1812,0.077064-0.081755,0.051857-0.11052,0.24557-0.091435,0.61579l0.027855,0.54013,1.7373,0.045718c1.9027,0.0502,2.1341,0.1109,2.5506,0.6697,0.1761,0.2362,0.1924,0.3777,0.1924,1.662,0,1.5713-0.052879,1.7306-0.68728,2.0709-0.28534,0.15303-0.55769,0.16929-2.8361,0.16929-1.8385,0-2.5502-0.02969-2.6302-0.10973zm9.1862-1.0489c-0.0335-0.0335-0.0609-1.1033-0.0609-2.3773v-2.3164h-0.66748c-0.39724,0-0.7119-0.044425-0.7772-0.10973-0.061907-0.061907-0.10973-0.35849-0.10973-0.68058,0-0.72446,0.15021-0.85554,0.98042-0.85554h0.57399v-0.8472c0-1.0337,0.14644-1.3641,0.77936-1.7587,0.43617-0.27191,0.45323-0.27457,1.9562-0.30408,0.915-0.017969,1.6159,0.008315,1.7676,0.066314,0.24036,0.091851,0.25145,0.12361,0.25145,0.72011,0,0.36344-0.04582,0.66984-0.10972,0.73375-0.07578,0.075781-0.54252,0.10973-1.5087,0.10973h-1.399v0.64005,0.64005h1.3318c0.7432,0,1.41,0.041832,1.5087,0.094655,0.1481,0.079261,0.17686,0.19524,0.17686,0.7132,0,0.35918-0.04601,0.66455-0.10972,0.72827-0.07578,0.075781-0.54252,0.10973-1.5087,0.10973h-1.399v1.8998c0,2.1681,0.0081,2.1405-0.76082,2.5815-0.457,0.2624-0.7882,0.3393-0.9151,0.2124z", + "irc_logo": "M30,12V8h-5.004l1-8h-4l-1,8h-7.998l1-8h-4l-1,8H2v4h6.498L7.5,20H2v4h5l-1,8h4l1-8h8l-1.002,8H22l1-8h7v-4h-6.5l0.996-8H30z M19.5,20h-8l0.998-8h7.998L19.5,20z", + "mastodon_logo": "M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a3.614 3.614 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522c0-.859.22-1.541.66-2.046.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764.442.505.661 1.187.661 2.046v4.203z", + "x_logo": "M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z" +} diff --git a/src/data/members.json b/src/data/members.json new file mode 100644 index 00000000..1042d03a --- /dev/null +++ b/src/data/members.json @@ -0,0 +1,297 @@ +{ + "astropy": { + "name": "Astropy", + "logo": "astropy.png", + "url": "http://www.astropy.org/", + "repositories": { + "github": "astropy/astropy" + }, + "mailinglist": { + "users": "http://mail.python.org/mailman/listinfo/astropy", + "devs": "http://groups.google.com/group/astropy-dev" + }, + "chat": { + "slack": "http://joinslack.astropy.org/" + }, + "microblogging": { + "x": "astropy" + }, + "description": "is a community-driven package intended to contain much of the core functionality and some common tools needed for performing astronomy and astrophysics with Python." + }, + "astronomy-commons": { + "name": "Astronomy Data Commons", + "logo": "astronomy-commons.png", + "url": "https://dirac.astro.washington.edu/data-engineering/", + "repositories": { + "github": "astronomy-commons/" + }, + "mailinglist": { + "devs": "https://groups.google.com/forum/#!forum/astronomy-commons" + }, + "chat": { + "matrix": "https://app.element.io/#/room/#astronomy-commons:matrix.org" + }, + "description": "is an initiative for software infrastructure for science platforms and scalable astronomy on cloud resources. Astronomy Data Commons is lead by researchers at the DiRAC Institute at the University of Washington." + }, + "ctlearn": { + "name": "CTLearn", + "logo": "ctlearn.png", + "url": "https://github.com/ctlearn-project", + "repositories": { + "github": "ctlearn-project/ctlearn" + }, + "chat": { + "matrix": "https://app.element.io/#/room/#ctlearn:matrix.org" + }, + "description": "is a package under active development that pursues the application of deep-learning based methods to the analysis of data from imaging atmospheric Cherenkov telescopes (IACTs). CTLearn includes modules for loading and manipulating IACT data and for running machine learning models using pixel-wise camera data as input. Its high-level interface provides a configuration-file-based workflow to drive reproducible training and prediction." + }, + "einsteinpy": { + "name": "EinsteinPy", + "logo": "einsteinpy.png", + "url": "https://einsteinpy.org", + "repositories": { + "github": "einsteinpy/einsteinpy" + }, + "mailinglist": { + "devs": "https://groups.io/g/einsteinpy-dev" + }, + "chat": { + "matrix": "https://app.element.io/#/room/#einsteinpy:matrix.org" + }, + "microblogging": { + "x": "EinsteinPy" + }, + "description": "is a python package for solving problems in general relativity. Computations can be done for Schwarzschild, Kerr and Kerr-Newman geometries. Visualising relativistic orbits, advancement of perihelion can be simulated in seconds. See documentation for more information." + }, + "glue": { + "name": "Glue", + "logo": "glue.png", + "url": "http://www.glueviz.org/", + "repositories": { + "github": "glue-viz/glue" + }, + "mailinglist": { + "users": "https://groups.google.com/group/glue-viz", + "devs": "https://groups.google.com/group/glue-viz-dev" + }, + "microblogging": { + "x": "glueviz" + }, + "description": "is a data visualization application and library to explore relationships within and among related datasets. Its main features include linked statistical graphs, flexible linking across data, and full Python scripting capability." + }, + "juliaastro": { + "name": "JuliaAstro", + "logo": "juliaastro.png", + "url": "https://juliaastro.github.io/", + "repositories": { + "github": "JuliaAstro" + }, + "mailinglist": { + "users": "https://discourse.julialang.org/c/domain/astro" + }, + "chat": { + "slack": "https://app.slack.com/client/T68168MUP/CMXU6SD7V", + "zulip": "https://julialang.zulipchat.com/#narrow/channel/astronomy" + }, + "description": "is an organization that shepherds the development of community astronomy and astrophysics packages for Julia. These include packages for widely used functionality such as FITS file I/O, world coordinate systems and cosmological distance calculations." + }, + "poliastro": { + "name": "poliastro", + "logo": "poliastro.png", + "url": "https://poliastro.readthedocs.io/", + "repositories": { + "github": "poliastro/poliastro" + }, + "mailinglist": { + "devs": "https://groups.io/g/poliastro-dev" + }, + "chat": { + "matrix": "https://app.element.io/#/room/#poliastro:matrix.org" + }, + "microblogging": { + "x": "poliastro_py", + "mastodon": "@poliastro@fosstodon.org" + }, + "description": "is a python package for Astrodynamics and Orbital Mechanics problems, such as orbital elements conversion, orbital propagation, plotting, planetary ephemerides computation, and more." + }, + "sunpy": { + "name": "SunPy", + "logo": "sunpy.png", + "url": "http://sunpy.org", + "repositories": { + "github": "sunpy/sunpy" + }, + "mailinglist": { + "users": "http://groups.google.com/group/sunpy", + "devs": "http://groups.google.com/group/sunpy-dev" + }, + "chat": { + "matrix": "https://app.element.io/#/room/#sunpy:openastronomy.org" + }, + "microblogging": { + "x": "SunPyProject" + }, + "description": "is a community-developed free and open-source software package for solar physics. SunPy is meant to be a free alternative to the SolarSoft and its aim is to provide the software tools necessary so that anyone can analyze solar data." + }, + "stingray": { + "name": "Stingray", + "logo": "stingray_logo.png", + "url": "http://stingray.science", + "repositories": { + "github": "StingraySoftware" + }, + "chat": { + "slack": "https://join.slack.com/t/stingraysoftware/shared_invite/zt-49kv4kba-mD1Y~s~rlrOOmvqM7mZugQ" + }, + "description": ": we are a team of astrophysicists and software developers working together to build a variability analysis software to study black holes and fundamental physics under extreme conditions." + }, + "casacore": { + "name": "Casacore", + "logo": "casacore.png", + "url": "https://www.github.com/casacore/casacore/", + "repositories": { + "github": "casacore" + }, + "description": "is a suite of C++ libraries for radio astronomy data processing. Casacore underlies CASA, the Common Astronomy Software Applications developed by an international consortium of scientists at various institutes. Python bindings exist in Python-casacore. Casacore also underlies other radio astronomy software such as WSClean, and LOFAR tools. Casacore is developed by the radio astro organizations around the world. It is open source and will happily merge any (good) pull requests." + }, + "chiantipy": { + "name": "ChiantiPy", + "logo": "chiantipy.png", + "url": "http://chiantipy.sourceforge.net/welcome.html", + "repositories": { + "github": "chianti-atomic/ChiantiPy" + }, + "mailinglist": { + "users": "https://lists.sourceforge.net/lists/listinfo/chiantipy-users" + }, + "description": "is a Python interface to the CHIANTI atomic database for astrophysical spectroscopy. CHIANTI consists of a database of atomic data that can be used to interpret spectral lines and continua emitted from high-temperature, optically-thin astrophysical sources." + }, + "coin": { + "name": "COIN", + "logo": "coin.png", + "url": "https://cosmostatistics-initiative.org/", + "repositories": { + "github": "COINtoolbox" + }, + "mailinglist": { + "admin (Rafael S. de Souza)": "mailto:rafael.2706@gmail.com" + }, + "description": "(COsmostatistics INitiative) is an international working group built under the auspices of the International Astrostatistics Association (IAA). It aims to create an interdisciplinary environment where collaborations between astronomers, statisticians and machine learning experts can flourish. COIN is designed to promote the development of a new family of tools for data exploration in astrophysics and cosmology." + }, + "gnuastro": { + "name": "GNU Astronomy Utilities", + "logo": "gnuastro.png", + "url": "https://www.gnu.org/software/gnuastro/", + "repositories": { + "savannah": "https://git.savannah.gnu.org/cgit/gnuastro.git" + }, + "mailinglist": { + "users": "https://lists.gnu.org/mailman/listinfo/help-gnuastro", + "devs": "https://lists.gnu.org/mailman/listinfo/gnuastro-devel" + }, + "description": "(Gnuastro) is an official GNU package consisting of many command-line programs and library functions for the manipulation and analysis of astronomical data. All the programs share the same basic and familiar (GNU style) command-line user interface for the comfort of both the users and developers. Gnuastro is written to comply fully with the GNU coding standards so it blends nicely with all Unix-like operating systems. This also enables astronomers to expect a fully familiar experience in the source code, building, installing and command-line user interaction. Gnuastro also has a very complete book/manual, the tutorials is the best place to start using it." + }, + "ims": { + "name": "The Italian Mars Society", + "logo": "ims.png", + "url": "http://www.marssociety.it/?lang=en", + "repositories": { + "bitbucket": "italianmarssociety/" + }, + "mailinglist": { + "admin": "mailto:gsoc@marssociety.it" + }, + "microblogging": { + "x": "marssociety" + }, + "description": "(IMS) is a non-profit organization, existing from 2004, as Italian branch of the International Mars Society, created in the USA by Robert Zubrin. IMS is a member of the Mars Society European network. The foundation scope of the Italian Mars Society is to promote research projects devoted to Mars Exploration and the involvement of SMEs and large enterprises in the new economy related to space exploration.
      IMS is currently spearheading the MARS CITY project. The project aims to address the major issues that could jeopardize a crewed mission to Mars and are not adequately being addressed at existing terrestrial Mars analogs." + }, + "plasmapy": { + "name": "PlasmaPy", + "logo": "plasmapy.png", + "url": "http://www.plasmapy.org", + "repositories": { + "github": "plasmapy/plasmapy" + }, + "mailinglist": { + "users": "https://groups.google.com/group/plasmapy" + }, + "chat": { + "matrix": "https://app.element.io/#/room/#plasmapy:matrix.org" + }, + "microblogging": { + "x": "plasmapy" + }, + "description": "aims to be a collection of functionality commonly used and shared between plasma physicists and researchers globally, running within and leveraging the open source scientific Python ecosystem." + }, + "radis": { + "name": "radis", + "logo": "radis_ico.png", + "url": "https://radis.readthedocs.io/", + "repositories": { + "github": "radis/radis" + }, + "mailinglist": { + "users": "https://groups.google.com/forum/#!forum/radis-radiation" + }, + "chat": { + "gitter": "https://gitter.im/radis-radiation/community" + }, + "microblogging": { + "x": "radis_radiation" + }, + "description": "A fast line-by-line code for high-resolution infrared molecular spectra. RADIS can compute spectra of millions of lines within seconds. Also includes a post-processing tools to compare experimental spectra with spectra calculated in RADIS or other spectral codes." + }, + "sherpa": { + "name": "Sherpa", + "logo": "sherpa_logo.png", + "url": "http://cxc.cfa.harvard.edu/contrib/sherpa/", + "repositories": { + "github": "sherpa/sherpa/" + }, + "description": "is a modeling and fitting application for Python. It contains a powerful language for combining simple models into complex expressions that can be fit to the data using a variety of statistics and optimization methods. It is easily extensible to include user models, statistics and optimization methods." + }, + "yt": { + "name": "yt", + "logo": "yt.png", + "url": "https://yt-project.org/", + "repositories": { + "github": "yt-project/yt" + }, + "mailinglist": { + "users": "https://mail.python.org/archives/list/yt-users@python.org/", + "devs": "https://mail.python.org/archives/list/yt-dev@python.org/" + }, + "chat": { + "slack": "https://yt-project.slack.com/" + }, + "microblogging": { + "x": "yt_astro" + }, + "description": "is a python package for analyzing and visualizing volumetric, multi-resolution data from astrophysical simulations, radio telescopes, and a burgeoning interdisciplinary community." + }, + "lincc-frameworks": { + "name": "LINCC Frameworks", + "logo": "lincc-frameworks.png", + "url": "https://lsstdiscoveryalliance.org/lsst-discovery-alliance-programs/lincc-frameworks/", + "repositories": { + "github": "lincc-frameworks" + }, + "chat": { + "slack": "https://join.slack.com/t/gsoc26arrowforastro/shared_invite/zt-3qpirqhkg-qTHUg4R0iMewhIprewR1eg" + }, + "description": "builds open-source tools for scalable data analysis in astronomy, aimed at enabling scientific discovery with large datasets." + }, + "reltrans": { + "name": "Reltrans", + "logo": "reltrans_logo.png", + "url": "https://reltrans.github.io/reltrans_website/Home.html", + "repositories": { + "github": "reltrans" + }, + "chat": { + "slack": "https://join.slack.com/t/reltrans-workspace/shared_invite/zt-3p234fciq-lD12LDPTCCPf0DTT1ZocmQ" + }, + "description": "Reltrans (Relativistic transfer functions) is a publicly available, semi-analytical model for X-ray reverberation mapping of accreting black holes in both AGN and X-ray binaries. It can be used to compute both time-averaged spectra and energy-dependent, Fourier domain cross spectra." + } +} diff --git a/src/data/site.json b/src/data/site.json new file mode 100644 index 00000000..e5ecffe1 --- /dev/null +++ b/src/data/site.json @@ -0,0 +1,18 @@ +{ + "title": "OpenAstronomy", + "email": "", + "description": "Where all about the combined force of different open source projects in astronomy and astrophysics takes place.", + "url": "https://openastronomy.org", + "x_username": "Open_Astronomy", + "github_username": "openastronomy", + "irc_channel": "openastronomy", + "discussiongroup_url": "https://community.openastronomy.org", + "nav_links": { + "Contributor Blogs": "http://openastronomy.org/Universe_OA" + }, + "page_links": [ + { "title": "Members", "href": "/members/" }, + { "title": "News and Events", "href": "/news/" }, + { "title": "Google Summer of Code", "href": "/gsoc/" } + ] +} diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro new file mode 100644 index 00000000..4e1dd320 --- /dev/null +++ b/src/layouts/BaseLayout.astro @@ -0,0 +1,23 @@ +--- +import Head from "../components/Head.astro"; +import Header from "../components/Header.astro"; +import Footer from "../components/Footer.astro"; + +const { title, description } = Astro.props; +--- + + + + + +
      +
      +
      +
      + +
      +
      +
      +
      + + diff --git a/src/layouts/PageLayout.astro b/src/layouts/PageLayout.astro new file mode 100644 index 00000000..c6eb2ede --- /dev/null +++ b/src/layouts/PageLayout.astro @@ -0,0 +1,16 @@ +--- +import BaseLayout from "./BaseLayout.astro"; + +const { title, description } = Astro.props; +--- + + +
      +
      +

      {title}

      +
      +
      + +
      +
      +
      diff --git a/src/layouts/PostLayout.astro b/src/layouts/PostLayout.astro new file mode 100644 index 00000000..5f8fc483 --- /dev/null +++ b/src/layouts/PostLayout.astro @@ -0,0 +1,29 @@ +--- +import BaseLayout from "./BaseLayout.astro"; + +const { title, date, author, meta, description } = Astro.props; +const formattedDate = date + ? new Intl.DateTimeFormat("en-US", { + month: "short", + day: "numeric", + year: "numeric", + }).format(new Date(date)) + : ""; +const metaParts = [formattedDate, author, meta].filter(Boolean); +--- + + +
      +
      +

      {title}

      + { + metaParts.length ? ( + + ) : null + } +
      +
      + +
      +
      +
      diff --git a/src/layouts/ProjectsLayout.astro b/src/layouts/ProjectsLayout.astro new file mode 100644 index 00000000..54bfbee6 --- /dev/null +++ b/src/layouts/ProjectsLayout.astro @@ -0,0 +1,428 @@ +--- +import BaseLayout from "./BaseLayout.astro"; +import admins from "../data/gsoc-admins.json"; +import members from "../data/members.json"; +import { fromSiteRoot } from "../lib/relative-paths.js"; + +type AstroComponentFactory = (...args: unknown[]) => unknown; +type ProjectModule = { + frontmatter?: Record; + Content: AstroComponentFactory; +}; + +const frontmatter = Astro.props.frontmatter ?? {}; +const pagePath = Astro.url.pathname; +const title = Astro.props.title ?? frontmatter.title; +const season = Astro.props.season ?? frontmatter.season; +const seasonKeyFromFrontmatter = String(season ?? "").trim(); +const seasonMatch = Astro.url.pathname.match(/\/gsoc\/(\d{4})(?:\/|$)/); +const seasonKey = ( + seasonMatch ? seasonMatch[1] : seasonKeyFromFrontmatter +).trim(); +const pageTitle = seasonKey + ? title + ? `${title} (${seasonKey})` + : `GSoC ${seasonKey}` + : (title ?? "OpenAstronomy"); +const projectModules = import.meta.glob( + "../content/pages/gsoc/**/*.md", + { eager: true }, +); +const memberLookup = members as Record; +const adminLookup = admins as Record; + +const normalizeArray = (value: unknown): string[] => { + const values = Array.isArray(value) + ? value + : value !== null && value !== undefined && value !== "" + ? [value] + : []; + return values + .map((item) => String(item ?? "").trim()) + .filter((item) => { + const normalized = item.toLowerCase(); + if (!normalized) { + return false; + } + return !["none", "n/a", "na", "null"].includes(normalized); + }); +}; + +const slugify = (value: string) => + value + .toLowerCase() + .trim() + .replace(/[^a-z0-9]+/g, "-") + .replace(/(^-|-$)/g, ""); + +const formatMemberLink = (value: string) => { + const key = String(value); + const member = memberLookup[key]; + if (member?.name) { + return { + label: member.name, + href: fromSiteRoot( + pagePath, + `/members/#${encodeURIComponent(member.name)}`, + ), + }; + } + return { label: key, href: null }; +}; +const joinableRows = (rows: Array<{ label: string; values: string[] }>) => + rows.filter((row) => row.values.length > 0); + +const projects = (Object.entries(projectModules) as [string, ProjectModule][]) + .filter(([path]) => { + const normalizedPath = path.replace(/\\\\/g, "/"); + const parts = normalizedPath.split("/"); + const gsocIndex = parts.lastIndexOf("gsoc"); + if (gsocIndex === -1) { + return false; + } + const year = parts[gsocIndex + 1]; + if (!/^\d{4}$/.test(year ?? "")) { + return false; + } + if (parts.length < gsocIndex + 4) { + return false; + } + const filename = parts[parts.length - 1] ?? ""; + if (filename.startsWith("_") || filename === "index.md") { + return false; + } + return year === seasonKey; + }) + .map(([path, mod]) => { + const data = mod.frontmatter ?? {}; + const normalizedPath = path.replace(/\\\\/g, "/"); + const parts = normalizedPath.split("/"); + const gsocIndex = parts.lastIndexOf("gsoc"); + const year = parts[gsocIndex + 1] ?? seasonKey; + const suborg = parts[gsocIndex + 2] ?? ""; + const fileSlug = (parts[parts.length - 1] ?? "").replace(/\.md$/, ""); + const fallbackName = fileSlug; + const name = + typeof data.name === "string" && data.name.trim() + ? data.name.trim() + : fallbackName; + const projectPath = `/gsoc/${year}/${suborg}/${fileSlug}/`; + const desc = typeof data.desc === "string" ? data.desc : ""; + const requirements = normalizeArray(data.requirements); + const mentors = normalizeArray(data.mentors); + const initiatives = normalizeArray(data.initiatives); + const projectSize = normalizeArray(data.project_size); + const tags = normalizeArray(data.tags); + const collaborators = normalizeArray(data.collaborating_projects).map( + formatMemberLink, + ); + const issues = normalizeArray(data.issues); + const detailRows = joinableRows([ + { label: "Initiatives", values: initiatives }, + { label: "Project size", values: projectSize }, + { label: "Tags", values: tags }, + ]); + const cardRows = joinableRows([ + { label: "Mentors", values: mentors }, + ...detailRows, + ]); + + return { + name, + anchor: slugify(name), + href: fromSiteRoot(pagePath, projectPath), + desc, + requirements, + mentors, + collaborators, + issues, + cardRows, + detailRows, + Content: mod.Content, + }; + }); + +projects.sort((a, b) => a.name.localeCompare(b.name)); + +const mentors = Array.from( + new Set(projects.flatMap((project) => project.mentors).filter(Boolean)), +).sort((a, b) => a.localeCompare(b)); + +const adminHandles = adminLookup[seasonKey] ?? []; +const projectsSectionLabel = `GSoC Projects for ${seasonKey}`; +const mentorsSectionLabel = `Mentors for ${seasonKey}`; +const adminsSectionLabel = `Admins for ${seasonKey}`; +const sectionLinks = [ + { id: "projects", label: "Projects", heading: projectsSectionLabel }, + { id: "mentors", label: "Mentors", heading: mentorsSectionLabel }, + { id: "admins", label: "Admins", heading: adminsSectionLabel }, +]; +const peopleSections = [ + { + id: "mentors", + heading: mentorsSectionLabel, + intro: `We are the mentors for OpenAstronomy in GSoC ${seasonKey}.`, + handles: mentors, + }, + { + id: "admins", + heading: adminsSectionLabel, + intro: "We are the admins for OpenAstronomy.", + handles: adminHandles, + }, +]; +--- + + +
      +
      +
      + +
      + +
      +

      + + {projectsSectionLabel} + +

      + {projects.length === 0 ?

      No projects listed yet.

      : null} +
      + { + projects.map((project) => { + const ProjectContent = project.Content; + const detailId = `detail-${project.anchor}`; + return ( + <> + + + + + ); + }) + } +
      +
      + + { + peopleSections.map((section) => ( +
      +

      + + {section.heading} + +

      +

      {section.intro}

      +
      + {section.handles.map((handle) => ( +
      + {`@${handle} + +
      + ))} +
      +
      + )) + } + + +
      +
      + + +
      diff --git a/src/lib/posts.js b/src/lib/posts.js new file mode 100644 index 00000000..52027d65 --- /dev/null +++ b/src/lib/posts.js @@ -0,0 +1,37 @@ +const pad2 = (value) => String(value).padStart(2, "0"); + +const ensureDate = (value) => { + if (value instanceof Date) { + return value; + } + return new Date(value); +}; + +export const getPostSlug = (entry) => { + const id = entry?.id || entry?.slug || ""; + const base = id.replace(/\.md$/, "").split("/").pop(); + const match = base.match(/^(\d{4})-(\d{2})-(\d{2})-(.+)$/); + const raw = match ? match[4] : base; + return raw.replace(/\s+/g, "-").replace(/_/g, "-").toLowerCase(); +}; + +export const getPostDateParts = (entry) => { + const date = ensureDate( + entry?.data?.date ?? + entry?.data?.pubDate ?? + entry?.data?.published ?? + entry?.data?.datetime, + ); + return { + year: String(date.getUTCFullYear()), + month: pad2(date.getUTCMonth() + 1), + day: pad2(date.getUTCDate()), + date, + }; +}; + +export const getPostUrl = (entry) => { + const { year, month, day } = getPostDateParts(entry); + const slug = getPostSlug(entry); + return `/${year}/${month}/${day}/${slug}/`; +}; diff --git a/src/lib/relative-paths.js b/src/lib/relative-paths.js new file mode 100644 index 00000000..a262218c --- /dev/null +++ b/src/lib/relative-paths.js @@ -0,0 +1,22 @@ +const PROTOCOL_RE = /^[a-zA-Z][a-zA-Z\d+\-.]*:/; + +export const getRelativeRoot = (pathname = "/") => { + const cleanPath = String(pathname).split("?")[0].split("#")[0]; + const depth = cleanPath.split("/").filter(Boolean).length; + return depth === 0 ? "./" : "../".repeat(depth); +}; + +export const fromSiteRoot = (pathname, targetPath) => { + const relativeRoot = getRelativeRoot(pathname); + const normalizedTarget = String(targetPath ?? "").replace(/^\/+/, ""); + return normalizedTarget ? `${relativeRoot}${normalizedTarget}` : relativeRoot; +}; + +export const localizeHref = (pathname, href) => { + const value = String(href ?? ""); + if (!value) return value; + if (value.startsWith("#")) return value; + if (value.startsWith("//") || PROTOCOL_RE.test(value)) return value; + if (value.startsWith("/")) return fromSiteRoot(pathname, value); + return value; +}; diff --git a/src/pages/[...slug].astro b/src/pages/[...slug].astro new file mode 100644 index 00000000..7b25810a --- /dev/null +++ b/src/pages/[...slug].astro @@ -0,0 +1,90 @@ +--- +import BaseLayout from "../layouts/BaseLayout.astro"; +import PageLayout from "../layouts/PageLayout.astro"; +import ProjectsLayout from "../layouts/ProjectsLayout.astro"; + +type AstroComponentFactory = (...args: unknown[]) => unknown; +type PageModule = { + frontmatter?: Record; + Content: AstroComponentFactory; +}; + +type RoutedPage = { + slug: string | null; + module: PageModule; + frontmatter: Record; +}; + +export const getStaticPaths = () => { + const pageModules = import.meta.glob("../content/pages/**/*.md", { + eager: true, + }); + + const toRouteSlug = (modulePath: string) => { + const normalizedPath = modulePath.replace(/\\\\/g, "/"); + const marker = "/pages/"; + const markerIndex = normalizedPath.indexOf(marker); + if (markerIndex === -1) return null; + const relativePath = normalizedPath + .slice(markerIndex + marker.length) + .replace(/\.md$/, "") + .replace(/\/index$/, ""); + return relativePath === "index" ? null : relativePath; + }; + + const isProjectContent = (routeSlug: string | null) => + routeSlug === "gsoc/projects" || routeSlug?.startsWith("gsoc/projects/"); + + const routedPages: RoutedPage[] = ( + Object.entries(pageModules) as [string, PageModule][] + ) + .map(([modulePath, module]) => { + const slug = toRouteSlug(modulePath); + if (isProjectContent(slug)) return null; + return { slug, module, frontmatter: module.frontmatter ?? {} }; + }) + .filter((page): page is RoutedPage => page !== null) + .sort((a, b) => (a.slug ?? "").localeCompare(b.slug ?? "")); + + return routedPages.map((page) => ({ + params: { slug: page.slug ?? undefined }, + props: page, + })); +}; + +const { module, frontmatter } = Astro.props as RoutedPage; +const { Content } = module; + +const slug = Astro.params.slug ?? null; +const title = + (typeof frontmatter.title === "string" && frontmatter.title) || + (typeof frontmatter.name === "string" && frontmatter.name) || + undefined; +const description = + typeof frontmatter.description === "string" + ? frontmatter.description + : undefined; +const season = frontmatter.season; +const isGsocSeasonPage = /^gsoc\/\d{4}$/.test(slug ?? ""); +--- + +{ + isGsocSeasonPage ? ( + + + + ) : slug === "gsoc" ? ( + + + + ) : ( + + + + ) +} diff --git a/src/pages/[year]/[month]/[day]/[slug].astro b/src/pages/[year]/[month]/[day]/[slug].astro new file mode 100644 index 00000000..4954246b --- /dev/null +++ b/src/pages/[year]/[month]/[day]/[slug].astro @@ -0,0 +1,28 @@ +--- +import { getCollection } from "astro:content"; +import PostLayout from "../../../../layouts/PostLayout.astro"; +import { getPostDateParts, getPostSlug } from "../../../../lib/posts.js"; + +export async function getStaticPaths() { + const posts = await getCollection("posts"); + return posts.map((post) => { + const { year, month, day } = getPostDateParts(post); + return { + params: { year, month, day, slug: getPostSlug(post) }, + props: { post }, + }; + }); +} + +const { post } = Astro.props; +const { Content } = await post.render(); +--- + + + + diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 00000000..9e6b96a3 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,66 @@ +--- +import { Image } from "astro:assets"; +import BaseLayout from "../layouts/BaseLayout.astro"; +import logo from "../assets/logoOA.png"; +--- + + + + +

      + OpenAstronomy is a collaboration between open source astronomy and + astrophysics projects to share resources, ideas, and to improve code. +

      + +

      Principles of OpenAstronomy (OA)

      + +

      The core principles of OpenAstronomy (OA) include:

      + +
        +
      1. + Open Source: OA projects are committed to their software being + Open Source. This promotes + accessibility, reliability, and scientific reproducibility. +
      2. +
      3. + Open Development: OA projects support the principle of + Open Development, a model where the software is both by and for the community. + More concretely, these projects try to work in publicly-visible spaces, encouraging + discussion and participation from their public user community on both code and + project-level decisions. +
      4. +
      5. + Open Science: OA projects support reproducible science through the use of + open and accessible data both through good data management practices and + effective open software. +
      6. +
      + +

      Get involved with OpenAstronomy

      + +

      + If you want to get involved with OpenAstronomy or maybe you have a project + that would like to join the collaboration, please feel free to get in touch + on the + OpenAstronomy discourse. + You can freely browse the channels but posting and other interaction + requires you to sign up. +

      + +

      Contact the OpenAstronomy Members

      + +

      + As OA is an umbrella organization, you will need to see our + members page for both information and contact details + of all the individual organizations. +

      +
      diff --git a/src/pages/members.astro b/src/pages/members.astro new file mode 100644 index 00000000..90be5704 --- /dev/null +++ b/src/pages/members.astro @@ -0,0 +1,23 @@ +--- +import PageLayout from "../layouts/PageLayout.astro"; +import MemberCard from "../components/MemberCard.astro"; +import members from "../data/members.json"; + +const sortedMembers = Object.entries(members).sort(([a], [b]) => + a.localeCompare(b), +); +--- + + +

      Who is part of OpenAstronomy?

      + +
      + { + sortedMembers.map(([key, details]) => ( +
      + +
      + )) + } +
      +
      diff --git a/src/pages/news.astro b/src/pages/news.astro new file mode 100644 index 00000000..71be0231 --- /dev/null +++ b/src/pages/news.astro @@ -0,0 +1,71 @@ +--- +import PageLayout from "../layouts/PageLayout.astro"; +import { getCollection } from "astro:content"; +import type { CollectionEntry } from "astro:content"; +import { getPostUrl, getPostDateParts } from "../lib/posts.js"; +import { localizeHref } from "../lib/relative-paths.js"; + +const posts = (await getCollection("posts")).sort( + (a, b) => new Date(b.data.date).getTime() - new Date(a.data.date).getTime(), +); +const pagePath = Astro.url.pathname; +const dateFormatter = new Intl.DateTimeFormat("en-US", { + month: "short", + day: "numeric", + year: "numeric", +}); + +const getExcerpt = (post: CollectionEntry<"posts">, maxLength = 280) => { + const customSummary = post?.data?.summary; + if (typeof customSummary === "string" && customSummary.trim()) { + return customSummary.trim(); + } + + const paragraphs = String(post.body ?? "") + .split(/\n\s*\n/) + .map((paragraph) => paragraph.trim()) + .filter(Boolean); + + const firstParagraph = + paragraphs.find((paragraph) => !paragraph.startsWith("![")) ?? + paragraphs[0] ?? + ""; + + const plainText = firstParagraph + .replace(/!\[[^\]]*\]\([^)]+\)/g, "") + .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") + .replace(/`([^`]+)`/g, "$1") + .replace(/[*_>#]/g, "") + .replace(/\s+/g, " ") + .trim(); + + if (plainText.length <= maxLength) { + return plainText; + } + + return `${plainText + .slice(0, maxLength) + .replace(/\s+\S*$/, "") + .trim()}...`; +}; +--- + + +
      + { + posts.map((post) => { + const { date } = getPostDateParts(post); + const postHref = localizeHref(pagePath, getPostUrl(post)); + return ( + + ); + }) + } +
      +
      diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..bcbf8b50 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "astro/tsconfigs/strict" +} From 00335dc5ab0fef2e67df74f5263bc4b064bd35bd Mon Sep 17 00:00:00 2001 From: Nabil Freij Date: Wed, 8 Apr 2026 16:21:28 -0700 Subject: [PATCH 02/25] refactor: improve maintainability of AI-generated site - Add JSDoc to src/lib/posts.js, src/lib/relative-paths.js, scripts/linkcheck.mjs - Add inline comments to src/pages/[...slug].astro - Extract GSoC data logic to src/lib/gsoc.ts (normalizeArray, slugify, formatMemberLink, joinableRows, isProjectFile, buildProject) - Extract member card logic to src/lib/members.ts (buildRepositoryLinks, buildSocialLinks) - Move getExcerpt from news.astro into src/lib/posts.js - Split ProjectsLayout.astro (~300 lines) into focused components: ProjectCard, ProjectDetail, PeopleSection, Modal - Set up Vitest with 82 tests covering posts.js, relative-paths.js, gsoc.ts, and members.ts - Create .github/copilot-instructions.md documenting the project Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/copilot-instructions.md | 94 ++++++ package-lock.json | 348 ++++++++++++++++++++- package.json | 5 +- scripts/linkcheck.mjs | 117 +++++++ src/components/MemberCard.astro | 82 +---- src/components/gsoc/Modal.astro | 66 ++++ src/components/gsoc/PeopleSection.astro | 45 +++ src/components/gsoc/ProjectCard.astro | 42 +++ src/components/gsoc/ProjectDetail.astro | 97 ++++++ src/layouts/ProjectsLayout.astro | 379 +++-------------------- src/lib/__tests__/gsoc.test.ts | 218 +++++++++++++ src/lib/__tests__/members.test.ts | 99 ++++++ src/lib/__tests__/posts.test.js | 175 +++++++++++ src/lib/__tests__/relative-paths.test.js | 104 +++++++ src/lib/gsoc.ts | 240 ++++++++++++++ src/lib/members.ts | 150 +++++++++ src/lib/posts.js | 78 +++++ src/lib/relative-paths.js | 43 +++ src/pages/[...slug].astro | 11 + src/pages/news.astro | 37 +-- 20 files changed, 1986 insertions(+), 444 deletions(-) create mode 100644 .github/copilot-instructions.md create mode 100644 src/components/gsoc/Modal.astro create mode 100644 src/components/gsoc/PeopleSection.astro create mode 100644 src/components/gsoc/ProjectCard.astro create mode 100644 src/components/gsoc/ProjectDetail.astro create mode 100644 src/lib/__tests__/gsoc.test.ts create mode 100644 src/lib/__tests__/members.test.ts create mode 100644 src/lib/__tests__/posts.test.js create mode 100644 src/lib/__tests__/relative-paths.test.js create mode 100644 src/lib/gsoc.ts create mode 100644 src/lib/members.ts diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..813ed8cf --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,94 @@ +# Copilot Instructions + +## Build, Lint, and Check Commands + +```bash +npm install # Install dependencies +npm run dev # Start dev server +npm run build # Build to html/ output directory +npm run preview # Preview the production build + +npm run format # Format with Prettier (run before committing) +npm run format:check # Check formatting without writing +npm run lint # ESLint (src/**/*.{astro,js,ts} and scripts/) +npm run lint:fix # ESLint with auto-fix +npm run lint:md # Markdownlint for all .md files +npm run lint:md:fix # Markdownlint with auto-fix +npm run astro:check # TypeScript/Astro type checking + +# Run all checks (lint + astro:check): +npm run check + +# Link checks (requires a build first): +npm run build && npm run linkcheck:internal +npm run build && npm run linkcheck:external +``` + +**Important:** CI runs `format`, `lint:fix`, and `lint:md:fix` automatically, then **fails if those produce uncommitted changes**. Always run `npm run format && npm run lint:fix && npm run lint:md:fix` and commit the result before pushing. + +There is no test suite — `npm run astro:check` is the primary type/content validation step. + +## Architecture + +This is an [Astro](https://astro.build) static site for [openastronomy.org](https://openastronomy.org). The build output goes to `html/` (not `dist/`). + +### Routing + +- **`src/pages/[...slug].astro`** — catch-all route that maps `src/content/pages/**/*.md` files to URL paths. It selects a layout based on the slug pattern: + - `/gsoc/YYYY` → `ProjectsLayout` (aggregates GSoC project files for that season) + - `/gsoc` → `PageLayout` + - everything else → `BaseLayout` +- **`src/pages/[year]/[month]/[day]/[slug].astro`** — routes for blog posts from `src/content/posts/` +- **`src/pages/index.astro`, `members.astro`, `news.astro`** — standalone pages + +### Content Collections + +Defined in `src/content/config.ts`: + +- **`posts`** — blog posts in `src/content/posts/`, filenames must follow `YYYY-MM-DD-slug.md`. Required frontmatter: `title`, `date`. +- **`pages`** — general pages in `src/content/pages/`, including all GSoC content. The schema uses `.passthrough()` so arbitrary frontmatter is allowed. + +### GSoC Project Pages + +GSoC project ideas live at `src/content/pages/gsoc/YYYY//.md`. The `ProjectsLayout` layout globs all files under `gsoc/` and aggregates them by season. Use `src/content/pages/gsoc/_project_template.md` as the reference for required frontmatter fields: + +```yaml +name: Project title +desc: One-line description +requirements: + - Skill or knowledge requirement +difficulty: low | medium | high +issues: + - https://github.com/org/repo/issues/NNN +mentors: + - github-handle +initiatives: + - GSOC +project_size: + - 90 h (Small) | 175 h (Medium) | 350 h (Large) +tags: + - python +collaborating_projects: + - member-key # must match a key in src/data/members.json +``` + +### Data Files + +JSON files in `src/data/` are imported directly by layouts and pages: + +- **`members.json`** — keyed by member slug; used in `/members/` and to resolve `collaborating_projects` in GSoC pages +- **`gsoc-admins.json`** — GSoC admin GitHub handles by year +- **`site.json`** — global site metadata (title, nav links, etc.) +- **`icons.json`** — icon definitions + +### URL Helpers + +`src/lib/relative-paths.js` provides helpers for generating relative URLs. The site is built with `trailingSlash: "always"`, so all internal links should end with `/`. Use `fromSiteRoot(pathname, "/some/path/")` when constructing absolute-root-relative paths in layouts/components instead of hardcoding `/`. + +## Key Conventions + +- **Absolute paths in components**: Use `fromSiteRoot(Astro.url.pathname, "/target/")` from `src/lib/relative-paths.js`. Hardcoded absolute paths like `/foo/` will break on preview/staging deployments. +- **Blog post filenames**: Must be `YYYY-MM-DD-title-slug.md`. The `getPostSlug` and `getPostUrl` helpers in `src/lib/posts.js` parse the date from the filename. +- **New member**: Add an entry to `src/data/members.json` keyed by a lowercase slug. The logo image goes in `public/` (referenced by filename in the JSON). +- **Prettier + ESLint + markdownlint** all run in CI; run them locally before committing to avoid CI failures on trivial formatting issues. +- **No TypeScript in `.astro` frontmatter beyond what Astro supports** — use `.ts` files in `src/lib/` for shared logic. diff --git a/package-lock.json b/package-lock.json index c35143e6..8ede6fae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,8 @@ "markdownlint-cli2": "^0.21.0", "prettier": "^3.8.1", "prettier-plugin-astro": "^0.14.1", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "vitest": "^4.1.3" } }, "node_modules/@astrojs/check": { @@ -1956,6 +1957,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -1965,6 +1984,13 @@ "@types/ms": "*" } }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -2279,6 +2305,119 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, + "node_modules/@vitest/expect": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.3.tgz", + "integrity": "sha512-CW8Q9KMtXDGHj0vCsqui0M5KqRsu0zm0GNDW7Gd3U7nZ2RFpPKSCpeCXoT+/+5zr1TNlsoQRDEz+LzZUyq6gnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.3", + "@vitest/utils": "4.1.3", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.3.tgz", + "integrity": "sha512-XN3TrycitDQSzGRnec/YWgoofkYRhouyVQj4YNsJ5r/STCUFqMrP4+oxEv3e7ZbLi4og5kIHrZwekDJgw6hcjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.3", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.3.tgz", + "integrity": "sha512-hYqqwuMbpkkBodpRh4k4cQSOELxXky1NfMmQvOfKvV8zQHz8x8Dla+2wzElkMkBvSAJX5TRGHJAQvK0TcOafwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.3.tgz", + "integrity": "sha512-VwgOz5MmT0KhlUj40h02LWDpUBVpflZ/b7xZFA25F29AJzIrE+SMuwzFf0b7t4EXdwRNX61C3B6auIXQTR3ttA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.3", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.3.tgz", + "integrity": "sha512-9l+k/J9KG5wPJDX9BcFFzhhwNjwkRb8RsnYhaT1vPY7OufxmQFc9sZzScRCPTiETzl37mrIWVY9zxzmdVeJwDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.3", + "@vitest/utils": "4.1.3", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.3.tgz", + "integrity": "sha512-ujj5Uwxagg4XUIfAUyRQxAg631BP6e9joRiN99mr48Bg9fRs+5mdUElhOoZ6rP5mBr8Bs3lmrREnkrQWkrsTCw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.3.tgz", + "integrity": "sha512-Pc/Oexse/khOWsGB+w3q4yzA4te7W4gpZZAvk+fr8qXfTURZUMj5i7kuxsNK5mP/dEB6ao3jfr0rs17fHhbHdw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.3", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@volar/kit": { "version": "2.4.27", "resolved": "https://registry.npmjs.org/@volar/kit/-/kit-2.4.27.tgz", @@ -2540,6 +2679,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/astro": { "version": "5.16.15", "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.15.tgz", @@ -2813,6 +2962,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", @@ -3063,6 +3222,13 @@ "dev": true, "license": "MIT" }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/cookie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", @@ -3815,6 +3981,16 @@ "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "license": "MIT" }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -6055,6 +6231,17 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/ofetch": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", @@ -6315,6 +6502,13 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/piccolore": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", @@ -6986,6 +7180,13 @@ "@types/hast": "^3.0.4" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -7049,6 +7250,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, + "license": "MIT" + }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -7178,6 +7393,13 @@ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", "license": "MIT" }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyexec": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", @@ -7203,6 +7425,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -7780,6 +8012,103 @@ } } }, + "node_modules/vitest": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.3.tgz", + "integrity": "sha512-DBc4Tx0MPNsqb9isoyOq00lHftVx/KIU44QOm2q59npZyLUkENn8TMFsuzuO+4U2FUa9rgbbPt3udrP25GcjXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.3", + "@vitest/mocker": "4.1.3", + "@vitest/pretty-format": "4.1.3", + "@vitest/runner": "4.1.3", + "@vitest/snapshot": "4.1.3", + "@vitest/spy": "4.1.3", + "@vitest/utils": "4.1.3", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.3", + "@vitest/browser-preview": "4.1.3", + "@vitest/browser-webdriverio": "4.1.3", + "@vitest/coverage-istanbul": "4.1.3", + "@vitest/coverage-v8": "4.1.3", + "@vitest/ui": "4.1.3", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/vitest/node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", + "dev": true, + "license": "MIT" + }, "node_modules/volar-service-css": { "version": "0.0.68", "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.68.tgz", @@ -8070,6 +8399,23 @@ "node": ">=4" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/widest-line": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", diff --git a/package.json b/package.json index 3a3fe75e..e6661461 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,8 @@ "private": true, "type": "module", "scripts": { + "test": "vitest run", + "test:watch": "vitest", "dev": "astro dev", "build": "astro build", "preview": "astro preview", @@ -34,6 +36,7 @@ "markdownlint-cli2": "^0.21.0", "prettier": "^3.8.1", "prettier-plugin-astro": "^0.14.1", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "vitest": "^4.1.3" } } diff --git a/scripts/linkcheck.mjs b/scripts/linkcheck.mjs index 9b809297..6ede995d 100644 --- a/scripts/linkcheck.mjs +++ b/scripts/linkcheck.mjs @@ -1,6 +1,19 @@ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs"; import path from "node:path"; +/** + * Link checker for the OpenAstronomy static site build. + * + * Usage (after running `npm run build`): + * node scripts/linkcheck.mjs internal # check internal links + anchors + * node scripts/linkcheck.mjs external # check external HTTP(S) URLs + * + * Environment variables: + * LINKCHECK_ROOT Path to the build output directory (default: "html") + * LINKCHECK_SKIP_FILE Path to the skip-patterns file (default: "linkcheck.skip.txt") + * LINKCHECK_TIMEOUT Timeout in ms for external requests (default: 10000) + */ + const mode = process.argv[2] ?? "internal"; const skipFile = process.env.LINKCHECK_SKIP_FILE ?? "linkcheck.skip.txt"; const root = process.env.LINKCHECK_ROOT ?? "html"; @@ -34,6 +47,13 @@ const rootPath = path.resolve(root); const rootLabel = root.replace(/\\/g, "/"); const startTime = Date.now(); +/** + * Recursively collects all `.html` files under `dir`. + * + * @param {string} dir - Directory to search. + * @param {string[]} [collected=[]] - Accumulator for file paths (used in recursion). + * @returns {string[]} Absolute paths to all HTML files found. + */ const collectHtmlFiles = (dir, collected = []) => { const entries = readdirSync(dir, { withFileTypes: true }); for (const entry of entries) { @@ -47,8 +67,19 @@ const collectHtmlFiles = (dir, collected = []) => { return collected; }; +/** + * Extracts all link targets from an HTML string. + * + * Collects values from `href` and `src` attributes, plus individual URLs from + * `srcset` descriptors (which may contain multiple comma-separated entries with + * optional width/density suffixes). + * + * @param {string} html - Raw HTML content. + * @returns {string[]} Array of raw link strings (may include duplicates). + */ const extractLinks = (html) => { const links = []; + // Match href="..." and src="..." attributes const attrRegex = /\s(?:href|src)=['"]([^'"]+)['"]/gi; let match; while ((match = attrRegex.exec(html)) !== null) { @@ -56,6 +87,7 @@ const extractLinks = (html) => { links.push(match[1].trim()); } } + // srcset values are comma-separated: `url1 1x, url2 2x` — extract the URL part only const srcsetRegex = /\ssrcset=['"]([^'"]+)['"]/gi; while ((match = srcsetRegex.exec(html)) !== null) { const raw = match[1] ?? ""; @@ -69,6 +101,15 @@ const extractLinks = (html) => { return links; }; +/** + * Extracts all anchor IDs from an HTML string. + * + * Collects both `id="..."` and `name="..."` attribute values, since both can + * serve as jump targets for fragment links (`#anchor`). + * + * @param {string} html - Raw HTML content. + * @returns {Set} Set of anchor identifier strings. + */ const extractAnchors = (html) => { const anchors = new Set(); const idRegex = /\sid=['"]([^'"]+)['"]/gi; @@ -87,7 +128,16 @@ const extractAnchors = (html) => { return anchors; }; +/** Cache of parsed link/anchor data keyed by absolute file path. */ const fileCache = new Map(); + +/** + * Returns parsed link and anchor data for an HTML file, using a cache to avoid + * re-reading files that are referenced by many source pages. + * + * @param {string} filePath - Absolute path to an HTML file. + * @returns {{ links: string[], anchors: Set }} + */ const getFileData = (filePath) => { if (fileCache.has(filePath)) { return fileCache.get(filePath); @@ -101,6 +151,16 @@ const getFileData = (filePath) => { return data; }; +/** + * Returns true if a link should be ignored by the current check mode. + * + * In `internal` mode: skips external HTTP(S) URLs and non-web schemes. + * In `external` mode: skips everything that isn't HTTP(S). + * Always skips empty values, bare `#`, `javascript:`, and `data:` URIs. + * + * @param {string} link - Raw link value from an HTML attribute. + * @returns {boolean} + */ const isSkippableLink = (link) => { if (!link || link === "#") return true; const trimmed = link.trim(); @@ -116,6 +176,20 @@ const isSkippableLink = (link) => { return skipPatterns.some((pattern) => pattern.test(trimmed)); }; +/** + * Resolves an internal link to an absolute file path and optional anchor. + * + * Handles absolute paths (`/members/`), relative paths (`../foo/`), and + * fragment-only links (`#section`). Applies the same directory-index resolution + * that a web server would: `/foo/` → `/foo/index.html`. + * + * Returns `null` for protocol-relative URLs (`//example.com/`) which cannot be + * resolved as local files. + * + * @param {string} link - Raw link value from an HTML attribute. + * @param {string} currentFile - Absolute path to the HTML file containing the link. + * @returns {{ filePath: string, anchor: string, urlPath?: string } | null} + */ const resolveInternalTarget = (link, currentFile) => { const trimmed = link.trim(); const [pathPartRaw, hashPartRaw] = trimmed.split("#"); @@ -182,6 +256,13 @@ const resolveInternalTarget = (link, currentFile) => { }; }; +/** + * Formats an absolute file path as a human-readable source label for output. + * Directory-index files are shown as their directory path (e.g. `html/foo/`). + * + * @param {string} filePath - Absolute path to an HTML file. + * @returns {string} + */ const displaySourcePath = (filePath) => { const rel = path.relative(rootPath, filePath).split(path.sep).join("/"); if (rel === "index.html") return `${rootLabel}/`; @@ -190,6 +271,14 @@ const displaySourcePath = (filePath) => { return `${rootLabel}/${rel}`; }; +/** + * Formats a resolved target as a human-readable label for error output. + * + * @param {string|undefined} urlPath - URL path string if known. + * @param {string} filePath - Absolute file path of the resolved target. + * @param {string} anchor - Fragment identifier (without `#`), or empty string. + * @returns {string} + */ const displayTargetPath = (urlPath, filePath, anchor) => { let displayPath = ""; if (urlPath) { @@ -202,6 +291,12 @@ const displayTargetPath = (urlPath, filePath, anchor) => { return anchor ? `${displayPath}#${anchor}` : displayPath; }; +/** + * Prints broken-link failures grouped by source page, then exits with code 1. + * + * @param {{ source: string, target: string, type: string }[]} failures + * @param {number} scannedCount - Total number of links that were checked. + */ const reportFailures = (failures, scannedCount) => { const grouped = new Map(); for (const failure of failures) { @@ -221,11 +316,17 @@ const reportFailures = (failures, scannedCount) => { ); }; +/** + * Prints a success summary and exits with code 0. + * + * @param {number} scannedCount - Total number of links that were checked. + */ const reportSuccess = (scannedCount) => { const elapsed = ((Date.now() - startTime) / 1000).toFixed(3); console.log(`OK: Scanned ${scannedCount} links in ${elapsed} seconds.`); }; +/** Checks all internal links and anchors in the build output. Exits 1 on failure. */ const runInternalCheck = () => { const htmlFiles = collectHtmlFiles(rootPath); const failures = []; @@ -268,6 +369,17 @@ const runInternalCheck = () => { reportSuccess(scannedCount); }; +/** + * Checks whether a single external URL responds with a successful status code. + * + * Attempts a HEAD request first (faster, no body transfer). Falls back to GET + * for servers that return 405 (Method Not Allowed) or 400 for HEAD requests, + * which is common on some CDNs and custom servers. + * + * @param {string} url - Fully-qualified HTTP(S) URL to check. + * @param {number} timeoutMs - Abort timeout in milliseconds. + * @returns {Promise} True if the URL returned a 2xx/3xx response. + */ const checkExternalUrl = async (url, timeoutMs) => { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), timeoutMs); @@ -292,6 +404,11 @@ const checkExternalUrl = async (url, timeoutMs) => { } }; +/** + * Checks all external HTTP(S) links found in the build output. + * Each unique URL is fetched only once even if it appears on many pages. + * Exits 1 if any URL is unreachable. + */ const runExternalCheck = async () => { const htmlFiles = collectHtmlFiles(rootPath); const linksBySource = new Map(); diff --git a/src/components/MemberCard.astro b/src/components/MemberCard.astro index 825bc394..b09a3bbd 100644 --- a/src/components/MemberCard.astro +++ b/src/components/MemberCard.astro @@ -2,6 +2,7 @@ import { Image } from "astro:assets"; import type { ImageMetadata } from "astro"; import icons from "../data/icons.json"; +import { buildRepositoryLinks, buildSocialLinks } from "../lib/members.ts"; type MemberDetails = { name: string; @@ -14,82 +15,17 @@ type MemberDetails = { microblogging?: Record; }; -const { memberKey, details: rawDetails } = Astro.props as { +const { memberKey, details } = Astro.props as { memberKey: string; details: MemberDetails; }; -const details = rawDetails; -const entries = (value?: Record) => - value ? Object.entries(value) : []; -const repositories = entries(details.repositories); -const mailingLists = entries(details.mailinglist); -const chats = entries(details.chat); -const microblogging = entries(details.microblogging); -const repoProviders = { - github: { - href: (repo: string) => `https://github.com/${repo}`, - icon: icons.gh_logo, - viewBox: "0 0 16 16", - height: undefined, - }, - bitbucket: { - href: (repo: string) => `https://bitbucket.com/${repo}`, - icon: icons.bb_logo, - viewBox: "0 0 30 30", - height: "50%", - }, - sourceforge: { - href: (repo: string) => `https://sourceforge.net/projects/${repo}`, - icon: icons.sf_logo, - viewBox: "0 0 15 10", - height: "50%", - }, -} as const; -const repositoryLinks = repositories.map(([provider, repo]) => { - const knownProvider = repoProviders[provider as keyof typeof repoProviders]; - if (knownProvider) { - return { - href: knownProvider.href(repo), - label: repo, - icon: knownProvider.icon, - viewBox: knownProvider.viewBox, - height: knownProvider.height, - }; - } - return { - href: repo, - label: memberKey, - icon: icons.gh_logo, - viewBox: "0 0 16 16", - height: undefined, - }; -}); -const socialLinks = microblogging - .map(([platform, handle]) => { - if (platform === "x") { - return { - href: `https://x.com/${handle}`, - label: `@${handle}`, - icon: icons.x_logo, - }; - } - if (platform === "mastodon") { - const [, username, host] = handle.split("@"); - if (!username || !host) { - return null; - } - return { - href: `https://${host}/@${username}`, - label: handle, - icon: icons.mastodon_logo, - }; - } - return null; - }) - .filter( - (link): link is { href: string; label: string; icon: string } => - link !== null, - ); + +const mailingLists = details.mailinglist + ? Object.entries(details.mailinglist) + : []; +const chats = details.chat ? Object.entries(details.chat) : []; +const repositoryLinks = buildRepositoryLinks(details.repositories, memberKey); +const socialLinks = buildSocialLinks(details.microblogging); const memberLogoModules = import.meta.glob<{ default: ImageMetadata }>( "../assets/members/*.{png,jpg,jpeg,webp,avif}", diff --git a/src/components/gsoc/Modal.astro b/src/components/gsoc/Modal.astro new file mode 100644 index 00000000..a6e81882 --- /dev/null +++ b/src/components/gsoc/Modal.astro @@ -0,0 +1,66 @@ +--- +/** + * Modal overlay for displaying a GSoC project's detail panel. + * + * The modal is initially `hidden`. When a ProjectCard button is clicked, the + * corresponding ProjectDetail element's inner HTML is copied into the modal + * content area and the modal is shown. Closing can be done via: + * - The "Close" button + * - Clicking the backdrop + * - Pressing Escape + */ +--- + + + + diff --git a/src/components/gsoc/PeopleSection.astro b/src/components/gsoc/PeopleSection.astro new file mode 100644 index 00000000..8c35b3b5 --- /dev/null +++ b/src/components/gsoc/PeopleSection.astro @@ -0,0 +1,45 @@ +--- +/** + * Renders a people grid section (mentors or admins) for a GSoC season page. + * Each person is shown with their GitHub avatar and a link to their profile. + */ + +type Props = { + id: string; + heading: string; + intro: string; + handles: string[]; +}; + +const { id, heading, intro, handles } = Astro.props; +--- + +
      +

      + + {heading} + +

      +

      {intro}

      +
      + { + handles.map((handle) => ( +
      + {`@${handle} + +
      + )) + } +
      +
      diff --git a/src/components/gsoc/ProjectCard.astro b/src/components/gsoc/ProjectCard.astro new file mode 100644 index 00000000..161f436c --- /dev/null +++ b/src/components/gsoc/ProjectCard.astro @@ -0,0 +1,42 @@ +--- +/** + * Summary card for a single GSoC project idea, shown in the season grid. + * Clicking the card opens the detail modal via the data-project-detail attribute. + */ +import type { GsocProject } from "../../lib/gsoc.ts"; + +const { project } = Astro.props as { project: GsocProject }; +const detailId = `detail-${project.anchor}`; +--- + + diff --git a/src/components/gsoc/ProjectDetail.astro b/src/components/gsoc/ProjectDetail.astro new file mode 100644 index 00000000..00db74c3 --- /dev/null +++ b/src/components/gsoc/ProjectDetail.astro @@ -0,0 +1,97 @@ +--- +/** + * Expanded detail panel for a GSoC project. + * + * This element is rendered `hidden` in the page and its content is copied into + * the modal overlay when the user clicks the corresponding ProjectCard. It must + * have an `id` that matches the `data-project-detail` attribute of the card. + */ +import type { GsocProject } from "../../lib/gsoc.ts"; + +const { project } = Astro.props as { project: GsocProject }; +const ProjectContent = project.Content; +--- + + diff --git a/src/layouts/ProjectsLayout.astro b/src/layouts/ProjectsLayout.astro index 54bfbee6..ae6c95b1 100644 --- a/src/layouts/ProjectsLayout.astro +++ b/src/layouts/ProjectsLayout.astro @@ -1,162 +1,75 @@ --- +/** + * Layout for GSoC season pages (e.g. /gsoc/2025/). + * + * Aggregates all project idea files for the requested season from + * `src/content/pages/gsoc///.md`, then renders them + * as a tabbed page with three sections: Projects, Mentors, Admins. + * + * Project data transformation is handled by `src/lib/gsoc.ts`. Rendering is + * delegated to the focused sub-components in `src/components/gsoc/`. + */ import BaseLayout from "./BaseLayout.astro"; +import ProjectCard from "../components/gsoc/ProjectCard.astro"; +import ProjectDetail from "../components/gsoc/ProjectDetail.astro"; +import PeopleSection from "../components/gsoc/PeopleSection.astro"; +import Modal from "../components/gsoc/Modal.astro"; import admins from "../data/gsoc-admins.json"; import members from "../data/members.json"; import { fromSiteRoot } from "../lib/relative-paths.js"; - -type AstroComponentFactory = (...args: unknown[]) => unknown; -type ProjectModule = { - frontmatter?: Record; - Content: AstroComponentFactory; -}; +import { buildProject, isProjectFile } from "../lib/gsoc.ts"; +import type { ProjectModule } from "../lib/gsoc.ts"; const frontmatter = Astro.props.frontmatter ?? {}; const pagePath = Astro.url.pathname; const title = Astro.props.title ?? frontmatter.title; const season = Astro.props.season ?? frontmatter.season; -const seasonKeyFromFrontmatter = String(season ?? "").trim(); + +// Prefer the year extracted from the URL path over the frontmatter `season` +// field, since the URL is authoritative and avoids stale frontmatter issues. const seasonMatch = Astro.url.pathname.match(/\/gsoc\/(\d{4})(?:\/|$)/); const seasonKey = ( - seasonMatch ? seasonMatch[1] : seasonKeyFromFrontmatter + seasonMatch ? seasonMatch[1] : String(season ?? "").trim() ).trim(); + const pageTitle = seasonKey ? title ? `${title} (${seasonKey})` : `GSoC ${seasonKey}` : (title ?? "OpenAstronomy"); + +// Eagerly load all GSoC markdown files; filter and transform in one pass below. const projectModules = import.meta.glob( "../content/pages/gsoc/**/*.md", { eager: true }, ); + const memberLookup = members as Record; const adminLookup = admins as Record; -const normalizeArray = (value: unknown): string[] => { - const values = Array.isArray(value) - ? value - : value !== null && value !== undefined && value !== "" - ? [value] - : []; - return values - .map((item) => String(item ?? "").trim()) - .filter((item) => { - const normalized = item.toLowerCase(); - if (!normalized) { - return false; - } - return !["none", "n/a", "na", "null"].includes(normalized); - }); -}; - -const slugify = (value: string) => - value - .toLowerCase() - .trim() - .replace(/[^a-z0-9]+/g, "-") - .replace(/(^-|-$)/g, ""); - -const formatMemberLink = (value: string) => { - const key = String(value); - const member = memberLookup[key]; - if (member?.name) { - return { - label: member.name, - href: fromSiteRoot( - pagePath, - `/members/#${encodeURIComponent(member.name)}`, - ), - }; - } - return { label: key, href: null }; -}; -const joinableRows = (rows: Array<{ label: string; values: string[] }>) => - rows.filter((row) => row.values.length > 0); - const projects = (Object.entries(projectModules) as [string, ProjectModule][]) - .filter(([path]) => { - const normalizedPath = path.replace(/\\\\/g, "/"); - const parts = normalizedPath.split("/"); - const gsocIndex = parts.lastIndexOf("gsoc"); - if (gsocIndex === -1) { - return false; - } - const year = parts[gsocIndex + 1]; - if (!/^\d{4}$/.test(year ?? "")) { - return false; - } - if (parts.length < gsocIndex + 4) { - return false; - } - const filename = parts[parts.length - 1] ?? ""; - if (filename.startsWith("_") || filename === "index.md") { - return false; - } - return year === seasonKey; - }) - .map(([path, mod]) => { - const data = mod.frontmatter ?? {}; - const normalizedPath = path.replace(/\\\\/g, "/"); - const parts = normalizedPath.split("/"); - const gsocIndex = parts.lastIndexOf("gsoc"); - const year = parts[gsocIndex + 1] ?? seasonKey; - const suborg = parts[gsocIndex + 2] ?? ""; - const fileSlug = (parts[parts.length - 1] ?? "").replace(/\.md$/, ""); - const fallbackName = fileSlug; - const name = - typeof data.name === "string" && data.name.trim() - ? data.name.trim() - : fallbackName; - const projectPath = `/gsoc/${year}/${suborg}/${fileSlug}/`; - const desc = typeof data.desc === "string" ? data.desc : ""; - const requirements = normalizeArray(data.requirements); - const mentors = normalizeArray(data.mentors); - const initiatives = normalizeArray(data.initiatives); - const projectSize = normalizeArray(data.project_size); - const tags = normalizeArray(data.tags); - const collaborators = normalizeArray(data.collaborating_projects).map( - formatMemberLink, - ); - const issues = normalizeArray(data.issues); - const detailRows = joinableRows([ - { label: "Initiatives", values: initiatives }, - { label: "Project size", values: projectSize }, - { label: "Tags", values: tags }, - ]); - const cardRows = joinableRows([ - { label: "Mentors", values: mentors }, - ...detailRows, - ]); - - return { - name, - anchor: slugify(name), - href: fromSiteRoot(pagePath, projectPath), - desc, - requirements, - mentors, - collaborators, - issues, - cardRows, - detailRows, - Content: mod.Content, - }; - }); - -projects.sort((a, b) => a.name.localeCompare(b.name)); + .filter(([path]) => isProjectFile(path.replace(/\\/g, "/"), seasonKey)) + .map(([path, mod]) => + buildProject(path, mod, seasonKey, memberLookup, pagePath, fromSiteRoot), + ) + .sort((a, b) => a.name.localeCompare(b.name)); const mentors = Array.from( - new Set(projects.flatMap((project) => project.mentors).filter(Boolean)), + new Set(projects.flatMap((p) => p.mentors).filter(Boolean)), ).sort((a, b) => a.localeCompare(b)); const adminHandles = adminLookup[seasonKey] ?? []; + const projectsSectionLabel = `GSoC Projects for ${seasonKey}`; const mentorsSectionLabel = `Mentors for ${seasonKey}`; const adminsSectionLabel = `Admins for ${seasonKey}`; + const sectionLinks = [ { id: "projects", label: "Projects", heading: projectsSectionLabel }, { id: "mentors", label: "Mentors", heading: mentorsSectionLabel }, { id: "admins", label: "Admins", heading: adminsSectionLabel }, ]; + const peopleSections = [ { id: "mentors", @@ -201,228 +114,28 @@ const peopleSections = [ {projects.length === 0 ?

      No projects listed yet.

      : null}
      { - projects.map((project) => { - const ProjectContent = project.Content; - const detailId = `detail-${project.anchor}`; - return ( - <> - - - - - ); - }) + projects.map((project) => ( + <> + + + + )) }
      { peopleSections.map((section) => ( -
      -

      - - {section.heading} - -

      -

      {section.intro}

      -
      - {section.handles.map((handle) => ( -
      - {`@${handle} - -
      - ))} -
      -
      + )) } - +

      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 literal 0 HcmV?d00001 diff --git a/img/logo/logoOA_white_svg.png b/src/assets/logoOA_white.png similarity index 100% rename from img/logo/logoOA_white_svg.png rename to src/assets/logoOA_white.png diff --git a/img/members/astronomy-commons.png b/src/assets/members/astronomy-commons.png similarity index 100% rename from img/members/astronomy-commons.png rename to src/assets/members/astronomy-commons.png diff --git a/img/members/astropy.png b/src/assets/members/astropy.png similarity index 100% rename from img/members/astropy.png rename to src/assets/members/astropy.png diff --git a/src/assets/members/casacore.png b/src/assets/members/casacore.png new file mode 100644 index 0000000000000000000000000000000000000000..9537efff8d10d858af803af071ed66f7d9cae9c7 GIT binary patch literal 8825 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

    - - diff --git a/src/lib/__tests__/gsoc.test.ts b/src/lib/__tests__/gsoc.test.ts new file mode 100644 index 00000000..22e6c32d --- /dev/null +++ b/src/lib/__tests__/gsoc.test.ts @@ -0,0 +1,218 @@ +import { describe, it, expect } from "vitest"; +import { + normalizeArray, + slugify, + formatMemberLink, + joinableRows, + isProjectFile, +} from "../gsoc.ts"; + +// --------------------------------------------------------------------------- +// normalizeArray +// --------------------------------------------------------------------------- + +describe("normalizeArray", () => { + it("returns an array value as-is after trimming", () => { + expect(normalizeArray(["python", "rust"])).toEqual(["python", "rust"]); + }); + + it("wraps a scalar string in an array", () => { + expect(normalizeArray("python")).toEqual(["python"]); + }); + + it("returns an empty array for null", () => { + expect(normalizeArray(null)).toEqual([]); + }); + + it("returns an empty array for undefined", () => { + expect(normalizeArray(undefined)).toEqual([]); + }); + + it("returns an empty array for an empty string", () => { + expect(normalizeArray("")).toEqual([]); + }); + + it('filters out the placeholder value "none"', () => { + expect(normalizeArray(["python", "none"])).toEqual(["python"]); + }); + + it('filters out the placeholder value "n/a" (case-insensitive)', () => { + expect(normalizeArray(["N/A", "rust"])).toEqual(["rust"]); + }); + + it('filters out the placeholder value "null"', () => { + expect(normalizeArray(["null"])).toEqual([]); + }); + + it("trims whitespace from values", () => { + expect(normalizeArray([" python ", " rust "])).toEqual([ + "python", + "rust", + ]); + }); + + it("filters out values that are blank after trimming", () => { + expect(normalizeArray(["python", " "])).toEqual(["python"]); + }); + + it("coerces numbers to strings", () => { + expect(normalizeArray(42)).toEqual(["42"]); + }); +}); + +// --------------------------------------------------------------------------- +// slugify +// --------------------------------------------------------------------------- + +describe("slugify", () => { + it("lowercases the input", () => { + expect(slugify("Hello World")).toBe("hello-world"); + }); + + it("replaces spaces with hyphens", () => { + expect(slugify("my cool project")).toBe("my-cool-project"); + }); + + it("collapses multiple spaces into one hyphen", () => { + expect(slugify("a b")).toBe("a-b"); + }); + + it("removes leading and trailing hyphens", () => { + expect(slugify(" leading")).toBe("leading"); + expect(slugify("trailing ")).toBe("trailing"); + }); + + it("replaces special characters with hyphens", () => { + expect(slugify("C++")).toBe("c"); + expect(slugify("node.js")).toBe("node-js"); + }); + + it("preserves digits", () => { + expect(slugify("Project 2025")).toBe("project-2025"); + }); +}); + +// --------------------------------------------------------------------------- +// formatMemberLink +// --------------------------------------------------------------------------- + +const memberLookup = { + sunpy: { name: "SunPy" }, + astropy: { name: "Astropy" }, +}; + +/** Simple stand-in for fromSiteRoot that just prefixes with the pathname. */ +const fakeFromSiteRoot = (pathname: string, target: string) => + `${pathname}${target}`; + +describe("formatMemberLink", () => { + it("returns the member name and an href for a known key", () => { + const result = formatMemberLink( + "sunpy", + memberLookup, + "/gsoc/2025/", + fakeFromSiteRoot, + ); + expect(result.label).toBe("SunPy"); + expect(result.href).toContain("members"); + }); + + it("encodes the member name in the href anchor", () => { + const result = formatMemberLink( + "astropy", + memberLookup, + "/", + fakeFromSiteRoot, + ); + expect(result.href).toContain(encodeURIComponent("Astropy")); + }); + + it("returns the raw key with a null href for an unknown member", () => { + const result = formatMemberLink( + "unknown-org", + memberLookup, + "/", + fakeFromSiteRoot, + ); + expect(result.label).toBe("unknown-org"); + expect(result.href).toBeNull(); + }); +}); + +// --------------------------------------------------------------------------- +// joinableRows +// --------------------------------------------------------------------------- + +describe("joinableRows", () => { + it("keeps rows that have values", () => { + const rows = [ + { label: "Tags", values: ["python"] }, + { label: "Empty", values: [] }, + ]; + expect(joinableRows(rows)).toEqual([{ label: "Tags", values: ["python"] }]); + }); + + it("returns an empty array when all rows are empty", () => { + expect(joinableRows([{ label: "X", values: [] }])).toEqual([]); + }); + + it("returns all rows when all have values", () => { + const rows = [ + { label: "A", values: ["1"] }, + { label: "B", values: ["2"] }, + ]; + expect(joinableRows(rows)).toHaveLength(2); + }); +}); + +// --------------------------------------------------------------------------- +// isProjectFile +// --------------------------------------------------------------------------- + +describe("isProjectFile", () => { + it("returns true for a valid project file", () => { + expect( + isProjectFile( + "../content/pages/gsoc/2025/sunpy/my-project.md", + "2025", + ), + ).toBe(true); + }); + + it("returns false for index.md files", () => { + expect( + isProjectFile("../content/pages/gsoc/2025/sunpy/index.md", "2025"), + ).toBe(false); + }); + + it("returns false for template files starting with _", () => { + expect( + isProjectFile( + "../content/pages/gsoc/_project_template.md", + "2025", + ), + ).toBe(false); + }); + + it("returns false for files in the wrong year", () => { + expect( + isProjectFile( + "../content/pages/gsoc/2024/sunpy/my-project.md", + "2025", + ), + ).toBe(false); + }); + + it("returns false for files at the season root (no suborg subdir)", () => { + // gsoc / 2025 / project.md — only 3 parts after gsoc, needs 4 + expect( + isProjectFile("../content/pages/gsoc/2025/project.md", "2025"), + ).toBe(false); + }); + + it("returns false when the path contains no gsoc segment", () => { + expect(isProjectFile("../content/pages/other/file.md", "2025")).toBe( + false, + ); + }); +}); diff --git a/src/lib/__tests__/members.test.ts b/src/lib/__tests__/members.test.ts new file mode 100644 index 00000000..202a4a58 --- /dev/null +++ b/src/lib/__tests__/members.test.ts @@ -0,0 +1,99 @@ +import { describe, it, expect } from "vitest"; +import { buildRepositoryLinks, buildSocialLinks } from "../members.ts"; + +// --------------------------------------------------------------------------- +// buildRepositoryLinks +// --------------------------------------------------------------------------- + +describe("buildRepositoryLinks", () => { + it("returns an empty array when repositories is undefined", () => { + expect(buildRepositoryLinks(undefined, "myorg")).toEqual([]); + }); + + it("returns an empty array for an empty object", () => { + expect(buildRepositoryLinks({}, "myorg")).toEqual([]); + }); + + it("builds a github link from a known provider", () => { + const [link] = buildRepositoryLinks({ github: "astropy/astropy" }, "astropy"); + expect(link.href).toBe("https://github.com/astropy/astropy"); + expect(link.label).toBe("astropy/astropy"); + }); + + it("builds a bitbucket link from a known provider", () => { + const [link] = buildRepositoryLinks({ bitbucket: "myteam/myrepo" }, "myorg"); + expect(link.href).toBe("https://bitbucket.com/myteam/myrepo"); + expect(link.label).toBe("myteam/myrepo"); + }); + + it("builds a sourceforge link from a known provider", () => { + const [link] = buildRepositoryLinks( + { sourceforge: "my-project" }, + "myorg", + ); + expect(link.href).toBe("https://sourceforge.net/projects/my-project"); + expect(link.label).toBe("my-project"); + }); + + it("uses the raw value as href and memberKey as label for unknown providers", () => { + const [link] = buildRepositoryLinks( + { gitlab: "https://gitlab.com/org/repo" }, + "org", + ); + expect(link.href).toBe("https://gitlab.com/org/repo"); + expect(link.label).toBe("org"); + }); + + it("handles multiple providers", () => { + const links = buildRepositoryLinks( + { github: "org/repo", bitbucket: "org/repo2" }, + "org", + ); + expect(links).toHaveLength(2); + }); +}); + +// --------------------------------------------------------------------------- +// buildSocialLinks +// --------------------------------------------------------------------------- + +describe("buildSocialLinks", () => { + it("returns an empty array when microblogging is undefined", () => { + expect(buildSocialLinks(undefined)).toEqual([]); + }); + + it("returns an empty array for an empty object", () => { + expect(buildSocialLinks({})).toEqual([]); + }); + + it("builds an X (Twitter) link", () => { + const [link] = buildSocialLinks({ x: "astropy" }); + expect(link.href).toBe("https://x.com/astropy"); + expect(link.label).toBe("@astropy"); + }); + + it("builds a Mastodon link from a valid @user@instance handle", () => { + const [link] = buildSocialLinks({ + mastodon: "@astropy@mastodon.social", + }); + expect(link.href).toBe("https://mastodon.social/@astropy"); + expect(link.label).toBe("@astropy@mastodon.social"); + }); + + it("skips Mastodon entries with malformed handles", () => { + // A handle without the @instance part cannot be resolved + expect(buildSocialLinks({ mastodon: "astropy" })).toEqual([]); + }); + + it("silently ignores unsupported platforms", () => { + expect(buildSocialLinks({ bluesky: "astropy.bsky.social" })).toEqual([]); + }); + + it("handles multiple platforms", () => { + const links = buildSocialLinks({ + x: "astropy", + mastodon: "@astropy@mastodon.social", + }); + expect(links).toHaveLength(2); + }); +}); diff --git a/src/lib/__tests__/posts.test.js b/src/lib/__tests__/posts.test.js new file mode 100644 index 00000000..85736b65 --- /dev/null +++ b/src/lib/__tests__/posts.test.js @@ -0,0 +1,175 @@ +import { describe, it, expect } from "vitest"; +import { + getPostSlug, + getPostDateParts, + getPostUrl, + getExcerpt, +} from "../posts.js"; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** Creates a minimal fake post entry for testing. */ +const makeEntry = (id, data = {}) => ({ id, data }); + +/** Creates a fake entry that also has a `body` (for getExcerpt). */ +const makePostEntry = (id, data = {}, body = "") => ({ id, data, body }); + +// --------------------------------------------------------------------------- +// getPostSlug +// --------------------------------------------------------------------------- + +describe("getPostSlug", () => { + it("strips the YYYY-MM-DD prefix from a dated filename", () => { + expect(getPostSlug(makeEntry("2024-03-15-my-post.md"))).toBe("my-post"); + }); + + it("handles multi-word slugs separated by hyphens", () => { + expect(getPostSlug(makeEntry("2024-03-15-hello-world-post.md"))).toBe( + "hello-world-post", + ); + }); + + it("returns the base filename unchanged when there is no date prefix", () => { + expect(getPostSlug(makeEntry("about-us.md"))).toBe("about-us"); + }); + + it("normalises underscores to hyphens", () => { + expect(getPostSlug(makeEntry("2024-01-01-some_post.md"))).toBe("some-post"); + }); + + it("lowercases the result", () => { + expect(getPostSlug(makeEntry("2024-01-01-MyPost.md"))).toBe("mypost"); + }); + + it("uses the last path segment when id contains directories", () => { + expect(getPostSlug(makeEntry("posts/2024-03-15-deep-post.md"))).toBe( + "deep-post", + ); + }); + + it("falls back to entry.slug when id is absent", () => { + expect(getPostSlug({ slug: "2024-03-15-slug-post.md", data: {} })).toBe( + "slug-post", + ); + }); +}); + +// --------------------------------------------------------------------------- +// getPostDateParts +// --------------------------------------------------------------------------- + +describe("getPostDateParts", () => { + it("returns correct UTC year/month/day from a Date object", () => { + const entry = makeEntry("foo.md", { date: new Date("2024-03-05T00:00:00Z") }); + const { year, month, day } = getPostDateParts(entry); + expect(year).toBe("2024"); + expect(month).toBe("03"); + expect(day).toBe("05"); + }); + + it("pads single-digit months and days with leading zeros", () => { + const entry = makeEntry("foo.md", { date: new Date("2024-01-07T00:00:00Z") }); + const { month, day } = getPostDateParts(entry); + expect(month).toBe("01"); + expect(day).toBe("07"); + }); + + it("also accepts a date string in the data field", () => { + const entry = makeEntry("foo.md", { date: "2023-11-20" }); + const { year, month, day } = getPostDateParts(entry); + expect(year).toBe("2023"); + expect(month).toBe("11"); + expect(day).toBe("20"); + }); + + it("falls back to pubDate when date is absent", () => { + const entry = makeEntry("foo.md", { + pubDate: new Date("2022-06-15T00:00:00Z"), + }); + const { year } = getPostDateParts(entry); + expect(year).toBe("2022"); + }); + + it("returns the resolved Date object", () => { + const d = new Date("2024-03-15T00:00:00Z"); + const entry = makeEntry("foo.md", { date: d }); + expect(getPostDateParts(entry).date).toBeInstanceOf(Date); + }); +}); + +// --------------------------------------------------------------------------- +// getPostUrl +// --------------------------------------------------------------------------- + +describe("getPostUrl", () => { + it("builds a /year/month/day/slug/ URL", () => { + const entry = makeEntry("2024-03-15-my-post.md", { + date: new Date("2024-03-15T00:00:00Z"), + }); + expect(getPostUrl(entry)).toBe("/2024/03/15/my-post/"); + }); + + it("includes leading and trailing slashes", () => { + const url = getPostUrl( + makeEntry("2020-01-01-test.md", { date: new Date("2020-01-01T00:00:00Z") }), + ); + expect(url).toMatch(/^\//); + expect(url).toMatch(/\/$/); + }); +}); + +// --------------------------------------------------------------------------- +// getExcerpt +// --------------------------------------------------------------------------- + +describe("getExcerpt", () => { + it("returns the frontmatter summary when present", () => { + const post = makePostEntry("p.md", { summary: "Custom summary." }, "Body"); + expect(getExcerpt(post)).toBe("Custom summary."); + }); + + it("strips Markdown links, keeping the link label", () => { + const post = makePostEntry( + "p.md", + {}, + "Read [the docs](https://example.com) for more.", + ); + expect(getExcerpt(post)).toBe("Read the docs for more."); + }); + + it("strips inline code backticks", () => { + const post = makePostEntry("p.md", {}, "Use `npm install` to set up."); + expect(getExcerpt(post)).toBe("Use npm install to set up."); + }); + + it("strips Markdown images", () => { + const post = makePostEntry( + "p.md", + {}, + "![Alt text](image.png)\n\nThe real paragraph.", + ); + // Image-only first paragraph is skipped; second paragraph used + expect(getExcerpt(post)).toBe("The real paragraph."); + }); + + it("truncates at a word boundary when text exceeds maxLength", () => { + // Each "word" is 4 chars + 1 space = 5 chars. + // With maxLength=12, slice(0,12) = "word word wo" — "wo" is partial. + // The implementation must strip the partial word, leaving "word word". + const text = "word word word word word"; + const result = getExcerpt(makePostEntry("p.md", {}, text), 12); + expect(result).toBe("word word..."); + }); + + it("returns the full text when it is shorter than maxLength", () => { + const post = makePostEntry("p.md", {}, "Short text."); + expect(getExcerpt(post, 280)).toBe("Short text."); + }); + + it("strips heading markers", () => { + const post = makePostEntry("p.md", {}, "## Section heading"); + expect(getExcerpt(post)).toBe("Section heading"); + }); +}); diff --git a/src/lib/__tests__/relative-paths.test.js b/src/lib/__tests__/relative-paths.test.js new file mode 100644 index 00000000..9785c88b --- /dev/null +++ b/src/lib/__tests__/relative-paths.test.js @@ -0,0 +1,104 @@ +import { describe, it, expect } from "vitest"; +import { + getRelativeRoot, + fromSiteRoot, + localizeHref, +} from "../relative-paths.js"; + +// --------------------------------------------------------------------------- +// getRelativeRoot +// --------------------------------------------------------------------------- + +describe("getRelativeRoot", () => { + it("returns ./ for the root path", () => { + expect(getRelativeRoot("/")).toBe("./"); + }); + + it("returns ../ for a one-segment path", () => { + expect(getRelativeRoot("/members/")).toBe("../"); + }); + + it("returns ../../ for a two-segment path", () => { + expect(getRelativeRoot("/gsoc/2025/")).toBe("../../"); + }); + + it("returns ../../../ for a three-segment path", () => { + expect(getRelativeRoot("/a/b/c/")).toBe("../../../"); + }); + + it("defaults to ./ when pathname is omitted", () => { + expect(getRelativeRoot()).toBe("./"); + }); + + it("ignores query strings when counting depth", () => { + expect(getRelativeRoot("/members/?q=foo")).toBe("../"); + }); + + it("ignores hash fragments when counting depth", () => { + expect(getRelativeRoot("/members/#section")).toBe("../"); + }); +}); + +// --------------------------------------------------------------------------- +// fromSiteRoot +// --------------------------------------------------------------------------- + +describe("fromSiteRoot", () => { + it("builds a relative path from the root", () => { + expect(fromSiteRoot("/members/", "/css/style.css")).toBe( + "../css/style.css", + ); + }); + + it("returns the relative root alone when targetPath is empty", () => { + expect(fromSiteRoot("/members/", "")).toBe("../"); + }); + + it("strips leading slashes from the target before appending", () => { + expect(fromSiteRoot("/", "/members/")).toBe("./members/"); + }); + + it("works from a deeply nested page", () => { + expect(fromSiteRoot("/gsoc/2025/sunpy/", "/members/")).toBe( + "../../../members/", + ); + }); +}); + +// --------------------------------------------------------------------------- +// localizeHref +// --------------------------------------------------------------------------- + +describe("localizeHref", () => { + it("returns fragment-only hrefs unchanged", () => { + expect(localizeHref("/page/", "#section")).toBe("#section"); + }); + + it("returns external https:// URLs unchanged", () => { + expect(localizeHref("/page/", "https://example.com")).toBe( + "https://example.com", + ); + }); + + it("returns protocol-relative //example.com URLs unchanged", () => { + expect(localizeHref("/page/", "//example.com")).toBe("//example.com"); + }); + + it("returns mailto: links unchanged", () => { + expect(localizeHref("/page/", "mailto:hi@example.com")).toBe( + "mailto:hi@example.com", + ); + }); + + it("converts absolute-path hrefs to relative", () => { + expect(localizeHref("/gsoc/2025/", "/members/")).toBe("../../members/"); + }); + + it("returns relative hrefs unchanged", () => { + expect(localizeHref("/page/", "other-page/")).toBe("other-page/"); + }); + + it("returns an empty string for an empty href", () => { + expect(localizeHref("/page/", "")).toBe(""); + }); +}); diff --git a/src/lib/gsoc.ts b/src/lib/gsoc.ts new file mode 100644 index 00000000..9e3446ee --- /dev/null +++ b/src/lib/gsoc.ts @@ -0,0 +1,240 @@ +/** + * Utility functions for building GSoC project data from Astro content modules. + * + * These helpers are extracted from the layout so they can be independently + * tested. All functions are pure (no side effects, no Astro-runtime imports). + */ + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +export type AstroComponentFactory = (...args: unknown[]) => unknown; + +export type ProjectModule = { + frontmatter?: Record; + Content: AstroComponentFactory; +}; + +export type MemberLink = { + label: string; + href: string | null; +}; + +export type DetailRow = { + label: string; + values: string[]; +}; + +export type GsocProject = { + name: string; + /** Slugified version of `name` used as an HTML anchor ID. */ + anchor: string; + /** Relative URL to the project's standalone page. */ + href: string; + desc: string; + requirements: string[]; + mentors: string[]; + collaborators: MemberLink[]; + issues: string[]; + /** Rows shown on the summary card (mentors + detail rows). */ + cardRows: DetailRow[]; + /** Rows shown in the expanded detail panel (no mentors row). */ + detailRows: DetailRow[]; + Content: AstroComponentFactory; +}; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** + * Coerces an unknown frontmatter value to a clean array of non-empty strings. + * + * Handles three cases commonly produced by YAML frontmatter: + * - An array of values (normal case) + * - A single scalar value (author wrote a string instead of a list) + * - A null/undefined/empty value (field was omitted) + * + * Placeholder strings like `"none"`, `"n/a"`, `"na"`, and `"null"` are + * filtered out — contributors sometimes use these in project templates. + * + * @param value - Raw frontmatter field value. + * @returns Array of trimmed, non-empty, non-placeholder strings. + */ +export const normalizeArray = (value: unknown): string[] => { + const values = Array.isArray(value) + ? value + : value !== null && value !== undefined && value !== "" + ? [value] + : []; + return values + .map((item) => String(item ?? "").trim()) + .filter((item) => { + const normalized = item.toLowerCase(); + if (!normalized) return false; + return !["none", "n/a", "na", "null"].includes(normalized); + }); +}; + +/** + * Converts a string to a lowercase kebab-case slug suitable for use as an + * HTML `id` attribute or URL path segment. + * + * @param value - Input string. + * @returns Slugified string (e.g. `"My Cool Project"` → `"my-cool-project"`). + */ +export const slugify = (value: string): string => + value + .toLowerCase() + .trim() + .replace(/[^a-z0-9]+/g, "-") + .replace(/(^-|-$)/g, ""); + +/** + * Resolves a `collaborating_projects` key from a project's frontmatter to a + * display label and optional href pointing to the member's entry on `/members/`. + * + * If the key is found in `memberLookup` the member's full name is used as the + * label and a relative URL to the members page anchor is returned. + * If the key is unknown the raw key string is shown without a link. + * + * @param key - The member key as written in the project's frontmatter. + * @param memberLookup - The full `members.json` object keyed by member slug. + * @param pagePath - The current page's URL pathname (used to generate relative URLs). + * @param fromSiteRoot - Helper that converts an absolute path to a relative one. + * @returns `{ label, href }` where `href` may be `null` for unknown members. + */ +export const formatMemberLink = ( + key: string, + memberLookup: Record, + pagePath: string, + fromSiteRoot: (pathname: string, targetPath: string) => string, +): MemberLink => { + const member = memberLookup[key]; + if (member?.name) { + return { + label: member.name, + href: fromSiteRoot( + pagePath, + `/members/#${encodeURIComponent(member.name)}`, + ), + }; + } + return { label: key, href: null }; +}; + +/** + * Filters a list of detail rows to only those with at least one value. + * Used to avoid rendering empty `
    ` sections in the project card/detail. + * + * @param rows - Array of label + values pairs. + * @returns Subset of `rows` where `values` is non-empty. + */ +export const joinableRows = (rows: DetailRow[]): DetailRow[] => + rows.filter((row) => row.values.length > 0); + +/** + * Returns true if a file path points to a GSoC project idea file for the + * given season year. + * + * Project files live at `gsoc///.md`. Files that should + * NOT be treated as projects are: + * - `index.md` (season landing page) + * - Files starting with `_` (e.g. `_project_template.md`) + * - Files at the season root (not inside a suborg subdirectory) + * + * @param normalizedPath - Forward-slash file path string. + * @param seasonKey - Four-digit year string (e.g. `"2025"`). + * @returns True if the path is a project file for the given season. + */ +export const isProjectFile = ( + normalizedPath: string, + seasonKey: string, +): boolean => { + const parts = normalizedPath.split("/"); + const gsocIndex = parts.lastIndexOf("gsoc"); + if (gsocIndex === -1) return false; + const year = parts[gsocIndex + 1]; + if (year !== seasonKey) return false; + // Must have at least: gsoc / year / suborg / file.md + if (parts.length < gsocIndex + 4) return false; + const filename = parts[parts.length - 1] ?? ""; + if (filename.startsWith("_") || filename === "index.md") return false; + return true; +}; + +/** + * Builds a structured {@link GsocProject} object from a raw Vite module path + * and its eagerly-loaded module. + * + * This is the main transformation step that converts raw frontmatter (which may + * be missing, malformed, or use placeholder values) into a clean, typed object + * ready for rendering. + * + * @param modulePath - Vite module path string for the project file. + * @param mod - Eagerly-loaded module containing `frontmatter` and `Content`. + * @param seasonKey - Four-digit year string (e.g. `"2025"`). + * @param memberLookup - Full `members.json` object keyed by member slug. + * @param pagePath - Current page pathname (used for relative URL generation). + * @param fromSiteRoot - Relative-URL helper. + * @returns A fully populated `GsocProject`. + */ +export const buildProject = ( + modulePath: string, + mod: ProjectModule, + seasonKey: string, + memberLookup: Record, + pagePath: string, + fromSiteRoot: (pathname: string, targetPath: string) => string, +): GsocProject => { + const data = mod.frontmatter ?? {}; + const normalizedPath = modulePath.replace(/\\/g, "/"); + const parts = normalizedPath.split("/"); + const gsocIndex = parts.lastIndexOf("gsoc"); + const year = parts[gsocIndex + 1] ?? seasonKey; + const suborg = parts[gsocIndex + 2] ?? ""; + const fileSlug = (parts[parts.length - 1] ?? "").replace(/\.md$/, ""); + + const name = + typeof data.name === "string" && data.name.trim() + ? data.name.trim() + : fileSlug; // fall back to filename if `name` is missing + + const projectPath = `/gsoc/${year}/${suborg}/${fileSlug}/`; + const desc = typeof data.desc === "string" ? data.desc : ""; + const requirements = normalizeArray(data.requirements); + const mentors = normalizeArray(data.mentors); + const initiatives = normalizeArray(data.initiatives); + const projectSize = normalizeArray(data.project_size); + const tags = normalizeArray(data.tags); + const collaborators = normalizeArray(data.collaborating_projects).map((key) => + formatMemberLink(key, memberLookup, pagePath, fromSiteRoot), + ); + const issues = normalizeArray(data.issues); + + const detailRows = joinableRows([ + { label: "Initiatives", values: initiatives }, + { label: "Project size", values: projectSize }, + { label: "Tags", values: tags }, + ]); + + const cardRows = joinableRows([ + { label: "Mentors", values: mentors }, + ...detailRows, + ]); + + return { + name, + anchor: slugify(name), + href: fromSiteRoot(pagePath, projectPath), + desc, + requirements, + mentors, + collaborators, + issues, + cardRows, + detailRows, + Content: mod.Content, + }; +}; diff --git a/src/lib/members.ts b/src/lib/members.ts new file mode 100644 index 00000000..4ab5058a --- /dev/null +++ b/src/lib/members.ts @@ -0,0 +1,150 @@ +/** + * Utility functions for building member card data from `members.json` entries. + * + * Extracted from `MemberCard.astro` so the data-transformation logic can be + * tested independently of the Astro component runtime. + */ + +import icons from "../data/icons.json"; + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +export type RepositoryLink = { + href: string; + label: string; + icon: string; + viewBox: string; + height: string | undefined; +}; + +export type SocialLink = { + href: string; + label: string; + icon: string; +}; + +// --------------------------------------------------------------------------- +// Known repository providers +// --------------------------------------------------------------------------- + +/** + * Map of known repository host keys (as used in `members.json`) to their URL + * builder and SVG icon configuration. + * + * The `height` field controls the SVG element's height attribute; `undefined` + * lets it default to its natural size. + */ +const repoProviders: Record< + string, + { + href: (repo: string) => string; + icon: string; + viewBox: string; + height: string | undefined; + } +> = { + github: { + href: (repo) => `https://github.com/${repo}`, + icon: icons.gh_logo, + viewBox: "0 0 16 16", + height: undefined, + }, + bitbucket: { + href: (repo) => `https://bitbucket.com/${repo}`, + icon: icons.bb_logo, + viewBox: "0 0 30 30", + height: "50%", + }, + sourceforge: { + href: (repo) => `https://sourceforge.net/projects/${repo}`, + icon: icons.sf_logo, + viewBox: "0 0 15 10", + height: "50%", + }, +}; + +// --------------------------------------------------------------------------- +// Public helpers +// --------------------------------------------------------------------------- + +/** + * Builds the list of repository links for a member card. + * + * For known providers (github, bitbucket, sourceforge) the href is constructed + * from the repo identifier. For unknown providers the raw value is used as the + * href and the github icon is used as a fallback. + * + * @param repositories - The `repositories` field from a `members.json` entry + * (e.g. `{ github: "astropy/astropy" }`). + * @param memberKey - The member's slug key, used as a fallback label for unknown providers. + * @returns Array of repository link descriptors. + */ +export const buildRepositoryLinks = ( + repositories: Record | undefined, + memberKey: string, +): RepositoryLink[] => { + if (!repositories) return []; + return Object.entries(repositories).map(([provider, repo]) => { + const known = repoProviders[provider]; + if (known) { + return { + href: known.href(repo), + label: repo, + icon: known.icon, + viewBox: known.viewBox, + height: known.height, + }; + } + // Unknown provider: use the raw value as a URL with the github icon as fallback + return { + href: repo, + label: memberKey, + icon: icons.gh_logo, + viewBox: "0 0 16 16", + height: undefined, + }; + }); +}; + +/** + * Builds the list of social/microblogging links for a member card. + * + * Supported platforms: `x` (formerly Twitter), `mastodon`. + * Unsupported platforms are silently ignored (returns nothing for that entry). + * + * For Mastodon the handle is expected in the format `@username@instance.social`. + * Malformed handles (missing the two `@` separators) are skipped. + * + * @param microblogging - The `microblogging` field from a `members.json` entry + * (e.g. `{ x: "astropy" }` or `{ mastodon: "@astropy@mastodon.social" }`). + * @returns Array of social link descriptors (only supported platforms included). + */ +export const buildSocialLinks = ( + microblogging: Record | undefined, +): SocialLink[] => { + if (!microblogging) return []; + return Object.entries(microblogging) + .map(([platform, handle]) => { + if (platform === "x") { + return { + href: `https://x.com/${handle}`, + label: `@${handle}`, + icon: icons.x_logo, + }; + } + if (platform === "mastodon") { + // Handle format: @username@instance.social — split on @ to get host + const [, username, host] = handle.split("@"); + if (!username || !host) return null; // malformed handle + return { + href: `https://${host}/@${username}`, + label: handle, + icon: icons.mastodon_logo, + }; + } + return null; + }) + .filter((link): link is SocialLink => link !== null); +}; diff --git a/src/lib/posts.js b/src/lib/posts.js index 52027d65..b12d3ad3 100644 --- a/src/lib/posts.js +++ b/src/lib/posts.js @@ -7,6 +7,16 @@ const ensureDate = (value) => { return new Date(value); }; +/** + * Derives the URL slug for a post from its content collection entry. + * + * Post filenames follow the convention `YYYY-MM-DD-my-title.md`. The date + * prefix is stripped so the slug becomes `my-title`. If the filename does not + * match the date-prefix pattern the full base filename is used as-is. + * + * @param {object} entry - Astro content collection entry (posts collection). + * @returns {string} URL-safe slug string. + */ export const getPostSlug = (entry) => { const id = entry?.id || entry?.slug || ""; const base = id.replace(/\.md$/, "").split("/").pop(); @@ -15,6 +25,19 @@ export const getPostSlug = (entry) => { return raw.replace(/\s+/g, "-").replace(/_/g, "-").toLowerCase(); }; +/** + * Extracts UTC year / month / day parts and the resolved Date from a post entry. + * + * Multiple frontmatter field names are tried in order (`date`, `pubDate`, + * `published`, `datetime`) so the helper stays compatible with different + * authoring conventions without requiring callers to know which field is set. + * + * UTC accessors are used intentionally to avoid timezone-dependent shifts when + * the site is built in different environments. + * + * @param {object} entry - Astro content collection entry (posts collection). + * @returns {{ year: string, month: string, day: string, date: Date }} + */ export const getPostDateParts = (entry) => { const date = ensureDate( entry?.data?.date ?? @@ -30,8 +53,63 @@ export const getPostDateParts = (entry) => { }; }; +/** + * Returns the canonical URL path for a post, e.g. `/2024/03/15/my-title/`. + * + * @param {object} entry - Astro content collection entry (posts collection). + * @returns {string} Absolute URL path with leading and trailing slashes. + */ export const getPostUrl = (entry) => { const { year, month, day } = getPostDateParts(entry); const slug = getPostSlug(entry); return `/${year}/${month}/${day}/${slug}/`; }; + +/** + * Extracts a plain-text excerpt from a post for use in news listing pages. + * + * If the post frontmatter contains a `summary` field it is returned as-is. + * Otherwise the first non-image paragraph of the post body is used, with + * Markdown syntax (links, inline code, emphasis, headings) stripped out. + * The result is truncated at the last word boundary before `maxLength`. + * + * @param {import('astro:content').CollectionEntry<'posts'>} post + * @param {number} [maxLength=280] - Maximum character length before truncation. + * @returns {string} + */ +export const getExcerpt = (post, maxLength = 280) => { + const customSummary = post?.data?.summary; + if (typeof customSummary === "string" && customSummary.trim()) { + return customSummary.trim(); + } + + const paragraphs = String(post.body ?? "") + .split(/\n\s*\n/) + .map((paragraph) => paragraph.trim()) + .filter(Boolean); + + // Skip image-only paragraphs (e.g. `![alt](url)`) so the excerpt starts + // with actual prose text. + const firstParagraph = + paragraphs.find((paragraph) => !paragraph.startsWith("![")) ?? + paragraphs[0] ?? + ""; + + const plainText = firstParagraph + .replace(/!\[[^\]]*\]\([^)]+\)/g, "") // strip images + .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") // strip links, keep label + .replace(/`([^`]+)`/g, "$1") // strip inline code ticks + .replace(/[*_>#]/g, "") // strip emphasis, heading markers + .replace(/\s+/g, " ") + .trim(); + + if (plainText.length <= maxLength) { + return plainText; + } + + // Truncate at a word boundary to avoid cutting mid-word. + return `${plainText + .slice(0, maxLength) + .replace(/\s+\S*$/, "") + .trim()}...`; +}; diff --git a/src/lib/relative-paths.js b/src/lib/relative-paths.js index a262218c..86a56dc7 100644 --- a/src/lib/relative-paths.js +++ b/src/lib/relative-paths.js @@ -1,17 +1,60 @@ +/** + * Utilities for generating relative URLs in the OpenAstronomy site. + * + * Astro is configured with `trailingSlash: "always"` and the site can be + * previewed at a non-root path (e.g. CircleCI build previews). Hardcoding + * absolute paths like `/members/` breaks those environments. These helpers + * convert site-root-relative paths to relative paths based on the current + * page's depth in the URL hierarchy. + */ + +/** Matches any URI scheme such as `https:`, `mailto:`, `data:`, etc. */ const PROTOCOL_RE = /^[a-zA-Z][a-zA-Z\d+\-.]*:/; +/** + * Returns the relative prefix needed to reach the site root from a given page. + * + * Examples: + * `/` → `./` + * `/members/` → `../` + * `/gsoc/2025/` → `../../` + * + * @param {string} [pathname="/"] - The current page's URL pathname. + * @returns {string} A relative path prefix ending with `/`. + */ export const getRelativeRoot = (pathname = "/") => { + // Strip query string and hash before counting path segments. const cleanPath = String(pathname).split("?")[0].split("#")[0]; const depth = cleanPath.split("/").filter(Boolean).length; return depth === 0 ? "./" : "../".repeat(depth); }; +/** + * Converts an absolute site-root path to a path relative to the current page. + * + * @param {string} pathname - The current page's URL pathname. + * @param {string} targetPath - Absolute path from the site root (leading `/` optional). + * @returns {string} A relative URL string. + */ export const fromSiteRoot = (pathname, targetPath) => { const relativeRoot = getRelativeRoot(pathname); const normalizedTarget = String(targetPath ?? "").replace(/^\/+/, ""); return normalizedTarget ? `${relativeRoot}${normalizedTarget}` : relativeRoot; }; +/** + * Resolves an href value for use in the current page context. + * + * - External URLs (with a scheme or `//` prefix) and fragment-only links (`#…`) + * are returned unchanged. + * - Absolute-path links (starting with `/`) are converted to relative paths via + * {@link fromSiteRoot} so they work regardless of deployment base path. + * - Relative hrefs are returned as-is. + * + * @param {string} pathname - The current page's URL pathname. + * @param {string} href - The raw href value to resolve. + * @returns {string} The resolved href. + */ export const localizeHref = (pathname, href) => { const value = String(href ?? ""); if (!value) return value; diff --git a/src/pages/[...slug].astro b/src/pages/[...slug].astro index 7b25810a..c7b72dc0 100644 --- a/src/pages/[...slug].astro +++ b/src/pages/[...slug].astro @@ -20,6 +20,12 @@ export const getStaticPaths = () => { eager: true, }); + /** + * Converts a Vite module path like `../content/pages/gsoc/index.md` to the + * route slug `gsoc` (i.e. the path segment after `/pages/`, without the + * `.md` extension or a trailing `/index`). + * Returns `null` for the site root (`pages/index.md`). + */ const toRouteSlug = (modulePath: string) => { const normalizedPath = modulePath.replace(/\\\\/g, "/"); const marker = "/pages/"; @@ -32,6 +38,11 @@ export const getStaticPaths = () => { return relativePath === "index" ? null : relativePath; }; + /** + * GSoC project idea files live under `gsoc///` and are + * aggregated by `ProjectsLayout` — they must not become individual routes + * here, otherwise Astro would generate a duplicate page for each project. + */ const isProjectContent = (routeSlug: string | null) => routeSlug === "gsoc/projects" || routeSlug?.startsWith("gsoc/projects/"); diff --git a/src/pages/news.astro b/src/pages/news.astro index 71be0231..9cad3c84 100644 --- a/src/pages/news.astro +++ b/src/pages/news.astro @@ -1,8 +1,7 @@ --- import PageLayout from "../layouts/PageLayout.astro"; import { getCollection } from "astro:content"; -import type { CollectionEntry } from "astro:content"; -import { getPostUrl, getPostDateParts } from "../lib/posts.js"; +import { getPostUrl, getPostDateParts, getExcerpt } from "../lib/posts.js"; import { localizeHref } from "../lib/relative-paths.js"; const posts = (await getCollection("posts")).sort( @@ -14,40 +13,6 @@ const dateFormatter = new Intl.DateTimeFormat("en-US", { day: "numeric", year: "numeric", }); - -const getExcerpt = (post: CollectionEntry<"posts">, maxLength = 280) => { - const customSummary = post?.data?.summary; - if (typeof customSummary === "string" && customSummary.trim()) { - return customSummary.trim(); - } - - const paragraphs = String(post.body ?? "") - .split(/\n\s*\n/) - .map((paragraph) => paragraph.trim()) - .filter(Boolean); - - const firstParagraph = - paragraphs.find((paragraph) => !paragraph.startsWith("![")) ?? - paragraphs[0] ?? - ""; - - const plainText = firstParagraph - .replace(/!\[[^\]]*\]\([^)]+\)/g, "") - .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") - .replace(/`([^`]+)`/g, "$1") - .replace(/[*_>#]/g, "") - .replace(/\s+/g, " ") - .trim(); - - if (plainText.length <= maxLength) { - return plainText; - } - - return `${plainText - .slice(0, maxLength) - .replace(/\s+\S*$/, "") - .trim()}...`; -}; --- From ec3c45777e8d632294d7fce8b9de31c9aee59e71 Mon Sep 17 00:00:00 2001 From: Nabil Freij Date: Wed, 8 Apr 2026 16:24:17 -0700 Subject: [PATCH 03/25] docs: add unit test instructions to README and CI Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/ci.yml | 2 ++ README.md | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 24753691..898e2c26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -49,6 +49,8 @@ jobs: run: npm run lint:md - name: Astro checks run: npm run astro:check + - name: Unit tests + run: npm test linkcheck: name: Link check (${{ matrix.mode }}) diff --git a/README.md b/README.md index a17eb3ee..063c793d 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,20 @@ Preview the production build npm run preview ``` +### Tests + +Run the unit test suite (Vitest): + +```shell +npm test +``` + +Watch mode (re-runs on file changes): + +```shell +npm run test:watch +``` + ### Formatting and linting Format the codebase From aedf7b8f64f97f3df91b148ff3ff384203ff2783 Mon Sep 17 00:00:00 2001 From: Nabil Freij Date: Wed, 8 Apr 2026 16:30:25 -0700 Subject: [PATCH 04/25] docs: define coding standards and fix audit gaps - Add CONTRIBUTING.md with rules for naming, function length, JSDoc coverage by file type, TypeScript vs JS guidance, and test structure - Update .github/copilot-instructions.md: remove stale 'no test suite' note, add npm test commands, add Code Standards summary section - Add component block comment to MemberCard.astro (was the only component missing one) - Add inline comments to pad2 and ensureDate helpers in posts.js - Add purpose comment to news.astro frontmatter Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/copilot-instructions.md | 15 ++++- CONTRIBUTING.md | 116 ++++++++++++++++++++++++++++++++ src/components/MemberCard.astro | 9 +++ src/lib/posts.js | 2 + src/pages/news.astro | 1 + 5 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 CONTRIBUTING.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 813ed8cf..7f279628 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -19,6 +19,10 @@ npm run astro:check # TypeScript/Astro type checking # Run all checks (lint + astro:check): npm run check +# Unit tests: +npm test # run all tests once +npm run test:watch # re-run on file change + # Link checks (requires a build first): npm run build && npm run linkcheck:internal npm run build && npm run linkcheck:external @@ -26,7 +30,16 @@ npm run build && npm run linkcheck:external **Important:** CI runs `format`, `lint:fix`, and `lint:md:fix` automatically, then **fails if those produce uncommitted changes**. Always run `npm run format && npm run lint:fix && npm run lint:md:fix` and commit the result before pushing. -There is no test suite — `npm run astro:check` is the primary type/content validation step. +## Code Standards + +See [`CONTRIBUTING.md`](../CONTRIBUTING.md) for the full standard. Key rules for code generation: + +- **Naming**: camelCase for functions/variables, PascalCase for types and Astro component files. +- **Function length**: ≤ 40 lines; extract named helpers if longer. +- **JSDoc**: required on every exported symbol in `src/lib/`; not required in test files. +- **Astro components**: block comment at top of frontmatter explaining purpose + non-obvious props. +- **TypeScript**: new `src/lib/` files must be `.ts`; never import Astro runtime packages inside `src/lib/` (breaks unit tests). +- **Tests**: one `describe` per exported function; cover happy path + edge cases + null/undefined inputs. ## Architecture diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..29744815 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,116 @@ +# Contributing to openastronomy.github.io + +This document captures the conventions used in this codebase. When adding or reviewing code, use these rules as the benchmark. + +--- + +## Code style + +### Naming + +| Context | Convention | Example | +|---|---|---| +| JavaScript/TypeScript variables and functions | camelCase | `getPostSlug`, `seasonKey` | +| TypeScript types and interfaces | PascalCase | `ProjectData`, `MemberLink` | +| Astro component files | PascalCase | `MemberCard.astro`, `ProjectCard.astro` | +| CSS class names | kebab-case | `project-card`, `member-logo` | +| Constants that are never reassigned | UPPER_SNAKE_CASE only when a regex or truly global constant | `PROTOCOL_RE` | + +### Function length + +- Aim for **≤ 40 lines** per function. +- If a function grows beyond that, look for a named helper to extract. +- Long functions in `scripts/` are acceptable when they represent a single sequential workflow (e.g., the link-check crawl loop). + +--- + +## Documentation + +### `src/lib/` (`.ts` and `.js` files) + +Every **exported** symbol must have a JSDoc block: + +```js +/** + * Strips the YYYY-MM-DD date prefix from a content collection entry ID. + * + * @param {import("astro:content").CollectionEntry<"posts">} entry + * @returns {string} The slug without the date prefix, e.g. "my-post-title" + */ +export function getPostSlug(entry) { … } +``` + +Internal helpers (not exported) should have at least a brief inline comment if their purpose is not immediately obvious from the name. + +### `src/components/` and `src/layouts/` (`.astro` files) + +Add a block comment at the top of the frontmatter section explaining: + +1. What the component renders +2. Any non-obvious prop relationships or assumptions + +```astro +--- +/* + * ProjectCard – renders a single GSoC project summary button. + * Clicking opens the matching ProjectDetail panel via the shared detailId. + * Must be paired with a in the same page. + */ +--- +``` + +Short, self-evident page components (e.g. a page with only a title and a list) are exempt if the frontmatter is trivially readable. + +### `scripts/` (`.mjs` files) + +Every top-level function must have a JSDoc block. The module itself should have a `@fileoverview` comment at the top. + +### Tests (`src/lib/__tests__/`) + +No JSDoc is required in test files — test descriptions serve as documentation. + +Add a brief inline comment when test setup is non-obvious (e.g. a mock helper or a tricky fixture). + +--- + +## TypeScript vs JavaScript + +- New files in `src/lib/` should be **TypeScript** (`.ts`). +- Existing `.js` files in `src/lib/` stay as-is unless being rewritten from scratch. +- Astro component frontmatter uses TypeScript types inline where needed; avoid importing from Astro runtime packages inside `src/lib/` files (keeps them unit-testable without Astro's runtime). + +--- + +## Tests + +- Use **Vitest** (`npm test`). +- Test files live in `src/lib/__tests__/` and mirror the lib filename (e.g. `gsoc.ts` → `gsoc.test.ts`). +- One `describe` block per exported function. +- Each `describe` should cover: + - The happy path + - At least one edge case or boundary value + - Null / undefined inputs where the function accepts optional parameters +- Astro components are not unit-tested; test the logic extracted into `src/lib/` instead. + +--- + +## Astro components + +- Keep frontmatter focused on **data fetching and transformation**. Move reusable logic into `src/lib/`. +- All internal links must use `fromSiteRoot(Astro.url.pathname, "/target/")` from `src/lib/relative-paths.js`. Hardcoded absolute paths (`/foo/`) break on preview deployments. +- Format with Prettier and lint with ESLint before committing (`npm run format && npm run lint:fix`). CI will reject uncommitted formatting changes. + +--- + +## CI + +GitHub Actions (`.github/workflows/ci.yml`) runs on every push and pull request: + +1. Prettier format check +2. ESLint +3. Markdownlint +4. Astro type/content checks (`astro:check`) +5. **Unit tests** (`npm test`) +6. Link checks (internal and external, after a production build) + +All steps must pass before merging. diff --git a/src/components/MemberCard.astro b/src/components/MemberCard.astro index b09a3bbd..bdd022d2 100644 --- a/src/components/MemberCard.astro +++ b/src/components/MemberCard.astro @@ -1,4 +1,13 @@ --- +/* + * MemberCard – renders a card for a single OpenAstronomy member organisation. + * + * Displays the member's logo, name, a link to their website, and lists of + * repository and social links built by src/lib/members.ts. + * + * Props: member (MemberDetails object from members.json) and memberKey + * (the JSON key, used to resolve repository provider icons and links). + */ import { Image } from "astro:assets"; import type { ImageMetadata } from "astro"; import icons from "../data/icons.json"; diff --git a/src/lib/posts.js b/src/lib/posts.js index b12d3ad3..895874eb 100644 --- a/src/lib/posts.js +++ b/src/lib/posts.js @@ -1,5 +1,7 @@ +/** Pads a number to 2 digits with a leading zero (e.g. 7 → "07"). */ const pad2 = (value) => String(value).padStart(2, "0"); +/** Coerces a value that may already be a Date or a date string into a Date. */ const ensureDate = (value) => { if (value instanceof Date) { return value; diff --git a/src/pages/news.astro b/src/pages/news.astro index 9cad3c84..970afadc 100644 --- a/src/pages/news.astro +++ b/src/pages/news.astro @@ -1,4 +1,5 @@ --- +// /news/ — lists all blog posts sorted by date, newest first. import PageLayout from "../layouts/PageLayout.astro"; import { getCollection } from "astro:content"; import { getPostUrl, getPostDateParts, getExcerpt } from "../lib/posts.js"; From 4984b41017dd8152fd231bca269db4dd2a8665ab Mon Sep 17 00:00:00 2001 From: Nabil Freij Date: Wed, 8 Apr 2026 16:39:37 -0700 Subject: [PATCH 05/25] docs: add block comments to all non-trivial Astro components Head.astro, Header.astro, and PostLayout.astro were missing the component-level block comment required by CONTRIBUTING.md for non-trivial components. All other components and layouts are either already documented or are trivially self-evident (exempt). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- src/components/Head.astro | 10 ++++++++++ src/components/Header.astro | 9 +++++++++ src/layouts/PostLayout.astro | 7 +++++++ 3 files changed, 26 insertions(+) diff --git a/src/components/Head.astro b/src/components/Head.astro index 6475d601..e0b87bf5 100644 --- a/src/components/Head.astro +++ b/src/components/Head.astro @@ -1,4 +1,14 @@ --- +/* + * Head – renders the element for every page. + * + * Builds canonical URL, Open Graph tags, favicon, and a CSS stylesheet link. + * Picks one of two background images at random via an inline script so the + * choice is made on the client without a layout shift. + * + * Props: pageTitle (overrides site default), description (overrides site default). + * Uses fromSiteRoot() for all asset hrefs so paths work on preview deployments. + */ import site from "../data/site.json"; import members from "../data/members.json"; import { fromSiteRoot } from "../lib/relative-paths.js"; diff --git a/src/components/Header.astro b/src/components/Header.astro index 07ca2341..ef6ef812 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,4 +1,13 @@ --- +/* + * Header – site-wide navigation bar. + * + * Merges page_links (internal, localised with localizeHref) and nav_links + * (external, used as-is) from site.json into a single nav list. + * + * Includes an inline