diff --git a/.buildinfo b/.buildinfo deleted file mode 100644 index a5a5889..0000000 --- a/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: e849ccc7e4bf7c651d4f9a84608b8d46 -tags: fbb0d17656682115ca4d033fb2f83ba1 diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..208114d --- /dev/null +++ b/.env.example @@ -0,0 +1,5 @@ +# GitHub Personal Access Token (optional) +# Get one at: https://github.com/settings/tokens +# Increases API rate limit from 60/hour to 5000/hour +# Usage: Create a .env file and add: GITHUB_TOKEN=your_token_here +GITHUB_TOKEN= diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..411332e --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,84 @@ +name: Deploy to GitHub Pages + +on: + # Trigger the workflow every time you push to the `main` branch + push: + branches: [ main ] + # Allows you to run this workflow manually from the Actions tab on GitHub. + workflow_dispatch: + +# Allow this job to clone the repo and create a page deployment +permissions: + contents: read + pages: write + id-token: write + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout your repository using git + uses: actions/checkout@v4 + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Determine base path + id: base_path + run: | + # If BASE_PATH secret is set, use it + # Otherwise, if repo name matches owner (username.github.io), use root + # Otherwise, use /repo-name + if [ -n "${{ secrets.BASE_PATH }}" ]; then + echo "base_path=${{ secrets.BASE_PATH }}" >> $GITHUB_OUTPUT + elif [ "${{ github.repository }}" == "${{ github.repository_owner }}/${{ github.repository_owner }}.github.io" ]; then + echo "base_path=" >> $GITHUB_OUTPUT + else + echo "base_path=/${{ github.event.repository.name }}" >> $GITHUB_OUTPUT + fi + + - name: Build Astro site + run: npm run build + env: + BASE_PATH: ${{ steps.base_path.outputs.base_path }} + GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }} + # If you have other environment variables, set them here + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Copy build-time JSON files to dist + run: | + # Copy JSON files from public/ to dist/ (they're written during build but after public/ is copied) + if [ -f "public/build-data-pr.json" ]; then + cp public/build-data-pr.json dist/build-data-pr.json + echo "✓ Copied build-data-pr.json to dist/" + fi + if [ -f "public/build-data-pypi.json" ]; then + cp public/build-data-pypi.json dist/build-data-pypi.json + echo "✓ Copied build-data-pypi.json to dist/" + fi + if [ -f "public/build-data-contributors.json" ]; then + cp public/build-data-contributors.json dist/build-data-contributors.json + echo "✓ Copied build-data-contributors.json to dist/" + fi + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./dist + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 04e7957..ced7468 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -Makefile -conf.py -searchindex.js -_static/searchtools.js +dist +node_modules +.env +.astro diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 0000000..b9405a1 --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,56 @@ +# GitHub Pages Deployment + +This repository is configured to automatically deploy to GitHub Pages at `https://ipython.github.io` (or `https://ipython.github.com` which still works). + +## Setup Instructions + +### 1. Enable GitHub Pages + +1. Go to your repository Settings → Pages + - Or visit: `https://github.com/ipython/[this-repo]/settings/pages` +2. Under "Source", select **"GitHub Actions"** (not "Deploy from a branch") +3. Save the settings + +### 2. Deploy + +The workflow will automatically run on every push to the `main` branch. You can also manually trigger it: + +1. Go to Actions tab +2. Select "Deploy to GitHub Pages" workflow +3. Click "Run workflow" → "Run workflow" + +## How It Works + +The deployment workflow: + +1. **Builds the site** from the `main` branch +2. **Uploads** the built files as an artifact +3. **Deploys** to GitHub Pages (which serves from the `gh-pages` branch automatically) +4. Makes the site available at `https://ipython.github.io/[repo-name]` or `https://ipython.github.com/[repo-name]` + +## Configuration + +The build uses these environment variables: +- `BASE_PATH`: Set to empty string for root domain deployment +- `GITHUB_REPOSITORY_OWNER`: Set to `ipython` for correct asset paths + +These are set automatically in the workflow. + +## Troubleshooting + +### "Permission denied" errors + +- Ensure GitHub Pages is enabled in repository settings +- Check that the workflow has the correct permissions (should be automatic) + +### Build succeeds but site doesn't update + +- Check the Actions logs for the deploy step +- Wait a few minutes for GitHub Pages to rebuild +- Verify the Pages source is set to "GitHub Actions" not a branch + +### Site not accessible + +- Check repository visibility (public repos work automatically) +- Verify the repository name matches the expected GitHub Pages URL pattern +- For organization repos, ensure Pages is enabled at the organization level if needed diff --git a/JupyterConsole_backup.svg b/JupyterConsole_backup.svg new file mode 100644 index 0000000..23386d1 --- /dev/null +++ b/JupyterConsole_backup.svg @@ -0,0 +1,569 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_sources/citing.txt b/_sources/citing.txt deleted file mode 100644 index a1c3a85..0000000 --- a/_sources/citing.txt +++ /dev/null @@ -1,30 +0,0 @@ -================ - Citing IPython -================ - -If IPython been significant to a project that leads to an academic publication, -please acknowledge that fact by citing the project. As of now, the canonical -academic reference for IPython is `this paper -`_, for which here are both -a BibTex and a plaintext reference you can use:: - - @Article{PER-GRA:2007, - Author = {P\'erez, Fernando and Granger, Brian E.}, - Title = {{IP}ython: a {S}ystem for {I}nteractive {S}cientific - {C}omputing}, - Journal = {{C}omput. {S}ci. {E}ng.}, - Volume = {9}, - Number = {3}, - Pages = {21-29}, - month = may, - year = 2007, - url = "http://ipython.org", - } - -or in plaintext: - - Fernando Pérez, Brian E. Granger, *IPython: A System for Interactive - Scientific Computing*, Computing in Science and Engineering, vol. 9, no. 3, - pp. 21-29, May/June 2007, doi:10.1109/MCSE.2007.53. URL: http://ipython.org - -Thank you! diff --git a/_sources/documentation.txt b/_sources/documentation.txt deleted file mode 100644 index 016f5c3..0000000 --- a/_sources/documentation.txt +++ /dev/null @@ -1,101 +0,0 @@ -============= -Documentation -============= - -IPython manual --------------- - -.. release - -* `Current Stable Version (0.13.2) `_ -* `Current Development Version (1.0) `_ - -`This introduction to some key features `_ -is a good place to start if you haven't used IPython before. - -The manuals for previous releases are here: - -* 0.13.1: `HTML `__. -* 0.12.1: `HTML `__. -* 0.11: `HTML `__ and `PDF `__. -* 0.10.2: `HTML `__ and `PDF `__. -* 0.9.1: `HTML `__ and `PDF `__. - -Other useful documentation --------------------------- - -* `Presentations `_ we've - given at various venues regarding IPython over the years. -* `Videos and screencasts `_. -* IPython `screenshots `_. -* An `article about IPython - `_, written by Fernando - Perez and Brian Granger, published in the `May/June 2007 issue - `_ of - the journal *Computing in Science and Engineering*. - -External documentation, related presentations and tutorials ------------------------------------------------------------ - -This is a collection of presentations, often by authors outside of the core -IPython team. Some are focused on aspects of IPython itself while others may be -about external projects that use IPython as a key component. If you have any -material that fits this description, please contact the IPython team and let us -know about it so we can post it here. - -* The `BCPy2000 project `_ - offers Python tools for Brain-Computer interface development, and it uses - IPython in a really neat way to enable interactive debugging of all the - components as they operate in real-time. `This talk - `_ presented at the 2008 NIPS - conference shows the system. -* `Jose Unpingco `_ made this really neat - `screencast `_ showing how - to couple IPython's parallel capabilities with the `Vision - `_ environment. Vision is an extremely - impressive visual programming environment developed by `Michel Sanner's - `_ team at the Scripps Institute in La Jolla, - CA. -* An `article - `__ - by Noah Gift on RedHat Magazine that covers using Python, and IPython, as a - better Bash. -* An `article - `__ by Noah - Gift at the IBM Developer Works site, on using the Net-SNMP library to - interactively explore and manage a network (the interactive part courtesy of - IPython, of course). -* A `post and video - `_ - about using IPython's GTK support to interactively control a `Pigment - `_ application. It also uses the - IPython demo class. -* A `set of slides `_ - introducing IPython and summarizing its features. A good introduction for the - newcomer, and even experienced users may find things there they didn't know - about. -* An `article `__ at Linux.com about - IPython, by Conrad Koziol. -* An `article `__ by - Jeremy Jones at ONLamp.com, introducing IPython to new users and giving a - tour of its features as a replacement for the default Python shell. -* The O'Reilly book `"Python for Unix and Linux System Administration" - `_ has a chapter (the first, and - largest one) on IPython. IPython is also used throughout the book to - illustrate other Python technologies. - -Other projects using IPython ----------------------------- - -`Here `_ you can -find a list of projects that use IPython in one form or another. If you use -IPython as part of a project, please do add your information to this page or -email `Fernando.Perez@Berkeley.edu `_ and -I'll be happy to add it. Also, if your project is of academic relevance, -please `provide a citation to IPython `_. - -.. footer:: - - These documents themselves are maintained as a `git repository - `_ on GitHub, using the `GitHub - project pages feature `_. diff --git a/_sources/donate.txt b/_sources/donate.txt deleted file mode 100644 index 891d483..0000000 --- a/_sources/donate.txt +++ /dev/null @@ -1,38 +0,0 @@ -============================= - Support IPython Development -============================= - -IPython will always be 100% open source software, free for all to use and -released under the liberal terms of the modified BSD license. But while the -whole team does its best to work efficiently, and we actively try to find -funding from multiple sources, the reality is that we have limited resources -and this fact hinders our development capabilities. - -If you have found IPython to be useful in your work, research or company, -please consider making a donation to the project commensurate with your -resources. Any amount helps! - -.. raw:: html - - - - -All donations will be used strictly to fund IPython development, by supporting -tasks such as developer sprints, better installers, improved documentation and -paying for hosting costs for services such as the `IPython Notebook Viewer -`_. - -Our donations are managed by the NumFOCUS_ foundation, which passes 100% of your -contribution to the IPython project. NumFOCUS is a 501(c)3 non-profit -foundation, so if you are subject to US Tax law, your contributions will be -tax-deductible. - - -.. _NumFOCUS: http://numfocus.org diff --git a/_sources/faq.txt b/_sources/faq.txt deleted file mode 100644 index dc6f0e3..0000000 --- a/_sources/faq.txt +++ /dev/null @@ -1,54 +0,0 @@ -=== -FAQ -=== - -If your question isn't answered below, check `the docs `_, then ask on the `user mailing list `_. - -.. contents:: - :local: - :backlinks: none - -Can IPython run under IronPython/PyPy/Jython/other Python interpreters? ------------------------------------------------------------------------ - -The terminal-based shell should run on any interpreter which complies with -the necessary version of Python. IPython 0.11 requires Python 2.6 -or above, and as of June 2011, IronPython and PyPy both support this. - -The most likely problems would come from Readline and from using the undocumented -sys._getframe() function. On Windows we ship our own `pyreadline `_, -which might also work under IronPython. PyPy ships its own readline module, -which should now work. - -If IPython does not work under a supported interpreter, please -`file a bug `_. - -IPython crashes under OS X when using the arrow keys ----------------------------------------------------- -Under some circumstances, using the arrow keys to navigate your input history can cause a complete crash of the Python interpreter. - -**Answer:** This is due to a bug in the readline library from the official builds. There are a few solutions you can take: - - 1. Use a different Python version from Apple's default (MacPython or Fink have been reported to work) - - 2. You can disable in your ipythonrc file the following lines by commenting them out:: - - readline_parse_and_bind "\e[A": history-search-backward - readline_parse_and_bind "\e[B": history-search-forward - -You will lose searching in your history with the arrow keys, but at least Python won't crash. - -Does IPython play well with Windows? ------------------------------------- - -Yes, it most definitely does! There are some things that should be noted: `see -the installation documentation `_. - -What is the best way to install IPython? ----------------------------------------- - -See `the installation documentation `_ for full details. - -The standard Python installation mechanisms (``setup.py``, ``pip`` or ``easy_install``) all work for installing IPython to use in a terminal. Windows users are best off installing `distribute `_, then running the .exe installer, to create start menu shortcuts. - -To use the notebook or the Qt console, it's easiest to install through a package manager, or download a Python distribution such as `Anaconda `_ or `EPD `_. Otherwise, you will need to install pyzmq, along with tornado for the notebook, and PyQt4/PySide and pygments for the Qt console. diff --git a/_sources/index.txt b/_sources/index.txt deleted file mode 100644 index 04fc735..0000000 --- a/_sources/index.txt +++ /dev/null @@ -1,238 +0,0 @@ -IPython provides a rich architecture for interactive computing with: - -- Powerful interactive shells (terminal and `Qt-based`_). -- A browser-based notebook_ with support for code, text, mathematical - expressions, inline plots and other rich media. -- Support for interactive data visualization and use of `GUI toolkits`_. -- Flexible, embeddable_ interpreters to load into your own projects. -- Easy to use, high performance tools for `parallel computing`_. - -.. image:: _static/ipy_0.13.png - :width: 400px - :alt: IPython clients - :target: _static/ipy_0.13.png - -While the focus of the project is Python, our architecture is designed in a -language-agnostic way to facilitate interactive computing in any language. An -interactive kernel speaks to clients such as the terminal or web notebook via a -well-specified protocol_, and all features of a kernel are available to all -clients. We ship the official IPython kernel, but kernels for other languages -are being currently developed, with prototypes in Ruby and JavaScript already -existing. Additionally, the IPython kernel supports multi-language -integration, letting you for example mix Python code with Cython_, R_, Octave_, -and scripting in `Bash, Perl or Ruby`_. - -.. _notebook: notebook.html - -.. _qt-based: http://ipython.org/ipython-doc/stable/interactive/qtconsole.html - -.. _gui toolkits: http://ipython.org/ipython-doc/stable/interactive/reference.html#gui-event-loop-support - -.. _embeddable: http://ipython.org/ipython-doc/stable/interactive/reference.html#embedding-ipython - -.. _protocol: http://ipython.org/ipython-doc/stable/development/messaging.html - -.. _parallel computing: http://ipython.org/ipython-doc/stable/parallel/parallel_intro.html - -.. _cython: http://nbviewer.ipython.org/url/github.com/ipython/ipython/raw/master/examples/notebooks/Cython%20Magics.ipynb - -.. _R: http://nbviewer.ipython.org/url/github.com/ipython/ipython/raw/master/examples/notebooks/R%20Magics.ipynb - -.. _Octave: http://nbviewer.ipython.org/url/github.com/ipython/ipython/raw/master/examples/notebooks/Octave%20Magic.ipynb - -.. _Bash, Perl or Ruby: http://nbviewer.ipython.org/url/github.com/ipython/ipython/raw/master/examples/notebooks/Script%20Magics.ipynb - -To get started with the IPython Notebook, see our `official example -collection`_. Our `notebook gallery`__ is an excellent way to see the many -things you can do with IPython while learning about a variety of topics, from -basic programming to advanced statistics or quantum mechanics. - -.. _official example collection: https://github.com/ipython/ipython/tree/master/examples/notebooks#a-collection-of-notebooks-for-using-ipython-effectively - -.. __: https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks - -To learn more about IPython, you can watch our :ref:`videos and screencasts -`, download our `talks and presentations `_, or read -our `extensive documentation `_. IPython is open source -(BSD license), and is used by a range of `other projects -`_; add your project to that -list if it uses IPython as a library, and please don't forget to :ref:`cite the -project `. - -IPython supports Python 2.6 to 2.7 and 3.2 or newer. Our older 0.10 series -supports Python 2.5, and can be used with Python 2.4. - -Announcements -============= - - -.. _100alpha: http://archive.ipython.org/testing/1.0.0/ - -- **IPython 1.0** We are getting ready to release IPython 1.0. - We have an alpha release `ready for testing <100alpha>`_, out on July 21, 2013, - and should have a release candidate around August 1. - The alpha has gone fairly smoothly, so assuming all goes well with the release candidate - IPython 1.0.0 should be released by around August 15, 2013. - -- **Book**: Cyrille Rossant has published the first IPython-focused book: - `Learning IPython for Interactive Computing and Data Visualization - `_, - for which `Matthias Bussonnier `_ was a technical - reviewer. We thank Packt Publishing for donating a portion of the proceeds - from this book to support IPython's development. - -- **FSF Award**: Fernando Perez was awarded the `2012 Award for the Advancement - of Free Software - `__ for - the creation of IPython and his work in the Scientific Python community. - `More - details `_. - -- **IPython tutorial at PyCon 2013**: Fernando Perez, Brian Granger and Min - Ragan-Kelley presented `in-depth tutorial about IPython - `_. - It covers IPython's architecture and hands-on examples on customization, - embedding, effective uses of the various applications, the architecture of - the web notebook and how to use IPython for parallel and distributed - computing. - -- **Roadmap to 1.0 and beyond**: IPython 1.0 is coming mid-July 2013. See the - grant_ which is funding the bulk of the work, as well as our roadmap_ for - achieving the grant's objectives. - `Read on for more details `_. - -- **Sloan Foundation grant**: IPython has been awarded a $1.15 million grant - from the `Alfred P. Sloan Foundation`_. This will - support several core developers, allowing them to focus on building the - IPython Notebook into a tool for open, collaborative, reproducible scientific - computing. We'll also be bringing developers together for two sprints each - year in California. `See more details. `_ - -`More news... `_ - -.. raw:: html - -

John Hunter (1968-2012)

- - - - - - - -
- - -

- On August 28 2012 at 10am, John D. Hunter, creator of matplotlib - and IPython contributor, died from complications - arising from cancer treatment, after a brief but intense battle with - this terrible illness. John is survived by his wife Miriam, his - three daughters Rahel, Ava and Clara, his sisters Layne and Mary, - and his mother Sarah.

- -

- If you have benefited from John's many contributions, please say - thanks in the way that would matter most to him: by making a donation to - the John Hunter Memorial - Fund.

-
- - -.. _citing: - -Citing IPython -============== - -Several of the authors of IPython are connected with academic and scientific -research, so it is important for us to be able to show the impact of our work -in other projects and fields. - -If IPython contributes to a project that leads to a scientific publication, -please acknowledge this fact by citing the project. You can use this -`ready-made citation entry `_. - - -Support -======= - -We gratefully acknowledge the support we've received over the years from the -following sources: - -- In December 2012, IPython was awarded a `$1.15 million grant - `_ from the `Alfred P. Sloan Foundation`_ that will fund - the core team for the 2012-2013 period. - -- Since 2011, we have had support from the US DoD High Performance Computing - Modernization Program (HPCMP_), which funds several IPython developers in - collaboration with the US Army Engineer Research and Development Center - (ERDC_) that provides computing resources and support from the staff. - -- `Enthought Inc`_ has supported IPython since its beginning in multiple forms, - including --but not limited to-- the funding of our Qt console, hosting our - website for many years, the continued hosting of our mailing lists, and the - inclusion of IPython in the `Enthought Python Distribution`_. - -- NiPy_/NIH: funding via the NiPy project (NIH grant 5R01MH081909-02) supported - our 2009 refactoring work. - -- Sage_/NSF: funding via the grant `Sage: Unifying Mathematical Software for - Scientists, Engineers, and Mathematicians - `_ (NSF grant - DMS-1015114) supported our Seattle 2011 developer meeting. - -- Microsoft's team working on `Python Tools for Visual Studio - `_ developed the integraton of IPython into the - Python plugin for Visual Studio 2010. - -- `Tech-X Corporation `__ supported in 2008 the development - of our parallel computing tools. - -- Google Summer of Code: in 2005 and 2010 we've had GSoC support for prototypes - in several areas of the project. - -- The Ohio Supercomputer Center and the Department of Defense High Performance - Computing Modernization Program (HPCMP), for sponsoring work in 2009 on our - parallel computing tools. - -- `Bivio Software `_ hosted an IPython sprint in 2006, in - addition to their support of the Front Range Pythoneers group in Boulder, CO. - -- `GitHub `_ hosts our development workflow and - documentation. - -- `ShiningPanda `_ gives us a free `continuous - integration service `_. - -.. _Alfred P. Sloan Foundation: http://www.sloan.org -.. _HPCMP: http://www.hpcmo.hpc.mil -.. _ERDC: http://www.erdc.usace.army.mil -.. _Enthought inc: http://enthought.com -.. _Enthought Python Distribution: http://www.enthought.com/products/epd.php -.. _nipy: http://nipy.org -.. _sage: http://sagemath.org -.. _grant: http://ipython.org/sloan-grant.html -.. _roadmap: https://github.com/ipython/ipython/wiki/Roadmap:-IPython - - -.. toctree:: - :hidden: - - citing - documentation - faq - install - notebook - news - presentation - pyreadline - showmedo - usersurvey2011 - videos - whatsnew082 - whatsnew083 - searchresults - sloan-grant - roadmap-announcement - donate diff --git a/_sources/install.txt b/_sources/install.txt deleted file mode 100644 index 4ef82ec..0000000 --- a/_sources/install.txt +++ /dev/null @@ -1,83 +0,0 @@ -~~~~~~~~~~~~~~~~~~ -Installing IPython -~~~~~~~~~~~~~~~~~~ - -There are multiple ways of installing IPython, and our official documentation -contains `detailed instructions -`_ for manual -installs from source, targeted at advanced users and developers. - -For new users who want to get up and running with minimal effort, we suggest -you follow the instructions on this page, which provide a setup based on Python -2.7. This includes all the dependencies to run the notebook and optionally the -basic libraries for scientific computing and data analysis. - -**Mac or Windows** - -1. Download and install `Anaconda `_ or the free edition of the `Enthought Python Distribution -(EPD) `_. - -2. Update IPython to the current version: - -* On a Mac, using the Terminal application:: - - Anaconda:: - - conda update conda - conda update ipython - - EPD:: - - sudo enpkg enstaller - sudo enpkg ipython - -* On Windows, at the Command Prompt (``cmd.exe`` application):: - - Anaconda:: - - conda update conda - conda update ipython - - EPD:: - - enpkg enstaller - enpkg ipython - -**Linux** - -On Linux, most distributions have everything you need in their package -managers. - -1. Install IPython and its dependencies: - -* On Ubuntu or other Debian-based distributions, type at the shell:: - - sudo apt-get install ipython-notebook - -* On Fedora 18 and newer related distributions, use:: - - sudo yum install python-ipython-notebook - -2. Optionally install additional tools for scientific computing: - -* On Ubuntu or other Debian-based distributions, type at the shell:: - - sudo apt-get install python-matplotlib python-scipy \ - python-pandas python-sympy python-nose - -* On Fedora 18 and newer related distributions, use:: - - sudo yum install python-matplotlib scipy python-pandas sympy python-nose - - -Downloads ---------- - -You can manually download IPython from either `Github -`_ or `PyPI -`_. Those locations contain source -distributions as well as binary Windows installers, which will be recognized by -``easy_install`` and ``pip`` (for the source ones). - -Our `downloads archive `_ also contains all -IPython releases, including old versions. diff --git a/_sources/news.txt b/_sources/news.txt deleted file mode 100644 index d5d14b9..0000000 --- a/_sources/news.txt +++ /dev/null @@ -1,360 +0,0 @@ -==== -News -==== - -The first IPython book ----------------------- - -On April 25 2013, Cyrille Rossant published the first IPython-focused book: -`Learning IPython for Interactive Computing and Data Visualization -`_, -for which `Matthias Bussonnier `_ was a technical -reviewer. We thank Packt Publishing for donating a portion of the proceeds from -this book to support IPython's development. - -FSF Award ---------- - -On March 23 2013, Fernando Perez was awarded the `2012 Award for the -Advancement of Free Software -`__ for -the creation of IPython and his work in the Scientific Python community. More -details are available in `this profile -`_ -from UC Berkeley. - -PyCon 2013 Tutorial -------------------- - -Fernando Perez, Brian Granger and Min Ragan-Kelley presented `in-depth tutorial -about IPython -`_. It covers IPython's architecture and hands-on examples on customization, -embedding, effective uses of the various applications, the architecture of the -web notebook and how to use IPython for parallel and distributed computing. - -IPython 0.13.2 --------------- - -IPython 0.13.2 was released on April 5, 2013. This is a bugfix-only release. -`Download `__ it now, or see the `release notes -`__ for more -details. This will probably be the last release before 1.0. - -Roadmap to 1.0 and Beyond -------------------------- - -IPython 1.0 is coming mid-July 2013. See the grant_ which is funding the bulk -of the work, as well as our roadmap_ for achieving the grant's objectives. -`Read on for more details `_. - -.. _grant: http://ipython.org/sloan-grant.html -.. _roadmap: https://github.com/ipython/ipython/wiki/Roadmap:-IPython - -Sloan Foundation Grant ----------------------- - -IPython has been awarded a $1.15 million grant from `the Alfred P. Sloan -Foundation `_. This will support several core developers, -who'll focus on building the IPython Notebook into a tool for open, collaborative, -reproducible scientific computing. We'll also be bringing developers together -for two sprints each year in California. `See more details. `_ - -IPython 0.13 ------------- -IPython 0.13 was released on June 30, 2012. This release sees a substantial -redesign of the IPython Notebook, the introduction of 'cell magic functions', -as well as numerous other improvements. `Download `__ it now, or -see the `release notes -`__ for more -details. - -IPython 0.12.1 --------------- - -IPython 0.12.1 was released on April 21, 2012. This is a bugfix-only release; -no new features have been introduced but `over 70 issues`_ have been fixed. -All users of IPython 0.12 are encouraged to upgrade to this release. - -.. _over 70 issues: http://ipython.org/ipython-doc/stable/whatsnew/github-stats-0.12.html#issues-list-012 - - -IPython 0.12 ------------- - -IPython 0.12 was released on 18 December 2011. The major new feature with this -release is the `IPython Notebook `_, -an interactive Python interface running in the browser. `Download `_ -it now, or read more about `what's new -`_. - -.. image:: _static/ipy_0.12.png - -Try IPython online ------------------- - -As of Autumn 2011, you can `try IPython online -`__ in your browser. New users can -explore the features before installing it, or you can do some quick -calculations from any computer with web access. - -Thanks to the guys at `PythonAnywhere `__ for -providing this. If you sign up for an account there (it's in beta at the moment), -you also get persistent consoles, disk space, and more. - -IPython 0.11 ------------- - -We're pleased to announce the immediate release of IPython 0.11, on 31 July 2011. -Despite the small shift in the version number, this brings a lot of changes, -including a new Qt frontend and a rewritten parallel computing framework. -`Download `__ it now, or look at `what's new -`__. - -.. image:: _static/ipy_0.11.png - -User survey ------------ - -From May to September 2011, we ran a survey to find out more about who uses -IPython, amassing 240 responses by the time we closed it. We'd like to thank all -the respondents, and invite you to `read the findings `__. - -IPython 0.10.2 released ------------------------ - -IPython 0.10.2 was released on 9 April, 2011. This is a bugfix release for the -0.10 series. See the `release notes -`__ -for more details. - -Python 3 support in progress ----------------------------- - -Work has started to get IPython running on Python 3. If you're interested in -testing it, get `the code `__ from -GitHub. We hope to release this along with IPython 0.11. - -IPython 0.10.1 is out! ----------------------- - -On October 11, 2010, we released IPython 0.10.1. The full release notes can be -found `here -`__ -, -describing in detail the changes in this release. - -Windows HPC Server Case Study ------------------------------ - -As a result of the Microsoft-funded work on providing support for Windows HPC -Server 2008, a `case study -`__ is now available that provides some details on the collaboration -between IPython and the University of Colorado's Mechanical Engineering -Department. - -Support for Windows HPC Server 2008 ------------------------------------ - -.. image:: logos/logo-hpc2008-header.png - - -Recently, we have added support for Windows HPC Server 2008 in ipcluster. This -makes it easy to get started with IPython's parallel computing capabilities on -Windows. These features are now in trunk and will be in the upcoming 0.11 -release. Brian Granger has created a `whitepaper -`__ and `two -`__ -`videos -`__ -about using IPython on Windows HPC Server 2008. Additional information about -these features can be found in our documentation `here -`__. -Many thanks to Microsoft for funding this effort. - -What will become IPython 0.11 is taking shape, big changes ahead ----------------------------------------------------------------- - -As of November 2009, we have major changes coming to IPython. The next release -will include a lot of architectural updates, all of which we know are necessary -to really make significant improvements to IPython, but that also include -inevitable backward compatibility breaks. We would like to encourage you to -start looking at the `nightly documentation -`__ and -`source tarball -`__ (you can also -follow the trunk from `Launchpad `__). - -IPython 0.10 has been released ------------------------------- - -On August 4 2009, we've released version 0.10 of IPython. The full release -notes can be found `here -`__, -describing in detail all new features, bug fixes and API changes of this -release. - -IPython 0.9.1 has been released -------------------------------- - -Unfortunately, release 0.9 turned out to have compatibility issues with Python -2.4. This quick bugfix release addresses this issue but adds no other -features. - -IPython 0.9 is out! -------------------- - -On September 14, 2008, the IPython team is proud to release version 0.9 final. -See `here `__ for -the full announcement; a detailed description of the changes can be found `here -`__. - -IPython 0.9 betas are ready ---------------------------- - -At `the usual location `__ you can now -find the beta release of the 0.9 upcoming release. We'd greatly appreciate -your testing and feedback! - -IPython1 is dead, long live IPython (Summer 2008) -------------------------------------------------- - -For the past three years, IPython1 has existed as a separate codebase from -IPython. IPython1 was being used to develop IPython's architecture for -parallel computing as well as test new ideas for IPython itself. Because the -parallel computing stuff is relatively stable now, we have completely merged -IPython1 into IPython. Thus starting with IPython version 0.9, the parallel -computing capabilities (as well as a lot more new stuff) of IPython1 will be -available in regular IPython. From here on out, there is no IPython1, just -IPython. - -IPython 0.8.4 -------------- -IPython 0.8.4 was released. - -IPython 0.8.3 -------------- -IPython 0.8.3 was released. See `what's new `__. - -IPython1 and the Scripps Institute's Vision -------------------------------------------- - -`Jose Unpingco `__ made this really neat -`screencast `__ showing how to -couple IPython1 with the `Vision `__ environment. -Vision is an extremely impressive visual programming environment developed by -`Michel Sanner's `__ team at the Scripps -Institute in La Jolla, CA. - -IPython and Django ------------------- - -A `blog entry -`__ by -Peter Sheats describing how to use IPython as the interactive shell for Django. - -A new article about IPython at IBM Developer Works (Dec 12, 2007) ------------------------------------------------------------------ - -Noah Gift wrote a great `article -`__ at the IBM -Developer Works site, on using the Net-SNMP library to interactively explore -and manage a network (the interactive part courtesy of IPython, of course). - -IPython 0.8.2 is released (Nov 30, 2007) ----------------------------------------- - -Version 0.8.2 is out. See `a summary of the changes `__ , or -read the gory details in the full `ChangeLog -`__. - -First release of IpyKit (May 24, 2007) --------------------------------------- - -`IpyKit `__ is a standalone IPython executable, -created with py2exe and as such works on machines without python (or where you -just don't have time to mess with installation). It includes pyreadline for -full tab completion and color support. Get the first release (fully functional, -based on svn IPython) `here -`__. Just unzip and run ipython.exe -to go. - -Backports for 0.8.1 (may 23, 2007) ----------------------------------- - -We will backport some critical bug fixes to 0.8.1, if necessary - even if we -may not cut an official release, you can trust that the quality of the latest -version in 0.8.1 branch is at least as good as the 0.8.1 release. Get it with -svn by doing `svn co -`__. See the -`changelog -`__ -for the list of applied fixes. - -IPython 0.8.1 is released (May 10, 2007) ----------------------------------------- - -Version 0.8.1 is out. See WhatsNew for a summary of changes, or read the gory -details in the full `ChangeLog `__. - -Windows users can now safely upgrade, as long as they also use a current -release of `PyReadline `__] from the `download page -`__. - -Article about IPython in CiSE (May 2007) ----------------------------------------- - -The `issue `__ of the journal ''Computing in Science and Engineering'' was -entirely devoted to Python in scientific computing. One of the `IPython -`__. - -IPython1 0.9alpha1 (Saw) is released (April 24, 2007) ------------------------------------------------------ - -The first alpha of the new version of IPython1, called Saw, is now out. Please -see the release notes, and this page for more details. - -Coding Sprint in Boulder (Coming April 28, 2007) ------------------------------------------------- - -On April 28, we'll hold a coding sprint to push the saw branch and the -integration of the trunk into it. Details `here -`__. - -IPython 0.8.0 is released (April 10, 2007) ------------------------------------------- - -Version 0.8.0 is out. See WhatsNew for a summary of changes, or read the gory -details in the full `ChangeLog `__. - -'''WARNING''' for Windows users: IPython 0.8.0 does '''NOT''' work correctly -with `PyReadline `__ 1.3 , Use `PyReadLine 1.4 -`__ instead. - -IPython 0.7.3 is released (December 19, 2006) ---------------------------------------------- - -We are pleased to announce the release of IPython 0.7.3. The release has many -improvements and new features. - -IPython 0.7.3 can be downloaded `here `__. - -See our Trac wiki for `release notes -`__. - -New IPython Wiki (September 27, 2006) -------------------------------------- - -IPython has a new moin based wiki site. This site will eventually replace the -old plain html IPython web site. Please feel free to explore and contribute to -this new site. - -IPython 0.7.2 is released (June 6, 2006) ----------------------------------------- - -We are pleased to announce the release of IPython 0.7.2. The release has many -improvements and new features. - -IPython 0.7.2 can be downloaded `here `__ . diff --git a/_sources/notebook.txt b/_sources/notebook.txt deleted file mode 100644 index d49397c..0000000 --- a/_sources/notebook.txt +++ /dev/null @@ -1,45 +0,0 @@ -.. _notebook: - -====================== - The IPython Notebook -====================== - -The IPython Notebook is a web-based interactive computational environment where -you can combine code execution, text, mathematics, plots and rich media into a -single document: - -.. image:: _static/sloangrant/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png - :width: 350px - :alt: The IPython notebook with embedded text, code, math and figures. - :target: _static/sloangrant/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png - - -These notebooks are normal files that can be shared with colleagues, converted -to other formats such as HTML or PDF, etc. You can share any publicly -available notebook by using the `IPython Notebook Viewer -`_ service which will render it as a static web -page. This makes it easy to give your colleagues a document they can read -immediately without having to install anything. - -To learn more about using the IPython Notebook, you can visit our `example -collection`_, and you can read the documentation_ for all the details on how to -use and configure the system. The `Notebook Gallery`_ showcases many -interesting notebooks covering a variety of topics, from basic programming to -advanced scientific computing. - - -Here is a short demo of the notebook's basic features by the Pybonacci_ team: - -.. raw:: html - -

- -.. _Pybonacci: http://pybonacci.wordpress.com. - -.. _example collection: https://github.com/ipython/ipython/tree/master/examples/notebooks#a-collection-of-notebooks-for-using-ipython-effectively - -.. _documentation: http://ipython.org/ipython-doc/stable/interactive/htmlnotebook.html - -.. _notebook gallery: https://github.com/ipython/ipython/wiki/A-gallery-of-interesting-IPython-Notebooks diff --git a/_sources/presentation.txt b/_sources/presentation.txt deleted file mode 100644 index 97c2a6f..0000000 --- a/_sources/presentation.txt +++ /dev/null @@ -1,152 +0,0 @@ -~~~~~~~~~~~~~~~~~~~~~~~~~~ - Presentations on IPython -~~~~~~~~~~~~~~~~~~~~~~~~~~ - - -We have given a number of talks and presentations about IPython: - ------- - 2012 ------- - -* Fernando's talk *IPython: Python at your fingertips* is available in `PDF - `_ and PyVideos.org also - posted the `full video `_. - -* From our `IPython in-depth PyCon 2012 tutorial`__, we have PDF slides both - for the `introduction - `_ and - for the `notebook - `_. - The full 3+ hour tutorial video is also `available on YouTube - `_. Note that *all* PyCon 2012 - videos are online at the incredible `PyVideo.org site`_. - -.. __: https://us.pycon.org/2012/schedule/presentation/121/ -.. _pyvideo.org site: http://pyvideo.org/category/17/pycon-us-2012 - --------- - 2011 --------- - -* `Slides `__ - from a talk about IPython for the Sheffield Python user group. -* `Slides `__ and `video - `__ - of a presentation about the new features in IPython 0.11 at the Scipy 2011 - conference. -* A `tutorial `__ on using IPython - for parallel computing with our new ZeroMQ infrastructure. - ----------- - 2010 ----------- - -* `Slides `__ - from a talk that Fernando Perez presented at the `SciPy India 2010 conference - `__. -* Brian Granger has written a `whitepaper - `__ - describing the new support that ipcluster has for Windows HPC Server 2008. If - you use IPython's parallel computing architecture on Windows, this provides a - very nice way of starting the controller and engines on a cluster. The - whitepaper shows how to get started with IPython and Windows HPC Server 200 - as well two examples of using IPython to perform an interactive parallel - computation. This material is also in our documentation `here - `__ and - `here - `__. - Many thanks to Microsoft for funding Brian Granger to work on this. - --------- - 2009 --------- - -* At `SciPy '09 `__, we had a `lightning talk - `__ on the state of IPython. -* At the `IAM CSE09 conference `__ we gave - two presentations about IPython: a `general one - `__ - and another focused on `parallel and distributed computing - `__. - If you are interested, the slides from all the presentations at this meeting - `are available - `__. - ---------- - 2008 ---------- - -* A `talk `__ at - `23andMe `__ where I spoke about ipython in general, with - some details about its facilities for distributed computing. - ---------- - 2007 ---------- - -* `Slides `__ - from Dave Hudak, from the Ohio Supercomputing Center, about a ''proposed'' - system using IPython for high-level, fully managed access to supercomputing - resources (this system hasn't been implemented yet as of Sept 2008). -* An `article about IPython - `__, - written by Fernando Perez and Brian Granger, published in the `May/June 2007 - issue `__ of the - journal ''Computing in Science and Engineering''. -* A `set of slides `__ by - Bill Spotz, from Sandia National Labs, on using IPython to interactively use - the `Trilinos `__ parallel solvers. -* Two `talks `__ about IPython at - `PyCon2007 `__ (see the demos and movies - as well). -* A `talk - `__ - at an `Interactive Parallel Computation in Support of Research in Algebra, - Geometry and Number Theory `__. - ---------- - 2006 ---------- - -* `Slides - `__ - of a talk entitled "Interactive Parallel Computing with Python and IPython," - at CU Boulder. -* A `poster - `__ - at the `DANSE kickoff meeting - `__. -* A `lightening talk - `__ - at `SciPy'06 `__ about the Parallel Computing - capabilities of IPython. -* `Slides `__ and `MP3 audio - `__ of a talk at - `SAGE Days 2006 `__. -* A `poster - `__ - presented at `SIAM's Parallel Processing '06 conference - `__. - ---------- - 2005 ---------- - -* Two talks at SciPy'05: one about `parallel computing - `__ - and one about `interactive notebooks - `__. - ------------ - 2004 ------------ - -* A `talk `__ at SciPy'04. - -------- - 2003 -------- - -* An `overview of IPython `__ at SciPy'03. diff --git a/_sources/pyreadline.txt b/_sources/pyreadline.txt deleted file mode 100644 index 8169be2..0000000 --- a/_sources/pyreadline.txt +++ /dev/null @@ -1,40 +0,0 @@ -============== -**PyReadline** -============== - -PyReadline: a ctypes-based readline for Windows ------------------------------------------------ -pyreadline is based on UNC readline by Gary Bishop and its development is now -led by Jörgen Stenarson. The following new features have been added over the -original UNC readline: - - * Support for international characters (if you have the correct codepage active) - * Copy and paste using the clipboard - * Smart paste for convenient use with ipython. Converting tab separated data - to python list or numpy array. Converting file paths to use / and escaping - any spaces using \ . - * Pasting of multiline code removing empty lines - * System bell is disabled by default, can be activated in config file. - -Note: UNC readline is not being developed further by Gary, and PyReadline can -be considered the continuation of that project. This was done in full agreement -with Gary, given his current development priorities. - -Installation ------------- - -You can install PyReadline from `PyPI `_, -where you can find binary installers and source downloads. - - -Mailing list ------------- -Questions and bug reports can be directed to the `ipython-user `_ mailing list. - -Status and development ----------------------- -The current stable release is 1.7. - -Development is hosted at `github -`_. The `issue tracker -`_ is hosted there as well. diff --git a/_sources/roadmap-announcement.txt b/_sources/roadmap-announcement.txt deleted file mode 100644 index ade2a8f..0000000 --- a/_sources/roadmap-announcement.txt +++ /dev/null @@ -1,69 +0,0 @@ -Roadmap to 1.0 and Beyond -------------------------- - -TL;DR summary: Hi! IPython 1.0 coming mid-August 2013. See the grant_ which is -funding the bulk of the work, as well as our roadmap_ for achieving the -grant's objectives. - -There's been a lot of excitement on about the grant the IPython team received -from the Sloan Foundation. The easiest way to communicate the contents of the -Sloan grant is to just provide it in its entirety, which is what we've done -with direct links for `html`_ and `pdf`_ version. - -The interested reader will find a description of changes coming to IPython -over the next two years, as well as the motivation behind them, and the -personnel involved. (For example, the astute reader of the grant will -correctly infer that this email is one way in which I am filling my -responsibility as "community engagement and evangelism"... GO TEAM!) - -Two weeks ago, the bulk of IPython's core contributors had a series of -planning sessions. For three days, `Brian`_, `Fernando`_, `Min`_, and -`I`_ met on campus in Berkeley, with `Thomas`_ and `Matthias`_ -joining in via video teleconference (and `Brad`_, for one of the days, too). - -.. _Brian: https://github.com/ellisonbg -.. _Fernando: https://github.com/fperez -.. _Min: https://github.com/minrk -.. _I: https://github.com/ivanov -.. _Thomas: https://github.com/takluyver -.. _Matthias: https://github.com/Carreau -.. _Brad: https://github.com/bfroehle - -You can see the `full notes from those meetings`_. - -.. _full notes from those meetings: https://github.com/ipython/ipython/wiki/Dev:-Meeting-notes,-February-6,-2013 - -Our primary objective was to outline a plan of what work we want to accomplish -in the next two years (broadly speaking) as well as to make concrete goals for -our next (1.0!) release, which will land around mid-August 2013. - -It's kind of funny that there's a message from Fernando to [ipython-user] back -in April of 2005 titled `"Towards IPython 1.0, the famous big cleanup"`_. In -it, Fernando makes a last call for outstanding critical bugs because he's -preparing users for a transition toward big changes in the IPython code base. -Because, once he makes the first commit and starts working on the cleanup, -he'll have to ignore every request made "until the new shiny ipython emerges -from the process, reborn in a glory which shall blind the world." Toward the -end of the email, he finishes with: "I hope the changes will be worth it, and -when the dust settles, we'll have something we can call IPython 1.0"... And -eight years and a few months after that email was sent, we will! :) - -What will 1.0 look like? Biggest changes on the user side will be the -integration of `nbconvert`_ into IPython proper. But that's just my summary -of it, the interested reader is encouraged to read the gory details in the -roadmap_. - - -that's it from me for now, - -best, - -Paul Ivanov - -.. _grant: http://ipython.org/sloan-grant.html -.. _html: http://ipython.org/_static/sloangrant/sloan-grant.html -.. _pdf: http://ipython.org/_static/sloangrant/sloan-grant.pdf -.. _roadmap: https://github.com/ipython/ipython/wiki/Roadmap:-IPython -.. _"Towards IPython 1.0, the famous big cleanup": http://mail.scipy.org/pipermail/ipython-user/2005-April/002648.html -.. _nbconvert: https://github.com/ipython/nbconvert - diff --git a/_sources/searchresults.txt b/_sources/searchresults.txt deleted file mode 100644 index 4b87bc7..0000000 --- a/_sources/searchresults.txt +++ /dev/null @@ -1,172 +0,0 @@ -.. This displays the search results from the Google Custom Search engine. - Don't link to it directly. - -Search results -============== - -.. raw:: html - -
Loading
- - - diff --git a/_sources/showmedo.txt b/_sources/showmedo.txt deleted file mode 100644 index 707ae30..0000000 --- a/_sources/showmedo.txt +++ /dev/null @@ -1,39 +0,0 @@ -============ -ShowMeDo -============ - --------------------------- - ShowMeDo IPython videos --------------------------- - -The `ShowMeDo `_ website by Ian Ozsvald and Kyran Dale provides instructional videos on a number of topics, and they have a `series `_ of them devoted to IPython. - -This page can serve as a repository of ideas for new videos whose focus is IPython. If you have ideas for new videos or a 'script' on what one of them can contain post it here even if you don't have the time to make it yourself. Someone else may be able to pick up the ball and finish it. - -~~~~~~~ - Ideas -~~~~~~~ - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Using IPython as command shell -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -(also showcase new features; will probably show with svn version) - - * Launch with sh profile - * Show bookmarks, cd -b , cd - completion - * Declare and %store aliases, %rehashdir, %rehashx, %which - * Custom completers (hg, svn etc) - * %hist -g, %rep - --------------------------- - A note about ShowMeDo --------------------------- -(Ian at ShowMeDo.com) The videos I made for IPython are a bit long in the tooth now, it would be great if someone could make one or more videos which show off IPython's strengths. I'm very happy to assist at a technical level, having helped with the production of 50 or so 'casts (and made a fair number myself) I've taken most of the brain damage now. - -A new user could be up and making screencasts within an hour, as long as they had a mic, and the software is open source for Windows and Linux (and pretty cheap for a Mac). The old perception that making videos is hard is simply no longer true :-) - -We handle all of the transcoding, hosting and getting the word out, what we need is people who have the skills to share some of that knowledge. A collaborative effort here to discuss the features that could be displayed, leading to a rough script(s), would make for an ideal starting point. If you're curious about the process, just ping me (ian@showmedo.com) and I'll answer your questions. - -We have screencasts showing you how to use Cam Studio (Windows) and pyvnc2swf (Linux) `here `_ along with notes on `how to make a screencast `_. - diff --git a/_sources/sloan-grant.txt b/_sources/sloan-grant.txt deleted file mode 100644 index b4e7091..0000000 --- a/_sources/sloan-grant.txt +++ /dev/null @@ -1,58 +0,0 @@ -====================== -Sloan Foundation Grant -====================== - -We are pleased to announce that the IPython project has received a $1.15M grant -from `the Alfred P. Sloan foundation `_, that will support -IPython development for the next two years (1/1/2013-12/31/2014). The grant, -which is being made to the University of California, Berkeley and California -Polytechnic State University, San Luis Obispo, will enable the project to focus -on developing the IPython Notebook as a general tool for scientific and -technical computing that is open, collaborative and reproducible. - -The grant ( `html`_ | `pdf`_ ) will fund the following project staff for two -years: - -* Fernando Perez, UC Berkeley, ¾ time project PI -* Brian Granger, Cal Poly San Luis Obispo, ¾ time project co-PI -* Min Ragan-Kelley, UC Berkeley, full time lead project engineer -* Paul Ivanov, UC Berkeley, Postdoc, full time developer -* Thomas Kluyver, UC Berkeley, Postdoc, full time developer -* Matthew Brett, UC Berkeley, ½ time researcher (Y1), applied statistics Notebooks -* JB Poline, UC Berkeley, ½ time researcher (Y1), applied statistics Notebooks - -The main objectives of the grant are: - -* Build interactive JavaScript widgets for the IPython Notebook that enable - computations and visualizations to be controlled with UI controls (sliders, - buttons, etc.). -* Improve the IPython Notebook format by creating libraries for converting - Notebooks to various formats (LaTeX, PDF, HTML, Presentations) and integrating - these into the Notebook web application. -* Adding multiuser support to the Notebook web application, to enable small to - medium sized groups of trusted individuals to run a central Notebook server - for collaborative research and teaching. -* Develop IPython Notebooks for applied statistics in collaboration with - Jonathan Taylor, who will use these materials in his Applied Statistics - course at Stanford (`STAT 191 `_) - -The grant will also provide resources for two development sprints per year at -UC Berkeley, which will include all of the core IPython developers, as well as -funding for cloud computing resources (for things like CI hosting and nbviewer) -and conference travel for project staff. - -We'd like to thank Josh Greenberg, our program director at the Sloan foundation, -for the phenomenal guidance and support he provided during the grant proposal -preparation and detailed review process. We look forward to working with him -over the next few years! - -And last but not least, we want to thank the entire community of users and -developers of IPython, without whom this would not have been possible: IPython -is a project driven strictly by the real-world needs of its users, and therein -lies its value. - -You can view the full grant here: `html`_ `pdf`_. - -.. _html: _static/sloangrant/sloan-grant.html -.. _pdf: _static/sloangrant/sloan-grant.pdf - diff --git a/_sources/usersurvey2011.txt b/_sources/usersurvey2011.txt deleted file mode 100644 index ea2a050..0000000 --- a/_sources/usersurvey2011.txt +++ /dev/null @@ -1,116 +0,0 @@ -IPython User Survey 2011 -======================== - -The first IPython user survey was run from 20 May 2011 to 21 September 2011, and -was promoted via the ipython-user mailing list and from the `IPython homepage -`_. The questions (all optional) were: - -* What country do you live in? -* On what platforms do you use IPython? (Windows, Mac OS X, Linux, Other) -* What parts of IPython do you use? (Interactive Shell, Parallel computing, Other) -* How do you use IPython? -* How would you like IPython to improve in the future? - -In total, it attracted 240 responses, which can be viewed `here `_. -Thank-you to everyone who answered our questions. - -Countries ---------- - -42% of respondents were in the USA, followed by the UK (11%) and Germany (9%). -In order of decreasing frequency, the full list of countries is: - -USA, UK, Germany, France, Canada, Austria, Spain, Switzerland, Sweden, Australia, -Denmark, Norway, China, Singapore, Argentina, Greece, ** Romania, Russia, Finland, -Ireland, Italy, Brazil, Japan, Colombia, Peru, India, Uruguay, South Africa, -Taipei, New Zealand, Saudi Arabia, Holland, Ukraine, Belgium, Slovenia, Israel, -Luxembourg, Czech Republic - -** Countries after this marker were only recorded by one respondent. - -.. image:: _static/survey2011/countries.png - -Platforms ---------- - -The majority of users use IPython on Linux (80%), with Windows (38%) and Macs -(32%) roughly equal. One user listed NetBSD, and one listed Solaris. - -.. image:: _static/survey2011/platforms.png - -Usage ------ - -Predictably, all respondents use the interactive shell. 15% also use parallel -computing features. Among 'Other', the only recurring answer was embedding -IPython. Note that the Qt console & HTML notebook were not included, as they -weren't released when the survey started. - -.. image:: _static/survey2011/partsused.png - -Sector ------- - -Many respondents are in academia (37%), and they mentioned diverse branches of -the sciences. 20% of respondents are in some form of industry (five mentioned -finance), and 16% use it for personal or hobby development. - -There was considerable overlap between groups, with many users in academia and -industry also using IPython at home. In addition, six respondents mentioned that -they were learning Python or programming, and three that they use it for teaching. - -Note that these figures are collected from a free text answer, so they're somewhat -subjective. - -.. image:: _static/survey2011/sector.png - - -Among the interesting areas in which IPython is used are: - -* Programming hospital equipment -* Calibrating spaceflight instruments -* In the US Army Corps of Engineers -* Cinema ticketing systems -* Development of rolling stock (trains) -* Controlling a synchotron - -Requests --------- - -No theme seemed to appear in the answers to where future development should go. -I interpret this as a good sign—there's nothing our users feel is clearly -wrong. - -Some users requested features that already exist, especially features in -the latest release (e.g. multiline editing, Python 3 support). Hopefully this -will improve as new releases get into distributions' repositories, but maybe we -should promote key features better. - -10 respondents suggested that the documentation could be improved. - -At least 8 users talked about better ways to reload modules. This seems to be a -fundamental difference between Python and MATLAB, but perhaps there are ways of -easing the experience for switchers. - -8 respondents either use IPython in Emacs, or said that they'd like -better emacs bindings. Unfortunately, none of the core developers are motivated -to learn Emacs lisp, but we welcome contributions from Emacs users. - -5 people mentioned better support for Windows. We're keen to support any platform, -and we have fixed many Windows bugs, but the main developers are Linux or Mac -users, so we rely on others to report issues. We have a productive collaboration -with Enthought, who bring IPython to many Windows users through EPD. - -Design of the survey --------------------- - -Next time, we could collect better data about: - -* How many people use IPython in their own projects, e.g. embedding it or - creating CLIs for libraries -* How people get IPython, e.g. via EPD, repositories or PyPI -* Whether people have used similar software before, e.g. MATLAB -* What sector respondents are in, in a more structured form - -Every question, however, must be balanced against keeping the survey short so -that people finish answering it. diff --git a/_sources/videos.txt b/_sources/videos.txt deleted file mode 100644 index f09d3e9..0000000 --- a/_sources/videos.txt +++ /dev/null @@ -1,117 +0,0 @@ -.. _videos: - -======================== - Videos and Screencasts -======================== - -Science and Python: retrospective of a (mostly) successful decade -================================================================= - -A historical view of the co-evolution of IPython and the scientific Python -stack (1h), that has been very well received. Delivered by `Fernando Perez`_ as -a keynote presentation at the PyCon Canada 2012 conference in Toronto, it -contains multiple demos of the workflows that IPython enables (`PDF slides -`__). - -.. raw:: html - -

- - -IPython: Python at your fingertips -================================== - -An overview of IPython (40 min) (`PDF slides -`_), delivered by `Fernando -Perez`_ at the PyCon 2012 conference in Santa Clara, CA. It combines a rapid -overview of the IPython project with hands-on demos using the new HTML notebook -interface. - -.. raw:: html - -

- - -The IPython Notebook -==================== - -A short (5 min) demonstration of the notebook's basic features by the team at -the Pybonacci_ blog: - -.. raw:: html - -

- -.. _Pybonacci: http://pybonacci.wordpress.com. - -IPython in depth: high-productivity interactive and parallel python -=================================================================== - -A long and detailed tutorial (2:48h) presented at PyCon 2013 by `Fernando -Perez`_, `Brian Granger`_ and `Min Ragan-Kelley`_ (all materials are `available -on github `_). - -.. raw:: html - -

- -.. _Fernando Perez: http://fperez.org -.. _Brian Granger: http://www.calpoly.edu/~phys/faculty_pages/bgranger.html -.. _Min Ragan-Kelley: https://github.com/minrk - - -More videos and screencasts -=========================== - -* The `Pycon 2012 edition - `_ of the - IPython in-depth tutorial (PDF slides for the `introduction - `_ and - for the `notebook - `_). - -* Kurt Schwehr has an `excellent set of videos up on YouTube - `__ - that describe the use of Python as a research tool. These were made as part - of a `course at the University of New Hampshire - `__. - The topics covered go beyond IPython, and it's a very cohesive set of - lectures around the kinds of workflows that IPython was built for. - -* Brian Granger has a number of screencasts on his `YouTube channel - `_ about using IPython's parallel - computing capabilities. These include a number of examples and a guide to - getting started with IPython and Windows HPC Server 2008. Two of `these - `_ - `videos - `__ - are also being hosted on Microsoft's channel 9. -* The `ShowMeDo `_ site contains instructional videos on a - number of topics. `This page `_ - (from our own wiki) contains further information on ideas for new - IPython-related videos. -* Jose Unpingco has created a set of screencasts on using the Vision/IPython - combo for parallel computing. They are available both at the `Ohio - Supercomputer Center's user site `_ and - at `ShowMeDo `__. -* Another `series at ShowMeDo by Jose Unpingco - `__ makes up a - tutorial on IPython with a focus on scientific computing, which also include - a lot of useful tips on Windows setup and configuration. -* A new `5-part series `_ by - Jeff Rush, approximately 1 hour long. Jeff uses a working IPython to show - many features. Created 2007. -* A new `5-minute slideshow overview - `_ by Jeff - Rush entitled "Python and the Interactive Shell 'IPython'". Created 2007. -* A set `of 4 videos - `_ by Ian Ozsvald - showing various aspects of IPython. Created 2006. diff --git a/_sources/whatsnew082.txt b/_sources/whatsnew082.txt deleted file mode 100644 index ca42a3f..0000000 --- a/_sources/whatsnew082.txt +++ /dev/null @@ -1,76 +0,0 @@ -==================== -WhatsNew082 -==================== - ----------------------------- - New features in 0.8.2 ----------------------------- - -This does not list bugfixes, enhanced internals or api additions. - - * "Shadow history" remembers everything you've entered, forever. Remember that - arcane command line you entered three weeks ago? Just grep the shadow - history with "%hist -g"! `See cookbook - `__ for details. - * %rep is a new magic function that allows you to fetch command lines from - history for editing. Do "%rep?" for details. - * System command aliases (created by %rehashx) are lower case in win32. - * Macros can now take arguments. `See cookbook - `__. - * %macro without arguments lists available macros. - * Directory history (the easiest way to see it is by doing 'cd -') is now - persistent across sessions. - * ipython -i -c : -i (interact) prevents IPython session from exiting - after executing . can now contain IPython syntax (!foo, %magic - etc). - * new profiles: doctest, zope. scipy is now in ipy_profile_scipy.py instead of - ipythonrc-scipy. - * new extensions: - - - ipy_traits_completer.py: complete Traits attributes - - ipy_legacy.py: enable deprecated features - - mglob.py: enhanced globbing - ``%mglob !.svn/ rec:*.py`` - - ipy_exportdb.py: create a portable .py file from your %store'd macros, - aliases, strings and bookmarks for distribution. `See cookbook - `__ . - - ipy_render.py: win32: render templates using Itpl format to clipboard - (e.g. render 'hello $a'). `See cookbook - `__. - - ipy_editors.py: Bunch of popular editors readily configured for - IPython. See ipy_user_conf.py for instructions on how to enable them. - - ipy_fsops.py: Has useful shell utils for plain (non-cygwin enabled) win32 - installations: icp, imv, imkdir, igrep, irm, collect (collect is useful - for others as well). - - * py2exe version supported (ipykit) - * The title bar of IPython window shows the currently executing system - command. - * Prompt on win32 in pysh ('-p sh' profile) now has the drive letter for - enhanced location awareness, and uses / instead of \. - * Errors from misusing magics are much less verbose now (due to UserError - exception). - * String Lists provide a convenient way to manipulate command output. See - `Cookbook `__. - * Directory stack (%pushd, %popd, %dirs) works more predictably now. - * %time allows IPython expressions (which includes system commands - e.g. try - "%time !ls") - * Callable aliases can be used to extend IPython (provide new commands) in a - more elegant manner than magic commands. Also, no % is - necessary/allowed. See ipy_fsops.py for examples. - * Improved Leopard support for tab-completion, though a few issues remain. - ----------------- - Known issues ----------------- - - * We still get crashes from KeyboardInterrupt occasionally (caused by pressing - ctrl+C or ctrl+break) - * Unicode support is not yet perfect, so expect problems on Unicode - input/output. - * The manual is hopelessly out of date. This is something we will look into - during 0.8.3 cycle; in the meantime, see the documentation page on the wiki - [superseded], and the user-maintained `cookbook - `__. - * Under OSX Leopard, we are seeing some readline-related problems with history - recall. It is not clear yet whether the issue is with IPython or Leopard's - readline support itself. We're investigating the issue. diff --git a/_sources/whatsnew083.txt b/_sources/whatsnew083.txt deleted file mode 100644 index 1c4a32d..0000000 --- a/_sources/whatsnew083.txt +++ /dev/null @@ -1,48 +0,0 @@ -------------------------- - New features in 0.8.3 -------------------------- - -This does not list bugfixes, enhanced internals or api additions. - - * ILeo, realized by ipy_leo extension on IPython side and ipython.py plugin on Leo side, allows high level integration between - IPython and Leo literate editor / outliner. This includes editing interactive IPython objects, convenient manipulation of - leo document content, etc. This essentially makes Leo an IPython notebook where you can store your work data and commands persistently, - and play with ideas and data in highly interactive fashion. See http://webpages.charter.net/edreamleo/IPythonBridge.html for details - - * Multithreaded shells (used e.g. by matplotlib interaction) have been improved, reducing the possibility of corner case - deadlocks. IPython also recovers from deadlock within few seconds if it happens, so you don't lose your work. - - * %tasks and %kill in ipy_jobctrl extension allow you to kill OS processes launched from python when ctrl+C just won't do it - - * New option "autoexec" allows queuing commands to run at IPython startup, from config files. See ipy_user_conf.py for examples - - * %edit MyClass works also when MyClass was created in another %edit session. - - * New command line arguments: - - * ``-pydb`` to tell ipython to use pydb as the default debugger (it is no longer assumed when pydb is installed) - * ``-twisted`` installs a twisted reactor in IPython process, where all entered commands are run in a deferred twisted call. - This ensures that everything, apart from input IPython line entry, occurs in same thread. - - * var = !cmd no longer prints the output in addition to storing it in variable - - * sh profile: LA (last arg of previous command) supported, like bash $!. This allows you to enter system commands - like "cp $LA /tmp" or "cp $LA(3) /tmp") - - * Improvements in the development process that should lower the barrier of entry: - - * IPython now uses ReStructuredText and Sphinx for documentation. Consequently, documentation has also been updated for significant - parts (though it's not perfect yet) - * We have switched from Subversion to Bazaar and Launchpad. You can still file bugs in Trac, but Launchpad is recommended - - * New notable extensions (to name a few): - - * ipy_autoreload automatically reloads your modules, saving you tons of reload() calls - * ipy_winpdb provides %wdb magic that acts like %run -d, but allows you to debug a script in WinPdb, - a cross-platform GUI debugger - * ipy_greedycompleter makes tab completion less picky, so stuff like d['hello'].foo. actually yields completions. - * ipy_bzr provides a Bazaar (bzr) tab completer that knows all the commands and options specific to that command. - Recommended if you have used "bzr shell" from bzrtools previously. - - * Lots of improvements in wxIPython, the wx based GUI that liberates IPython from the confines of the console. - diff --git a/_static/IPy_header.png b/_static/IPy_header.png deleted file mode 100644 index e9bdce3..0000000 Binary files a/_static/IPy_header.png and /dev/null differ diff --git a/_static/John-hunter-crop-2.jpeg b/_static/John-hunter-crop-2.jpeg deleted file mode 100644 index 48abd2e..0000000 Binary files a/_static/John-hunter-crop-2.jpeg and /dev/null differ diff --git a/_static/agogo.css b/_static/agogo.css deleted file mode 100644 index de6ffca..0000000 --- a/_static/agogo.css +++ /dev/null @@ -1,483 +0,0 @@ -/* - * agogo.css_t - * ~~~~~~~~~~~ - * - * Sphinx stylesheet -- agogo theme. - * - * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -* { - margin: 0px; - padding: 0px; -} - - -div.header-wrapper { - border-top: 0px solid #babdb6; - padding: 1em 1em 0; - min-height: 0px; -} - -body { - font-family: "Verdana", Arial, sans-serif; - line-height: 1.4em; - color: black; - background-color: white; -} - - -/* Page layout */ - -div.header, div.content, div.footer { - max-width: 70em; - margin-left: auto; - margin-right: auto; -} - -div.header-wrapper { - border-bottom: 0px solid #2e3436; -} - - -/* Default body styles */ -a { - color: #ce5c00; -} - -div.bodywrapper a, div.footer a { - text-decoration: underline; -} - -.clearer { - clear: both; -} - -.left { - float: left; -} - -.right { - float: right; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -h1, h2, h3, h4 { - font-weight: normal; - color: #3465a4; - margin-bottom: .8em; -} - -h1 { - color: #204a87; - line-height: 1.1em; - text-align: left; -} - -h2 { - padding-bottom: .5em; - border-bottom: 1px solid #3465a4; -} - -a.headerlink { - visibility: hidden; - color: #dddddd; - padding-left: .3em; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink { - visibility: visible; -} - -img { - border: 0; -} - -pre { - background-color: #EEE; - padding: 0.5em; -} - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 2px 7px 1px 7px; - border-left: 0.2em solid black; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -dt:target, .highlighted { - background-color: #fbe54e; -} - -/* Header */ - -div.header {} - -div.header h1 { - font-family: "Trebuchet MS", Helvetica, sans-serif; - font-weight: normal; - font-size: 250%; - letter-spacing: .08em; - line-height: 70px; - margin-bottom: 0; -} - -div.header h1 a { - color: white; -} - -div.header h1 a:hover { - text-decoration: none; -} - -div.header div.rel { - margin-top: 1em; - border-top: 1px solid #AAA; - border-bottom: 1px solid #AAA; - border-radius: 5px; - padding: 3px 1em; -} - -div.header div.rel a { - color: #ce5c00; - letter-spacing: .05em; - font-weight: bold; -} - -div.logo {} - -img.logo { - border: 0; -} - - -/* Content */ -div.content-wrapper { - background-color: white; - padding: 1em; -} - -div.document { - max-width: 55em; -} - -div.body { - padding-right: 2em; - text-align: justify; -} - -div.document ul { - margin: 1.5em; - list-style-type: square; -} - -div.document dd { - margin-left: 1.2em; - margin-top: .4em; - margin-bottom: 1em; -} - -div.document .section { - margin-top: 1.7em; -} -div.document .section:first-child { - margin-top: 0px; -} - -div.document div.highlight { - padding: 3px; - background-color: #eeeeec; - border-top: 2px solid #dddddd; - border-bottom: 2px solid #dddddd; - margin-top: .8em; - margin-bottom: .8em; -} - -div.document h2 { - margin-top: .7em; -} - -div.document p { - margin-bottom: .5em; -} - -div.document li.toctree-l1 { - margin-bottom: 1em; -} - -div.document .descname { - font-weight: bold; -} - -div.document .docutils.literal { - background-color: #eeeeec; - padding: 1px; -} - -div.document .docutils.xref.literal { - background-color: transparent; - padding: 0px; -} - -div.document blockquote { - margin: 1em; -} - -div.document ol { - margin: 1.5em; -} - - -/* Sidebar */ - -div.sphinxsidebar { - width: 14em; - padding: 0 1em; - float: right; - font-size: .93em; - background-color: white; -} - -div.sphinxsidebar a, div.header a { - text-decoration: none; -} - -div.sphinxsidebar a:hover, div.header a:hover { - text-decoration: underline; -} - -div.sphinxsidebar h3 { - color: #2e3436; - text-transform: uppercase; - font-size: 130%; - letter-spacing: .1em; - margin-bottom: .4em; -} - -div.sphinxsidebar h4 { - margin-bottom: 0; - font-weight: bold; -} - -div.sphinxsidebar .tile { - border: 1px solid #D1DDE2; - border-radius: 10px; - background-color: #E1E8EC; - padding-left: 0.5em; - margin: 1em 0; -} - -div.sphinxsidebar ul { - list-style-type: none; -} - -div.sphinxsidebar li.toctree-l1 a { - display: block; - padding: 1px; - border: 1px solid #dddddd; - background-color: #eeeeec; - margin-bottom: .4em; - padding-left: 3px; - color: #2e3436; -} - -div.sphinxsidebar li.toctree-l2 a { - background-color: transparent; - border: none; - margin-left: 1em; - border-bottom: 1px solid #dddddd; -} - -div.sphinxsidebar li.toctree-l3 a { - background-color: transparent; - border: none; - margin-left: 2em; - border-bottom: 1px solid #dddddd; -} - -div.sphinxsidebar li.toctree-l2:last-child a { - border-bottom: none; -} - -div.sphinxsidebar li.toctree-l1.current a { - border-right: 5px solid #fcaf3e; -} - -div.sphinxsidebar li.toctree-l1.current li.toctree-l2 a { - border-right: none; -} - -div.sidebarblock { - padding-bottom: .4em; - border-bottom: 1px solid #AAA; - margin-bottom: .8em; -} - - -/* Footer */ - -div.footer-wrapper { - padding-top: 10px; - padding-bottom: 10px; -} - -div.footer { - border-top: 2px solid #aaa; - text-align: right; -} - -div.footer, div.footer a { - color: #888a85; -} - - -/* Styles copied from basic theme */ - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - clear: both; - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable dl, table.indextable dd { - margin-top: 0; - margin-bottom: 0; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -/* -- viewcode extension ---------------------------------------------------- */ - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family:: "Verdana", Arial, sans-serif; -} - -div.viewcode-block:target { - margin: -1px -3px; - padding: 0 3px; - background-color: #f4debf; - border-top: 1px solid #ac9; - border-bottom: 1px solid #ac9; -} \ No newline at end of file diff --git a/_static/ajax-loader.gif b/_static/ajax-loader.gif deleted file mode 100644 index 61faf8c..0000000 Binary files a/_static/ajax-loader.gif and /dev/null differ diff --git a/_static/basic.css b/_static/basic.css deleted file mode 100644 index 5562f68..0000000 --- a/_static/basic.css +++ /dev/null @@ -1,540 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 0px; - margin-left: -100%; - font-size: 90%; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox input[type="text"] { - width: 170px; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - width: 30px; -} - -img { - border: 0; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable dl, table.indextable dd { - margin-top: 0; - margin-bottom: 0; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- general body styles --------------------------------------------------- */ - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.field-list ul { - padding-left: 1em; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.field-list td, table.field-list th { - border: 0 !important; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, .highlighted { - background-color: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.refcount { - color: #060; -} - -.optional { - font-size: 1.3em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -tt.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -tt.descclassname { - background-color: transparent; -} - -tt.xref, a tt { - background-color: transparent; - font-weight: bold; -} - -h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/_static/comment-bright.png b/_static/comment-bright.png deleted file mode 100644 index 551517b..0000000 Binary files a/_static/comment-bright.png and /dev/null differ diff --git a/_static/comment-close.png b/_static/comment-close.png deleted file mode 100644 index 09b54be..0000000 Binary files a/_static/comment-close.png and /dev/null differ diff --git a/_static/comment.png b/_static/comment.png deleted file mode 100644 index 92feb52..0000000 Binary files a/_static/comment.png and /dev/null differ diff --git a/_static/doctools.js b/_static/doctools.js deleted file mode 100644 index 8614442..0000000 --- a/_static/doctools.js +++ /dev/null @@ -1,235 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s == 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node) { - if (node.nodeType == 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { - var span = document.createElement("span"); - span.className = className; - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this); - }); - } - } - return this.each(function() { - highlight(this); - }); -}; - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated == 'undefined') - return string; - return (typeof translated == 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated == 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) == 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this == '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/_static/down-pressed.png b/_static/down-pressed.png deleted file mode 100644 index 6f7ad78..0000000 Binary files a/_static/down-pressed.png and /dev/null differ diff --git a/_static/down.png b/_static/down.png deleted file mode 100644 index 3003a88..0000000 Binary files a/_static/down.png and /dev/null differ diff --git a/_static/fancybox/.gitattributes b/_static/fancybox/.gitattributes deleted file mode 100644 index f6bb280..0000000 --- a/_static/fancybox/.gitattributes +++ /dev/null @@ -1,7 +0,0 @@ -# Auto detect text files and perform LF normalization -* text=auto - -# Denote all files that are truly binary and should not be modified. -*.png binary -*.jpg binary -*.gif binary \ No newline at end of file diff --git a/_static/fancybox/blank.gif b/_static/fancybox/blank.gif deleted file mode 100644 index 35d42e8..0000000 Binary files a/_static/fancybox/blank.gif and /dev/null differ diff --git a/_static/fancybox/fancybox_loading.gif b/_static/fancybox/fancybox_loading.gif deleted file mode 100644 index 0158617..0000000 Binary files a/_static/fancybox/fancybox_loading.gif and /dev/null differ diff --git a/_static/fancybox/fancybox_overlay.png b/_static/fancybox/fancybox_overlay.png deleted file mode 100644 index a439139..0000000 Binary files a/_static/fancybox/fancybox_overlay.png and /dev/null differ diff --git a/_static/fancybox/fancybox_sprite.png b/_static/fancybox/fancybox_sprite.png deleted file mode 100644 index fd8d5ca..0000000 Binary files a/_static/fancybox/fancybox_sprite.png and /dev/null differ diff --git a/_static/fancybox/ipython.fancybox.js b/_static/fancybox/ipython.fancybox.js deleted file mode 100644 index 981f50b..0000000 --- a/_static/fancybox/ipython.fancybox.js +++ /dev/null @@ -1,174 +0,0 @@ -$(document).ready(function() { - /* - * Simple image gallery. Uses default settings - */ - - $('.fancybox').fancybox(); - - /* - * Different effects - */ - - // Change title type, overlay closing speed - $(".fancybox-effects-a").fancybox({ - helpers: { - title : { - type : 'outside' - }, - overlay : { - speedOut : 0 - } - } - }); - - // Disable opening and closing animations, change title type - $(".fancybox-effects-b").fancybox({ - openEffect : 'none', - closeEffect : 'none', - - helpers : { - title : { - type : 'over' - } - } - }); - - // Set custom style, close if clicked, change title type and overlay color - $(".fancybox-effects-c").fancybox({ - wrapCSS : 'fancybox-custom', - closeClick : true, - - openEffect : 'none', - - helpers : { - title : { - type : 'inside' - }, - overlay : { - css : { - 'background' : 'rgba(238,238,238,0.85)' - } - } - } - }); - - // Remove padding, set opening and closing animations, close if clicked and disable overlay - $(".fancybox-effects-d").fancybox({ - padding: 0, - - openEffect : 'elastic', - openSpeed : 150, - - closeEffect : 'elastic', - closeSpeed : 150, - - closeClick : true, - - helpers : { - overlay : null - } - }); - - /* - * Button helper. Disable animations, hide close button, change title type and content - */ - - $('.fancybox-buttons').fancybox({ - openEffect : 'none', - closeEffect : 'none', - - prevEffect : 'none', - nextEffect : 'none', - - closeBtn : false, - - helpers : { - title : { - type : 'inside' - }, - buttons : {} - }, - - afterLoad : function() { - this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : ''); - } - }); - - - /* - * Thumbnail helper. Disable animations, hide close button, arrows and slide to next gallery item if clicked - */ - - $('.fancybox-thumbs').fancybox({ - prevEffect : 'none', - nextEffect : 'none', - - closeBtn : false, - arrows : false, - nextClick : true, - - helpers : { - thumbs : { - width : 50, - height : 50 - } - } - }); - - /* - * Media helper. Group items, disable animations, hide arrows, enable media and button helpers. - */ - $('.fancybox-media') - .attr('rel', 'media-gallery') - .fancybox({ - openEffect : 'none', - closeEffect : 'none', - prevEffect : 'none', - nextEffect : 'none', - - arrows : false, - helpers : { - media : {}, - buttons : {} - } - }); - - /* - * Open manually - */ - - $("#fancybox-manual-a").click(function() { - $.fancybox.open('1_b.jpg'); - }); - - $("#fancybox-manual-b").click(function() { - $.fancybox.open({ - href : 'iframe.html', - type : 'iframe', - padding : 5 - }); - }); - - $("#fancybox-manual-c").click(function() { - $.fancybox.open([ - { - href : '1_b.jpg', - title : 'My title' - }, { - href : '2_b.jpg', - title : '2nd title' - }, { - href : '3_b.jpg' - } - ], { - helpers : { - thumbs : { - width: 75, - height: 50 - } - } - }); - }); - - -}); diff --git a/_static/fancybox/jquery.fancybox.css b/_static/fancybox/jquery.fancybox.css deleted file mode 100644 index d6ff8a1..0000000 --- a/_static/fancybox/jquery.fancybox.css +++ /dev/null @@ -1,249 +0,0 @@ -/*! fancyBox v2.1.3 fancyapps.com | fancyapps.com/fancybox/#license */ -.fancybox-wrap, -.fancybox-skin, -.fancybox-outer, -.fancybox-inner, -.fancybox-image, -.fancybox-wrap iframe, -.fancybox-wrap object, -.fancybox-nav, -.fancybox-nav span, -.fancybox-tmp -{ - padding: 0; - margin: 0; - border: 0; - outline: none; - vertical-align: top; -} - -.fancybox-wrap { - position: absolute; - top: 0; - left: 0; - z-index: 8020; -} - -.fancybox-skin { - position: relative; - background: #f9f9f9; - color: #444; - text-shadow: none; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.fancybox-opened { - z-index: 8030; -} - -.fancybox-opened .fancybox-skin { - -webkit-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); - -moz-box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); - box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5); -} - -.fancybox-outer, .fancybox-inner { - position: relative; -} - -.fancybox-inner { - overflow: hidden; -} - -.fancybox-type-iframe .fancybox-inner { - -webkit-overflow-scrolling: touch; -} - -.fancybox-error { - color: #444; - font: 14px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; - margin: 0; - padding: 15px; - white-space: nowrap; -} - -.fancybox-image, .fancybox-iframe { - display: block; - width: 100%; - height: 100%; -} - -.fancybox-image { - max-width: 100%; - max-height: 100%; -} - -#fancybox-loading, .fancybox-close, .fancybox-prev span, .fancybox-next span { - background-image: url('fancybox_sprite.png'); -} - -#fancybox-loading { - position: fixed; - top: 50%; - left: 50%; - margin-top: -22px; - margin-left: -22px; - background-position: 0 -108px; - opacity: 0.8; - cursor: pointer; - z-index: 8060; -} - -#fancybox-loading div { - width: 44px; - height: 44px; - background: url('fancybox_loading.gif') center center no-repeat; -} - -.fancybox-close { - position: absolute; - top: -18px; - right: -18px; - width: 36px; - height: 36px; - cursor: pointer; - z-index: 8040; -} - -.fancybox-nav { - position: absolute; - top: 0; - width: 40%; - height: 100%; - cursor: pointer; - text-decoration: none; - background: transparent url('blank.gif'); /* helps IE */ - -webkit-tap-highlight-color: rgba(0,0,0,0); - z-index: 8040; -} - -.fancybox-prev { - left: 0; -} - -.fancybox-next { - right: 0; -} - -.fancybox-nav span { - position: absolute; - top: 50%; - width: 36px; - height: 34px; - margin-top: -18px; - cursor: pointer; - z-index: 8040; - visibility: hidden; -} - -.fancybox-prev span { - left: 10px; - background-position: 0 -36px; -} - -.fancybox-next span { - right: 10px; - background-position: 0 -72px; -} - -.fancybox-nav:hover span { - visibility: visible; -} - -.fancybox-tmp { - position: absolute; - top: -99999px; - left: -99999px; - visibility: hidden; - max-width: 99999px; - max-height: 99999px; - overflow: visible !important; -} - -/* Overlay helper */ - -.fancybox-lock { - overflow: hidden; -} - -.fancybox-overlay { - position: absolute; - top: 0; - left: 0; - overflow: hidden; - display: none; - z-index: 8010; - background: url('fancybox_overlay.png'); -} - -.fancybox-overlay-fixed { - position: fixed; - bottom: 0; - right: 0; -} - -.fancybox-lock .fancybox-overlay { - overflow: auto; - overflow-y: scroll; -} - -/* Title helper */ - -.fancybox-title { - visibility: hidden; - font: normal 13px/20px "Helvetica Neue",Helvetica,Arial,sans-serif; - position: relative; - text-shadow: none; - z-index: 8050; -} - -.fancybox-opened .fancybox-title { - visibility: visible; -} - -.fancybox-title-float-wrap { - position: absolute; - bottom: 0; - right: 50%; - margin-bottom: -35px; - z-index: 8050; - text-align: center; -} - -.fancybox-title-float-wrap .child { - display: inline-block; - margin-right: -100%; - padding: 2px 20px; - background: transparent; /* Fallback for web browsers that doesn't support RGBa */ - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; - text-shadow: 0 1px 2px #222; - color: #FFF; - font-weight: bold; - line-height: 24px; - white-space: nowrap; -} - -.fancybox-title-outside-wrap { - position: relative; - margin-top: 10px; - color: #fff; -} - -.fancybox-title-inside-wrap { - padding-top: 10px; -} - -.fancybox-title-over-wrap { - position: absolute; - bottom: 0; - left: 0; - color: #fff; - padding: 10px; - background: #000; - background: rgba(0, 0, 0, .8); -} \ No newline at end of file diff --git a/_static/fancybox/jquery.fancybox.js b/_static/fancybox/jquery.fancybox.js deleted file mode 100755 index ee88e35..0000000 --- a/_static/fancybox/jquery.fancybox.js +++ /dev/null @@ -1,1985 +0,0 @@ -/*! - * fancyBox - jQuery Plugin - * version: 2.1.3 (Tue, 23 Oct 2012) - * @requires jQuery v1.6 or later - * - * Examples at http://fancyapps.com/fancybox/ - * License: www.fancyapps.com/fancybox/#license - * - * Copyright 2012 Janis Skarnelis - janis@fancyapps.com - * - */ - -(function (window, document, $, undefined) { - "use strict"; - - var W = $(window), - D = $(document), - F = $.fancybox = function () { - F.open.apply( this, arguments ); - }, - didUpdate = null, - isTouch = document.createTouch !== undefined, - - isQuery = function(obj) { - return obj && obj.hasOwnProperty && obj instanceof $; - }, - isString = function(str) { - return str && $.type(str) === "string"; - }, - isPercentage = function(str) { - return isString(str) && str.indexOf('%') > 0; - }, - isScrollable = function(el) { - return (el && !(el.style.overflow && el.style.overflow === 'hidden') && ((el.clientWidth && el.scrollWidth > el.clientWidth) || (el.clientHeight && el.scrollHeight > el.clientHeight))); - }, - getScalar = function(orig, dim) { - var value = parseInt(orig, 10) || 0; - - if (dim && isPercentage(orig)) { - value = F.getViewport()[ dim ] / 100 * value; - } - - return Math.ceil(value); - }, - getValue = function(value, dim) { - return getScalar(value, dim) + 'px'; - }; - - $.extend(F, { - // The current version of fancyBox - version: '2.1.3', - - defaults: { - padding : 15, - margin : 20, - - width : 800, - height : 600, - minWidth : 100, - minHeight : 100, - maxWidth : 9999, - maxHeight : 9999, - - autoSize : true, - autoHeight : false, - autoWidth : false, - - autoResize : true, - autoCenter : !isTouch, - fitToView : true, - aspectRatio : false, - topRatio : 0.5, - leftRatio : 0.5, - - scrolling : 'auto', // 'auto', 'yes' or 'no' - wrapCSS : '', - - arrows : true, - closeBtn : true, - closeClick : false, - nextClick : false, - mouseWheel : true, - autoPlay : false, - playSpeed : 3000, - preload : 3, - modal : false, - loop : true, - - ajax : { - dataType : 'html', - headers : { 'X-fancyBox': true } - }, - iframe : { - scrolling : 'auto', - preload : true - }, - swf : { - wmode: 'transparent', - allowfullscreen : 'true', - allowscriptaccess : 'always' - }, - - keys : { - next : { - 13 : 'left', // enter - 34 : 'up', // page down - 39 : 'left', // right arrow - 40 : 'up' // down arrow - }, - prev : { - 8 : 'right', // backspace - 33 : 'down', // page up - 37 : 'right', // left arrow - 38 : 'down' // up arrow - }, - close : [27], // escape key - play : [32], // space - start/stop slideshow - toggle : [70] // letter "f" - toggle fullscreen - }, - - direction : { - next : 'left', - prev : 'right' - }, - - scrollOutside : true, - - // Override some properties - index : 0, - type : null, - href : null, - content : null, - title : null, - - // HTML templates - tpl: { - wrap : '
', - image : '', - iframe : '', - error : '

The requested content cannot be loaded.
Please try again later.

', - closeBtn : '', - next : '', - prev : '' - }, - - // Properties for each animation type - // Opening fancyBox - openEffect : 'fade', // 'elastic', 'fade' or 'none' - openSpeed : 250, - openEasing : 'swing', - openOpacity : true, - openMethod : 'zoomIn', - - // Closing fancyBox - closeEffect : 'fade', // 'elastic', 'fade' or 'none' - closeSpeed : 250, - closeEasing : 'swing', - closeOpacity : true, - closeMethod : 'zoomOut', - - // Changing next gallery item - nextEffect : 'elastic', // 'elastic', 'fade' or 'none' - nextSpeed : 250, - nextEasing : 'swing', - nextMethod : 'changeIn', - - // Changing previous gallery item - prevEffect : 'elastic', // 'elastic', 'fade' or 'none' - prevSpeed : 250, - prevEasing : 'swing', - prevMethod : 'changeOut', - - // Enable default helpers - helpers : { - overlay : true, - title : true - }, - - // Callbacks - onCancel : $.noop, // If canceling - beforeLoad : $.noop, // Before loading - afterLoad : $.noop, // After loading - beforeShow : $.noop, // Before changing in current item - afterShow : $.noop, // After opening - beforeChange : $.noop, // Before changing gallery item - beforeClose : $.noop, // Before closing - afterClose : $.noop // After closing - }, - - //Current state - group : {}, // Selected group - opts : {}, // Group options - previous : null, // Previous element - coming : null, // Element being loaded - current : null, // Currently loaded element - isActive : false, // Is activated - isOpen : false, // Is currently open - isOpened : false, // Have been fully opened at least once - - wrap : null, - skin : null, - outer : null, - inner : null, - - player : { - timer : null, - isActive : false - }, - - // Loaders - ajaxLoad : null, - imgPreload : null, - - // Some collections - transitions : {}, - helpers : {}, - - /* - * Static methods - */ - - open: function (group, opts) { - if (!group) { - return; - } - - if (!$.isPlainObject(opts)) { - opts = {}; - } - - // Close if already active - if (false === F.close(true)) { - return; - } - - // Normalize group - if (!$.isArray(group)) { - group = isQuery(group) ? $(group).get() : [group]; - } - - // Recheck if the type of each element is `object` and set content type (image, ajax, etc) - $.each(group, function(i, element) { - var obj = {}, - href, - title, - content, - type, - rez, - hrefParts, - selector; - - if ($.type(element) === "object") { - // Check if is DOM element - if (element.nodeType) { - element = $(element); - } - - if (isQuery(element)) { - obj = { - href : element.data('fancybox-href') || element.attr('href'), - title : element.data('fancybox-title') || element.attr('title'), - isDom : true, - element : element - }; - - if ($.metadata) { - $.extend(true, obj, element.metadata()); - } - - } else { - obj = element; - } - } - - href = opts.href || obj.href || (isString(element) ? element : null); - title = opts.title !== undefined ? opts.title : obj.title || ''; - - content = opts.content || obj.content; - type = content ? 'html' : (opts.type || obj.type); - - if (!type && obj.isDom) { - type = element.data('fancybox-type'); - - if (!type) { - rez = element.prop('class').match(/fancybox\.(\w+)/); - type = rez ? rez[1] : null; - } - } - - if (isString(href)) { - // Try to guess the content type - if (!type) { - if (F.isImage(href)) { - type = 'image'; - - } else if (F.isSWF(href)) { - type = 'swf'; - - } else if (href.charAt(0) === '#') { - type = 'inline'; - - } else if (isString(element)) { - type = 'html'; - content = element; - } - } - - // Split url into two pieces with source url and content selector, e.g, - // "/mypage.html #my_id" will load "/mypage.html" and display element having id "my_id" - if (type === 'ajax') { - hrefParts = href.split(/\s+/, 2); - href = hrefParts.shift(); - selector = hrefParts.shift(); - } - } - - if (!content) { - if (type === 'inline') { - if (href) { - content = $( isString(href) ? href.replace(/.*(?=#[^\s]+$)/, '') : href ); //strip for ie7 - - } else if (obj.isDom) { - content = element; - } - - } else if (type === 'html') { - content = href; - - } else if (!type && !href && obj.isDom) { - type = 'inline'; - content = element; - } - } - - $.extend(obj, { - href : href, - type : type, - content : content, - title : title, - selector : selector - }); - - group[ i ] = obj; - }); - - // Extend the defaults - F.opts = $.extend(true, {}, F.defaults, opts); - - // All options are merged recursive except keys - if (opts.keys !== undefined) { - F.opts.keys = opts.keys ? $.extend({}, F.defaults.keys, opts.keys) : false; - } - - F.group = group; - - return F._start(F.opts.index); - }, - - // Cancel image loading or abort ajax request - cancel: function () { - var coming = F.coming; - - if (!coming || false === F.trigger('onCancel')) { - return; - } - - F.hideLoading(); - - if (F.ajaxLoad) { - F.ajaxLoad.abort(); - } - - F.ajaxLoad = null; - - if (F.imgPreload) { - F.imgPreload.onload = F.imgPreload.onerror = null; - } - - if (coming.wrap) { - coming.wrap.stop(true, true).trigger('onReset').remove(); - } - - F.coming = null; - - // If the first item has been canceled, then clear everything - if (!F.current) { - F._afterZoomOut( coming ); - } - }, - - // Start closing animation if is open; remove immediately if opening/closing - close: function (event) { - F.cancel(); - - if (false === F.trigger('beforeClose')) { - return; - } - - F.unbindEvents(); - - if (!F.isActive) { - return; - } - - if (!F.isOpen || event === true) { - $('.fancybox-wrap').stop(true).trigger('onReset').remove(); - - F._afterZoomOut(); - - } else { - F.isOpen = F.isOpened = false; - F.isClosing = true; - - $('.fancybox-item, .fancybox-nav').remove(); - - F.wrap.stop(true, true).removeClass('fancybox-opened'); - - F.transitions[ F.current.closeMethod ](); - } - }, - - // Manage slideshow: - // $.fancybox.play(); - toggle slideshow - // $.fancybox.play( true ); - start - // $.fancybox.play( false ); - stop - play: function ( action ) { - var clear = function () { - clearTimeout(F.player.timer); - }, - set = function () { - clear(); - - if (F.current && F.player.isActive) { - F.player.timer = setTimeout(F.next, F.current.playSpeed); - } - }, - stop = function () { - clear(); - - $('body').unbind('.player'); - - F.player.isActive = false; - - F.trigger('onPlayEnd'); - }, - start = function () { - if (F.current && (F.current.loop || F.current.index < F.group.length - 1)) { - F.player.isActive = true; - - $('body').bind({ - 'afterShow.player onUpdate.player' : set, - 'onCancel.player beforeClose.player' : stop, - 'beforeLoad.player' : clear - }); - - set(); - - F.trigger('onPlayStart'); - } - }; - - if (action === true || (!F.player.isActive && action !== false)) { - start(); - } else { - stop(); - } - }, - - // Navigate to next gallery item - next: function ( direction ) { - var current = F.current; - - if (current) { - if (!isString(direction)) { - direction = current.direction.next; - } - - F.jumpto(current.index + 1, direction, 'next'); - } - }, - - // Navigate to previous gallery item - prev: function ( direction ) { - var current = F.current; - - if (current) { - if (!isString(direction)) { - direction = current.direction.prev; - } - - F.jumpto(current.index - 1, direction, 'prev'); - } - }, - - // Navigate to gallery item by index - jumpto: function ( index, direction, router ) { - var current = F.current; - - if (!current) { - return; - } - - index = getScalar(index); - - F.direction = direction || current.direction[ (index >= current.index ? 'next' : 'prev') ]; - F.router = router || 'jumpto'; - - if (current.loop) { - if (index < 0) { - index = current.group.length + (index % current.group.length); - } - - index = index % current.group.length; - } - - if (current.group[ index ] !== undefined) { - F.cancel(); - - F._start(index); - } - }, - - // Center inside viewport and toggle position type to fixed or absolute if needed - reposition: function (e, onlyAbsolute) { - var current = F.current, - wrap = current ? current.wrap : null, - pos; - - if (wrap) { - pos = F._getPosition(onlyAbsolute); - - if (e && e.type === 'scroll') { - delete pos.position; - - wrap.stop(true, true).animate(pos, 200); - - } else { - wrap.css(pos); - - current.pos = $.extend({}, current.dim, pos); - } - } - }, - - update: function (e) { - var type = (e && e.type), - anyway = !type || type === 'orientationchange'; - - if (anyway) { - clearTimeout(didUpdate); - - didUpdate = null; - } - - if (!F.isOpen || didUpdate) { - return; - } - - didUpdate = setTimeout(function() { - var current = F.current; - - if (!current || F.isClosing) { - return; - } - - F.wrap.removeClass('fancybox-tmp'); - - if (anyway || type === 'load' || (type === 'resize' && current.autoResize)) { - F._setDimension(); - } - - if (!(type === 'scroll' && current.canShrink)) { - F.reposition(e); - } - - F.trigger('onUpdate'); - - didUpdate = null; - - }, (anyway && !isTouch ? 0 : 300)); - }, - - // Shrink content to fit inside viewport or restore if resized - toggle: function ( action ) { - if (F.isOpen) { - F.current.fitToView = $.type(action) === "boolean" ? action : !F.current.fitToView; - - // Help browser to restore document dimensions - if (isTouch) { - F.wrap.removeAttr('style').addClass('fancybox-tmp'); - - F.trigger('onUpdate'); - } - - F.update(); - } - }, - - hideLoading: function () { - D.unbind('.loading'); - - $('#fancybox-loading').remove(); - }, - - showLoading: function () { - var el, viewport; - - F.hideLoading(); - - el = $('
').click(F.cancel).appendTo('body'); - - // If user will press the escape-button, the request will be canceled - D.bind('keydown.loading', function(e) { - if ((e.which || e.keyCode) === 27) { - e.preventDefault(); - - F.cancel(); - } - }); - - if (!F.defaults.fixed) { - viewport = F.getViewport(); - - el.css({ - position : 'absolute', - top : (viewport.h * 0.5) + viewport.y, - left : (viewport.w * 0.5) + viewport.x - }); - } - }, - - getViewport: function () { - var locked = (F.current && F.current.locked) || false, - rez = { - x: W.scrollLeft(), - y: W.scrollTop() - }; - - if (locked) { - rez.w = locked[0].clientWidth; - rez.h = locked[0].clientHeight; - - } else { - // See http://bugs.jquery.com/ticket/6724 - rez.w = isTouch && window.innerWidth ? window.innerWidth : W.width(); - rez.h = isTouch && window.innerHeight ? window.innerHeight : W.height(); - } - - return rez; - }, - - // Unbind the keyboard / clicking actions - unbindEvents: function () { - if (F.wrap && isQuery(F.wrap)) { - F.wrap.unbind('.fb'); - } - - D.unbind('.fb'); - W.unbind('.fb'); - }, - - bindEvents: function () { - var current = F.current, - keys; - - if (!current) { - return; - } - - // Changing document height on iOS devices triggers a 'resize' event, - // that can change document height... repeating infinitely - W.bind('orientationchange.fb' + (isTouch ? '' : ' resize.fb') + (current.autoCenter && !current.locked ? ' scroll.fb' : ''), F.update); - - keys = current.keys; - - if (keys) { - D.bind('keydown.fb', function (e) { - var code = e.which || e.keyCode, - target = e.target || e.srcElement; - - // Skip esc key if loading, because showLoading will cancel preloading - if (code === 27 && F.coming) { - return false; - } - - // Ignore key combinations and key events within form elements - if (!e.ctrlKey && !e.altKey && !e.shiftKey && !e.metaKey && !(target && (target.type || $(target).is('[contenteditable]')))) { - $.each(keys, function(i, val) { - if (current.group.length > 1 && val[ code ] !== undefined) { - F[ i ]( val[ code ] ); - - e.preventDefault(); - return false; - } - - if ($.inArray(code, val) > -1) { - F[ i ] (); - - e.preventDefault(); - return false; - } - }); - } - }); - } - - if ($.fn.mousewheel && current.mouseWheel) { - F.wrap.bind('mousewheel.fb', function (e, delta, deltaX, deltaY) { - var target = e.target || null, - parent = $(target), - canScroll = false; - - while (parent.length) { - if (canScroll || parent.is('.fancybox-skin') || parent.is('.fancybox-wrap')) { - break; - } - - canScroll = isScrollable( parent[0] ); - parent = $(parent).parent(); - } - - if (delta !== 0 && !canScroll) { - if (F.group.length > 1 && !current.canShrink) { - if (deltaY > 0 || deltaX > 0) { - F.prev( deltaY > 0 ? 'down' : 'left' ); - - } else if (deltaY < 0 || deltaX < 0) { - F.next( deltaY < 0 ? 'up' : 'right' ); - } - - e.preventDefault(); - } - } - }); - } - }, - - trigger: function (event, o) { - var ret, obj = o || F.coming || F.current; - - if (!obj) { - return; - } - - if ($.isFunction( obj[event] )) { - ret = obj[event].apply(obj, Array.prototype.slice.call(arguments, 1)); - } - - if (ret === false) { - return false; - } - - if (obj.helpers) { - $.each(obj.helpers, function (helper, opts) { - if (opts && F.helpers[helper] && $.isFunction(F.helpers[helper][event])) { - opts = $.extend(true, {}, F.helpers[helper].defaults, opts); - - F.helpers[helper][event](opts, obj); - } - }); - } - - $.event.trigger(event + '.fb'); - }, - - isImage: function (str) { - return isString(str) && str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp)((\?|#).*)?$)/i); - }, - - isSWF: function (str) { - return isString(str) && str.match(/\.(swf)((\?|#).*)?$/i); - }, - - _start: function (index) { - var coming = {}, - obj, - href, - type, - margin, - padding; - - index = getScalar( index ); - obj = F.group[ index ] || null; - - if (!obj) { - return false; - } - - coming = $.extend(true, {}, F.opts, obj); - - // Convert margin and padding properties to array - top, right, bottom, left - margin = coming.margin; - padding = coming.padding; - - if ($.type(margin) === 'number') { - coming.margin = [margin, margin, margin, margin]; - } - - if ($.type(padding) === 'number') { - coming.padding = [padding, padding, padding, padding]; - } - - // 'modal' propery is just a shortcut - if (coming.modal) { - $.extend(true, coming, { - closeBtn : false, - closeClick : false, - nextClick : false, - arrows : false, - mouseWheel : false, - keys : null, - helpers: { - overlay : { - closeClick : false - } - } - }); - } - - // 'autoSize' property is a shortcut, too - if (coming.autoSize) { - coming.autoWidth = coming.autoHeight = true; - } - - if (coming.width === 'auto') { - coming.autoWidth = true; - } - - if (coming.height === 'auto') { - coming.autoHeight = true; - } - - /* - * Add reference to the group, so it`s possible to access from callbacks, example: - * afterLoad : function() { - * this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : ''); - * } - */ - - coming.group = F.group; - coming.index = index; - - // Give a chance for callback or helpers to update coming item (type, title, etc) - F.coming = coming; - - if (false === F.trigger('beforeLoad')) { - F.coming = null; - - return; - } - - type = coming.type; - href = coming.href; - - if (!type) { - F.coming = null; - - //If we can not determine content type then drop silently or display next/prev item if looping through gallery - if (F.current && F.router && F.router !== 'jumpto') { - F.current.index = index; - - return F[ F.router ]( F.direction ); - } - - return false; - } - - F.isActive = true; - - if (type === 'image' || type === 'swf') { - coming.autoHeight = coming.autoWidth = false; - coming.scrolling = 'visible'; - } - - if (type === 'image') { - coming.aspectRatio = true; - } - - if (type === 'iframe' && isTouch) { - coming.scrolling = 'scroll'; - } - - // Build the neccessary markup - coming.wrap = $(coming.tpl.wrap).addClass('fancybox-' + (isTouch ? 'mobile' : 'desktop') + ' fancybox-type-' + type + ' fancybox-tmp ' + coming.wrapCSS).appendTo( coming.parent || 'body' ); - - $.extend(coming, { - skin : $('.fancybox-skin', coming.wrap), - outer : $('.fancybox-outer', coming.wrap), - inner : $('.fancybox-inner', coming.wrap) - }); - - $.each(["Top", "Right", "Bottom", "Left"], function(i, v) { - coming.skin.css('padding' + v, getValue(coming.padding[ i ])); - }); - - F.trigger('onReady'); - - // Check before try to load; 'inline' and 'html' types need content, others - href - if (type === 'inline' || type === 'html') { - if (!coming.content || !coming.content.length) { - return F._error( 'content' ); - } - - } else if (!href) { - return F._error( 'href' ); - } - - if (type === 'image') { - F._loadImage(); - - } else if (type === 'ajax') { - F._loadAjax(); - - } else if (type === 'iframe') { - F._loadIframe(); - - } else { - F._afterLoad(); - } - }, - - _error: function ( type ) { - $.extend(F.coming, { - type : 'html', - autoWidth : true, - autoHeight : true, - minWidth : 0, - minHeight : 0, - scrolling : 'no', - hasError : type, - content : F.coming.tpl.error - }); - - F._afterLoad(); - }, - - _loadImage: function () { - // Reset preload image so it is later possible to check "complete" property - var img = F.imgPreload = new Image(); - - img.onload = function () { - this.onload = this.onerror = null; - - F.coming.width = this.width; - F.coming.height = this.height; - - F._afterLoad(); - }; - - img.onerror = function () { - this.onload = this.onerror = null; - - F._error( 'image' ); - }; - - img.src = F.coming.href; - - if (img.complete !== true) { - F.showLoading(); - } - }, - - _loadAjax: function () { - var coming = F.coming; - - F.showLoading(); - - F.ajaxLoad = $.ajax($.extend({}, coming.ajax, { - url: coming.href, - error: function (jqXHR, textStatus) { - if (F.coming && textStatus !== 'abort') { - F._error( 'ajax', jqXHR ); - - } else { - F.hideLoading(); - } - }, - success: function (data, textStatus) { - if (textStatus === 'success') { - coming.content = data; - - F._afterLoad(); - } - } - })); - }, - - _loadIframe: function() { - var coming = F.coming, - iframe = $(coming.tpl.iframe.replace(/\{rnd\}/g, new Date().getTime())) - .attr('scrolling', isTouch ? 'auto' : coming.iframe.scrolling) - .attr('src', coming.href); - - // This helps IE - $(coming.wrap).bind('onReset', function () { - try { - $(this).find('iframe').hide().attr('src', '//about:blank').end().empty(); - } catch (e) {} - }); - - if (coming.iframe.preload) { - F.showLoading(); - - iframe.one('load', function() { - $(this).data('ready', 1); - - // iOS will lose scrolling if we resize - if (!isTouch) { - $(this).bind('load.fb', F.update); - } - - // Without this trick: - // - iframe won't scroll on iOS devices - // - IE7 sometimes displays empty iframe - $(this).parents('.fancybox-wrap').width('100%').removeClass('fancybox-tmp').show(); - - F._afterLoad(); - }); - } - - coming.content = iframe.appendTo( coming.inner ); - - if (!coming.iframe.preload) { - F._afterLoad(); - } - }, - - _preloadImages: function() { - var group = F.group, - current = F.current, - len = group.length, - cnt = current.preload ? Math.min(current.preload, len - 1) : 0, - item, - i; - - for (i = 1; i <= cnt; i += 1) { - item = group[ (current.index + i ) % len ]; - - if (item.type === 'image' && item.href) { - new Image().src = item.href; - } - } - }, - - _afterLoad: function () { - var coming = F.coming, - previous = F.current, - placeholder = 'fancybox-placeholder', - current, - content, - type, - scrolling, - href, - embed; - - F.hideLoading(); - - if (!coming || F.isActive === false) { - return; - } - - if (false === F.trigger('afterLoad', coming, previous)) { - coming.wrap.stop(true).trigger('onReset').remove(); - - F.coming = null; - - return; - } - - if (previous) { - F.trigger('beforeChange', previous); - - previous.wrap.stop(true).removeClass('fancybox-opened') - .find('.fancybox-item, .fancybox-nav') - .remove(); - } - - F.unbindEvents(); - - current = coming; - content = coming.content; - type = coming.type; - scrolling = coming.scrolling; - - $.extend(F, { - wrap : current.wrap, - skin : current.skin, - outer : current.outer, - inner : current.inner, - current : current, - previous : previous - }); - - href = current.href; - - switch (type) { - case 'inline': - case 'ajax': - case 'html': - if (current.selector) { - content = $('
').html(content).find(current.selector); - - } else if (isQuery(content)) { - if (!content.data(placeholder)) { - content.data(placeholder, $('
').insertAfter( content ).hide() ); - } - - content = content.show().detach(); - - current.wrap.bind('onReset', function () { - if ($(this).find(content).length) { - content.hide().replaceAll( content.data(placeholder) ).data(placeholder, false); - } - }); - } - break; - - case 'image': - content = current.tpl.image.replace('{href}', href); - break; - - case 'swf': - content = ''; - embed = ''; - - $.each(current.swf, function(name, val) { - content += ''; - embed += ' ' + name + '="' + val + '"'; - }); - - content += ''; - break; - } - - if (!(isQuery(content) && content.parent().is(current.inner))) { - current.inner.append( content ); - } - - // Give a chance for helpers or callbacks to update elements - F.trigger('beforeShow'); - - // Set scrolling before calculating dimensions - current.inner.css('overflow', scrolling === 'yes' ? 'scroll' : (scrolling === 'no' ? 'hidden' : scrolling)); - - // Set initial dimensions and start position - F._setDimension(); - - F.reposition(); - - F.isOpen = false; - F.coming = null; - - F.bindEvents(); - - if (!F.isOpened) { - $('.fancybox-wrap').not( current.wrap ).stop(true).trigger('onReset').remove(); - - } else if (previous.prevMethod) { - F.transitions[ previous.prevMethod ](); - } - - F.transitions[ F.isOpened ? current.nextMethod : current.openMethod ](); - - F._preloadImages(); - }, - - _setDimension: function () { - var viewport = F.getViewport(), - steps = 0, - canShrink = false, - canExpand = false, - wrap = F.wrap, - skin = F.skin, - inner = F.inner, - current = F.current, - width = current.width, - height = current.height, - minWidth = current.minWidth, - minHeight = current.minHeight, - maxWidth = current.maxWidth, - maxHeight = current.maxHeight, - scrolling = current.scrolling, - scrollOut = current.scrollOutside ? current.scrollbarWidth : 0, - margin = current.margin, - wMargin = getScalar(margin[1] + margin[3]), - hMargin = getScalar(margin[0] + margin[2]), - wPadding, - hPadding, - wSpace, - hSpace, - origWidth, - origHeight, - origMaxWidth, - origMaxHeight, - ratio, - width_, - height_, - maxWidth_, - maxHeight_, - iframe, - body; - - // Reset dimensions so we could re-check actual size - wrap.add(skin).add(inner).width('auto').height('auto').removeClass('fancybox-tmp'); - - wPadding = getScalar(skin.outerWidth(true) - skin.width()); - hPadding = getScalar(skin.outerHeight(true) - skin.height()); - - // Any space between content and viewport (margin, padding, border, title) - wSpace = wMargin + wPadding; - hSpace = hMargin + hPadding; - - origWidth = isPercentage(width) ? (viewport.w - wSpace) * getScalar(width) / 100 : width; - origHeight = isPercentage(height) ? (viewport.h - hSpace) * getScalar(height) / 100 : height; - - if (current.type === 'iframe') { - iframe = current.content; - - if (current.autoHeight && iframe.data('ready') === 1) { - try { - if (iframe[0].contentWindow.document.location) { - inner.width( origWidth ).height(9999); - - body = iframe.contents().find('body'); - - if (scrollOut) { - body.css('overflow-x', 'hidden'); - } - - origHeight = body.height(); - } - - } catch (e) {} - } - - } else if (current.autoWidth || current.autoHeight) { - inner.addClass( 'fancybox-tmp' ); - - // Set width or height in case we need to calculate only one dimension - if (!current.autoWidth) { - inner.width( origWidth ); - } - - if (!current.autoHeight) { - inner.height( origHeight ); - } - - if (current.autoWidth) { - origWidth = inner.width(); - } - - if (current.autoHeight) { - origHeight = inner.height(); - } - - inner.removeClass( 'fancybox-tmp' ); - } - - width = getScalar( origWidth ); - height = getScalar( origHeight ); - - ratio = origWidth / origHeight; - - // Calculations for the content - minWidth = getScalar(isPercentage(minWidth) ? getScalar(minWidth, 'w') - wSpace : minWidth); - maxWidth = getScalar(isPercentage(maxWidth) ? getScalar(maxWidth, 'w') - wSpace : maxWidth); - - minHeight = getScalar(isPercentage(minHeight) ? getScalar(minHeight, 'h') - hSpace : minHeight); - maxHeight = getScalar(isPercentage(maxHeight) ? getScalar(maxHeight, 'h') - hSpace : maxHeight); - - // These will be used to determine if wrap can fit in the viewport - origMaxWidth = maxWidth; - origMaxHeight = maxHeight; - - if (current.fitToView) { - maxWidth = Math.min(viewport.w - wSpace, maxWidth); - maxHeight = Math.min(viewport.h - hSpace, maxHeight); - } - - maxWidth_ = viewport.w - wMargin; - maxHeight_ = viewport.h - hMargin; - - if (current.aspectRatio) { - if (width > maxWidth) { - width = maxWidth; - height = getScalar(width / ratio); - } - - if (height > maxHeight) { - height = maxHeight; - width = getScalar(height * ratio); - } - - if (width < minWidth) { - width = minWidth; - height = getScalar(width / ratio); - } - - if (height < minHeight) { - height = minHeight; - width = getScalar(height * ratio); - } - - } else { - width = Math.max(minWidth, Math.min(width, maxWidth)); - - if (current.autoHeight && current.type !== 'iframe') { - inner.width( width ); - - height = inner.height(); - } - - height = Math.max(minHeight, Math.min(height, maxHeight)); - } - - // Try to fit inside viewport (including the title) - if (current.fitToView) { - inner.width( width ).height( height ); - - wrap.width( width + wPadding ); - - // Real wrap dimensions - width_ = wrap.width(); - height_ = wrap.height(); - - if (current.aspectRatio) { - while ((width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight) { - if (steps++ > 19) { - break; - } - - height = Math.max(minHeight, Math.min(maxHeight, height - 10)); - width = getScalar(height * ratio); - - if (width < minWidth) { - width = minWidth; - height = getScalar(width / ratio); - } - - if (width > maxWidth) { - width = maxWidth; - height = getScalar(width / ratio); - } - - inner.width( width ).height( height ); - - wrap.width( width + wPadding ); - - width_ = wrap.width(); - height_ = wrap.height(); - } - - } else { - width = Math.max(minWidth, Math.min(width, width - (width_ - maxWidth_))); - height = Math.max(minHeight, Math.min(height, height - (height_ - maxHeight_))); - } - } - - if (scrollOut && scrolling === 'auto' && height < origHeight && (width + wPadding + scrollOut) < maxWidth_) { - width += scrollOut; - } - - inner.width( width ).height( height ); - - wrap.width( width + wPadding ); - - width_ = wrap.width(); - height_ = wrap.height(); - - canShrink = (width_ > maxWidth_ || height_ > maxHeight_) && width > minWidth && height > minHeight; - canExpand = current.aspectRatio ? (width < origMaxWidth && height < origMaxHeight && width < origWidth && height < origHeight) : ((width < origMaxWidth || height < origMaxHeight) && (width < origWidth || height < origHeight)); - - $.extend(current, { - dim : { - width : getValue( width_ ), - height : getValue( height_ ) - }, - origWidth : origWidth, - origHeight : origHeight, - canShrink : canShrink, - canExpand : canExpand, - wPadding : wPadding, - hPadding : hPadding, - wrapSpace : height_ - skin.outerHeight(true), - skinSpace : skin.height() - height - }); - - if (!iframe && current.autoHeight && height > minHeight && height < maxHeight && !canExpand) { - inner.height('auto'); - } - }, - - _getPosition: function (onlyAbsolute) { - var current = F.current, - viewport = F.getViewport(), - margin = current.margin, - width = F.wrap.width() + margin[1] + margin[3], - height = F.wrap.height() + margin[0] + margin[2], - rez = { - position: 'absolute', - top : margin[0], - left : margin[3] - }; - - if (current.autoCenter && current.fixed && !onlyAbsolute && height <= viewport.h && width <= viewport.w) { - rez.position = 'fixed'; - - } else if (!current.locked) { - rez.top += viewport.y; - rez.left += viewport.x; - } - - rez.top = getValue(Math.max(rez.top, rez.top + ((viewport.h - height) * current.topRatio))); - rez.left = getValue(Math.max(rez.left, rez.left + ((viewport.w - width) * current.leftRatio))); - - return rez; - }, - - _afterZoomIn: function () { - var current = F.current; - - if (!current) { - return; - } - - F.isOpen = F.isOpened = true; - - F.wrap.css('overflow', 'visible').addClass('fancybox-opened'); - - F.update(); - - // Assign a click event - if ( current.closeClick || (current.nextClick && F.group.length > 1) ) { - F.inner.css('cursor', 'pointer').bind('click.fb', function(e) { - if (!$(e.target).is('a') && !$(e.target).parent().is('a')) { - e.preventDefault(); - - F[ current.closeClick ? 'close' : 'next' ](); - } - }); - } - - // Create a close button - if (current.closeBtn) { - $(current.tpl.closeBtn).appendTo(F.skin).bind( isTouch ? 'touchstart.fb' : 'click.fb', function(e) { - e.preventDefault(); - - F.close(); - }); - } - - // Create navigation arrows - if (current.arrows && F.group.length > 1) { - if (current.loop || current.index > 0) { - $(current.tpl.prev).appendTo(F.outer).bind('click.fb', F.prev); - } - - if (current.loop || current.index < F.group.length - 1) { - $(current.tpl.next).appendTo(F.outer).bind('click.fb', F.next); - } - } - - F.trigger('afterShow'); - - // Stop the slideshow if this is the last item - if (!current.loop && current.index === current.group.length - 1) { - F.play( false ); - - } else if (F.opts.autoPlay && !F.player.isActive) { - F.opts.autoPlay = false; - - F.play(); - } - }, - - _afterZoomOut: function ( obj ) { - obj = obj || F.current; - - $('.fancybox-wrap').trigger('onReset').remove(); - - $.extend(F, { - group : {}, - opts : {}, - router : false, - current : null, - isActive : false, - isOpened : false, - isOpen : false, - isClosing : false, - wrap : null, - skin : null, - outer : null, - inner : null - }); - - F.trigger('afterClose', obj); - } - }); - - /* - * Default transitions - */ - - F.transitions = { - getOrigPosition: function () { - var current = F.current, - element = current.element, - orig = current.orig, - pos = {}, - width = 50, - height = 50, - hPadding = current.hPadding, - wPadding = current.wPadding, - viewport = F.getViewport(); - - if (!orig && current.isDom && element.is(':visible')) { - orig = element.find('img:first'); - - if (!orig.length) { - orig = element; - } - } - - if (isQuery(orig)) { - pos = orig.offset(); - - if (orig.is('img')) { - width = orig.outerWidth(); - height = orig.outerHeight(); - } - - } else { - pos.top = viewport.y + (viewport.h - height) * current.topRatio; - pos.left = viewport.x + (viewport.w - width) * current.leftRatio; - } - - if (F.wrap.css('position') === 'fixed' || current.locked) { - pos.top -= viewport.y; - pos.left -= viewport.x; - } - - pos = { - top : getValue(pos.top - hPadding * current.topRatio), - left : getValue(pos.left - wPadding * current.leftRatio), - width : getValue(width + wPadding), - height : getValue(height + hPadding) - }; - - return pos; - }, - - step: function (now, fx) { - var ratio, - padding, - value, - prop = fx.prop, - current = F.current, - wrapSpace = current.wrapSpace, - skinSpace = current.skinSpace; - - if (prop === 'width' || prop === 'height') { - ratio = fx.end === fx.start ? 1 : (now - fx.start) / (fx.end - fx.start); - - if (F.isClosing) { - ratio = 1 - ratio; - } - - padding = prop === 'width' ? current.wPadding : current.hPadding; - value = now - padding; - - F.skin[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) ) ); - F.inner[ prop ]( getScalar( prop === 'width' ? value : value - (wrapSpace * ratio) - (skinSpace * ratio) ) ); - } - }, - - zoomIn: function () { - var current = F.current, - startPos = current.pos, - effect = current.openEffect, - elastic = effect === 'elastic', - endPos = $.extend({opacity : 1}, startPos); - - // Remove "position" property that breaks older IE - delete endPos.position; - - if (elastic) { - startPos = this.getOrigPosition(); - - if (current.openOpacity) { - startPos.opacity = 0.1; - } - - } else if (effect === 'fade') { - startPos.opacity = 0.1; - } - - F.wrap.css(startPos).animate(endPos, { - duration : effect === 'none' ? 0 : current.openSpeed, - easing : current.openEasing, - step : elastic ? this.step : null, - complete : F._afterZoomIn - }); - }, - - zoomOut: function () { - var current = F.current, - effect = current.closeEffect, - elastic = effect === 'elastic', - endPos = {opacity : 0.1}; - - if (elastic) { - endPos = this.getOrigPosition(); - - if (current.closeOpacity) { - endPos.opacity = 0.1; - } - } - - F.wrap.animate(endPos, { - duration : effect === 'none' ? 0 : current.closeSpeed, - easing : current.closeEasing, - step : elastic ? this.step : null, - complete : F._afterZoomOut - }); - }, - - changeIn: function () { - var current = F.current, - effect = current.nextEffect, - startPos = current.pos, - endPos = { opacity : 1 }, - direction = F.direction, - distance = 200, - field; - - startPos.opacity = 0.1; - - if (effect === 'elastic') { - field = direction === 'down' || direction === 'up' ? 'top' : 'left'; - - if (direction === 'down' || direction === 'right') { - startPos[ field ] = getValue(getScalar(startPos[ field ]) - distance); - endPos[ field ] = '+=' + distance + 'px'; - - } else { - startPos[ field ] = getValue(getScalar(startPos[ field ]) + distance); - endPos[ field ] = '-=' + distance + 'px'; - } - } - - // Workaround for http://bugs.jquery.com/ticket/12273 - if (effect === 'none') { - F._afterZoomIn(); - - } else { - F.wrap.css(startPos).animate(endPos, { - duration : current.nextSpeed, - easing : current.nextEasing, - complete : function() { - // This helps FireFox to properly render the box - setTimeout(F._afterZoomIn, 20); - } - }); - } - }, - - changeOut: function () { - var previous = F.previous, - effect = previous.prevEffect, - endPos = { opacity : 0.1 }, - direction = F.direction, - distance = 200; - - if (effect === 'elastic') { - endPos[ direction === 'down' || direction === 'up' ? 'top' : 'left' ] = ( direction === 'up' || direction === 'left' ? '-' : '+' ) + '=' + distance + 'px'; - } - - previous.wrap.animate(endPos, { - duration : effect === 'none' ? 0 : previous.prevSpeed, - easing : previous.prevEasing, - complete : function () { - $(this).trigger('onReset').remove(); - } - }); - } - }; - - /* - * Overlay helper - */ - - F.helpers.overlay = { - defaults : { - closeClick : true, // if true, fancyBox will be closed when user clicks on the overlay - speedOut : 200, // duration of fadeOut animation - showEarly : true, // indicates if should be opened immediately or wait until the content is ready - css : {}, // custom CSS properties - locked : !isTouch, // if true, the content will be locked into overlay - fixed : true // if false, the overlay CSS position property will not be set to "fixed" - }, - - overlay : null, // current handle - fixed : false, // indicates if the overlay has position "fixed" - - // Public methods - create : function(opts) { - opts = $.extend({}, this.defaults, opts); - - if (this.overlay) { - this.close(); - } - - this.overlay = $('
').appendTo( 'body' ); - this.fixed = false; - - if (opts.fixed && F.defaults.fixed) { - this.overlay.addClass('fancybox-overlay-fixed'); - - this.fixed = true; - } - }, - - open : function(opts) { - var that = this; - - opts = $.extend({}, this.defaults, opts); - - if (this.overlay) { - this.overlay.unbind('.overlay').width('auto').height('auto'); - - } else { - this.create(opts); - } - - if (!this.fixed) { - W.bind('resize.overlay', $.proxy( this.update, this) ); - - this.update(); - } - - if (opts.closeClick) { - this.overlay.bind('click.overlay', function(e) { - if ($(e.target).hasClass('fancybox-overlay')) { - if (F.isActive) { - F.close(); - } else { - that.close(); - } - } - }); - } - - this.overlay.css( opts.css ).show(); - }, - - close : function() { - $('.fancybox-overlay').remove(); - - W.unbind('resize.overlay'); - - this.overlay = null; - - if (this.margin !== false) { - $('body').css('margin-right', this.margin); - - this.margin = false; - } - - if (this.el) { - this.el.removeClass('fancybox-lock'); - } - }, - - // Private, callbacks - - update : function () { - var width = '100%', offsetWidth; - - // Reset width/height so it will not mess - this.overlay.width(width).height('100%'); - - // jQuery does not return reliable result for IE - if ($.browser.msie) { - offsetWidth = Math.max(document.documentElement.offsetWidth, document.body.offsetWidth); - - if (D.width() > offsetWidth) { - width = D.width(); - } - - } else if (D.width() > W.width()) { - width = D.width(); - } - - this.overlay.width(width).height(D.height()); - }, - - // This is where we can manipulate DOM, because later it would cause iframes to reload - onReady : function (opts, obj) { - $('.fancybox-overlay').stop(true, true); - - if (!this.overlay) { - this.margin = D.height() > W.height() || $('body').css('overflow-y') === 'scroll' ? $('body').css('margin-right') : false; - this.el = document.all && !document.querySelector ? $('html') : $('body'); - - this.create(opts); - } - - if (opts.locked && this.fixed) { - obj.locked = this.overlay.append( obj.wrap ); - obj.fixed = false; - } - - if (opts.showEarly === true) { - this.beforeShow.apply(this, arguments); - } - }, - - beforeShow : function(opts, obj) { - if (obj.locked) { - this.el.addClass('fancybox-lock'); - - if (this.margin !== false) { - $('body').css('margin-right', getScalar( this.margin ) + obj.scrollbarWidth); - } - } - - this.open(opts); - }, - - onUpdate : function() { - if (!this.fixed) { - this.update(); - } - }, - - afterClose: function (opts) { - // Remove overlay if exists and fancyBox is not opening - // (e.g., it is not being open using afterClose callback) - if (this.overlay && !F.isActive) { - this.overlay.fadeOut(opts.speedOut, $.proxy( this.close, this )); - } - } - }; - - /* - * Title helper - */ - - F.helpers.title = { - defaults : { - type : 'float', // 'float', 'inside', 'outside' or 'over', - position : 'bottom' // 'top' or 'bottom' - }, - - beforeShow: function (opts) { - var current = F.current, - text = current.title, - type = opts.type, - title, - target; - - if ($.isFunction(text)) { - text = text.call(current.element, current); - } - - if (!isString(text) || $.trim(text) === '') { - return; - } - - title = $('
' + text + '
'); - - switch (type) { - case 'inside': - target = F.skin; - break; - - case 'outside': - target = F.wrap; - break; - - case 'over': - target = F.inner; - break; - - default: // 'float' - target = F.skin; - - title.appendTo('body'); - - if ($.browser.msie) { - title.width( title.width() ); - } - - title.wrapInner(''); - - //Increase bottom margin so this title will also fit into viewport - F.current.margin[2] += Math.abs( getScalar(title.css('margin-bottom')) ); - break; - } - - title[ (opts.position === 'top' ? 'prependTo' : 'appendTo') ](target); - } - }; - - // jQuery plugin initialization - $.fn.fancybox = function (options) { - var index, - that = $(this), - selector = this.selector || '', - run = function(e) { - var what = $(this).blur(), idx = index, relType, relVal; - - if (!(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey) && !what.is('.fancybox-wrap')) { - relType = options.groupAttr || 'data-fancybox-group'; - relVal = what.attr(relType); - - if (!relVal) { - relType = 'rel'; - relVal = what.get(0)[ relType ]; - } - - if (relVal && relVal !== '' && relVal !== 'nofollow') { - what = selector.length ? $(selector) : that; - what = what.filter('[' + relType + '="' + relVal + '"]'); - idx = what.index(this); - } - - options.index = idx; - - // Stop an event from bubbling if everything is fine - if (F.open(what, options) !== false) { - e.preventDefault(); - } - } - }; - - options = options || {}; - index = options.index || 0; - - if (!selector || options.live === false) { - that.unbind('click.fb-start').bind('click.fb-start', run); - - } else { - D.undelegate(selector, 'click.fb-start').delegate(selector + ":not('.fancybox-item, .fancybox-nav')", 'click.fb-start', run); - } - - this.filter('[data-fancybox-start=1]').trigger('click'); - - return this; - }; - - // Tests that need a body at doc ready - D.ready(function() { - if ( $.scrollbarWidth === undefined ) { - // http://benalman.com/projects/jquery-misc-plugins/#scrollbarwidth - $.scrollbarWidth = function() { - var parent = $('
').appendTo('body'), - child = parent.children(), - width = child.innerWidth() - child.height( 99 ).innerWidth(); - - parent.remove(); - - return width; - }; - } - - if ( $.support.fixedPosition === undefined ) { - $.support.fixedPosition = (function() { - var elem = $('
').appendTo('body'), - fixed = ( elem[0].offsetTop === 20 || elem[0].offsetTop === 15 ); - - elem.remove(); - - return fixed; - }()); - } - - $.extend(F.defaults, { - scrollbarWidth : $.scrollbarWidth(), - fixed : $.support.fixedPosition, - parent : $('body') - }); - }); - -}(window, document, jQuery)); \ No newline at end of file diff --git a/_static/fancybox/jquery.fancybox.pack.js b/_static/fancybox/jquery.fancybox.pack.js deleted file mode 100755 index 088b5c6..0000000 --- a/_static/fancybox/jquery.fancybox.pack.js +++ /dev/null @@ -1,45 +0,0 @@ -/*! fancyBox v2.1.3 fancyapps.com | fancyapps.com/fancybox/#license */ -(function(B,x,f,q){var r=f(B),m=f(x),b=f.fancybox=function(){b.open.apply(this,arguments)},u=null,n=x.createTouch!==q,s=function(a){return a&&a.hasOwnProperty&&a instanceof f},p=function(a){return a&&"string"===f.type(a)},E=function(a){return p(a)&&0
',image:'',iframe:'",error:'

The requested content cannot be loaded.
Please try again later.

',closeBtn:'',next:'',prev:''},openEffect:"fade",openSpeed:250,openEasing:"swing", -openOpacity:!0,openMethod:"zoomIn",closeEffect:"fade",closeSpeed:250,closeEasing:"swing",closeOpacity:!0,closeMethod:"zoomOut",nextEffect:"elastic",nextSpeed:250,nextEasing:"swing",nextMethod:"changeIn",prevEffect:"elastic",prevSpeed:250,prevEasing:"swing",prevMethod:"changeOut",helpers:{overlay:!0,title:!0},onCancel:f.noop,beforeLoad:f.noop,afterLoad:f.noop,beforeShow:f.noop,afterShow:f.noop,beforeChange:f.noop,beforeClose:f.noop,afterClose:f.noop},group:{},opts:{},previous:null,coming:null,current:null, -isActive:!1,isOpen:!1,isOpened:!1,wrap:null,skin:null,outer:null,inner:null,player:{timer:null,isActive:!1},ajaxLoad:null,imgPreload:null,transitions:{},helpers:{},open:function(a,d){if(a&&(f.isPlainObject(d)||(d={}),!1!==b.close(!0)))return f.isArray(a)||(a=s(a)?f(a).get():[a]),f.each(a,function(e,c){var j={},g,h,i,l,k;"object"===f.type(c)&&(c.nodeType&&(c=f(c)),s(c)?(j={href:c.data("fancybox-href")||c.attr("href"),title:c.data("fancybox-title")||c.attr("title"),isDom:!0,element:c},f.metadata&&f.extend(!0, -j,c.metadata())):j=c);g=d.href||j.href||(p(c)?c:null);h=d.title!==q?d.title:j.title||"";l=(i=d.content||j.content)?"html":d.type||j.type;!l&&j.isDom&&(l=c.data("fancybox-type"),l||(l=(l=c.prop("class").match(/fancybox\.(\w+)/))?l[1]:null));p(g)&&(l||(b.isImage(g)?l="image":b.isSWF(g)?l="swf":"#"===g.charAt(0)?l="inline":p(c)&&(l="html",i=c)),"ajax"===l&&(k=g.split(/\s+/,2),g=k.shift(),k=k.shift()));i||("inline"===l?g?i=f(p(g)?g.replace(/.*(?=#[^\s]+$)/,""):g):j.isDom&&(i=c):"html"===l?i=g:!l&&(!g&& -j.isDom)&&(l="inline",i=c));f.extend(j,{href:g,type:l,content:i,title:h,selector:k});a[e]=j}),b.opts=f.extend(!0,{},b.defaults,d),d.keys!==q&&(b.opts.keys=d.keys?f.extend({},b.defaults.keys,d.keys):!1),b.group=a,b._start(b.opts.index)},cancel:function(){var a=b.coming;a&&!1!==b.trigger("onCancel")&&(b.hideLoading(),b.ajaxLoad&&b.ajaxLoad.abort(),b.ajaxLoad=null,b.imgPreload&&(b.imgPreload.onload=b.imgPreload.onerror=null),a.wrap&&a.wrap.stop(!0,!0).trigger("onReset").remove(),b.coming=null,b.current|| -b._afterZoomOut(a))},close:function(a){b.cancel();!1!==b.trigger("beforeClose")&&(b.unbindEvents(),b.isActive&&(!b.isOpen||!0===a?(f(".fancybox-wrap").stop(!0).trigger("onReset").remove(),b._afterZoomOut()):(b.isOpen=b.isOpened=!1,b.isClosing=!0,f(".fancybox-item, .fancybox-nav").remove(),b.wrap.stop(!0,!0).removeClass("fancybox-opened"),b.transitions[b.current.closeMethod]())))},play:function(a){var d=function(){clearTimeout(b.player.timer)},e=function(){d();b.current&&b.player.isActive&&(b.player.timer= -setTimeout(b.next,b.current.playSpeed))},c=function(){d();f("body").unbind(".player");b.player.isActive=!1;b.trigger("onPlayEnd")};if(!0===a||!b.player.isActive&&!1!==a){if(b.current&&(b.current.loop||b.current.index=c.index?"next":"prev"],b.router=e||"jumpto",c.loop&&(0>a&&(a=c.group.length+a%c.group.length),a%=c.group.length),c.group[a]!==q&&(b.cancel(),b._start(a)))},reposition:function(a,d){var e=b.current,c=e?e.wrap:null,j;c&&(j=b._getPosition(d),a&&"scroll"===a.type?(delete j.position,c.stop(!0,!0).animate(j,200)):(c.css(j),e.pos=f.extend({}, -e.dim,j)))},update:function(a){var d=a&&a.type,e=!d||"orientationchange"===d;e&&(clearTimeout(u),u=null);b.isOpen&&!u&&(u=setTimeout(function(){var c=b.current;c&&!b.isClosing&&(b.wrap.removeClass("fancybox-tmp"),(e||"load"===d||"resize"===d&&c.autoResize)&&b._setDimension(),"scroll"===d&&c.canShrink||b.reposition(a),b.trigger("onUpdate"),u=null)},e&&!n?0:300))},toggle:function(a){b.isOpen&&(b.current.fitToView="boolean"===f.type(a)?a:!b.current.fitToView,n&&(b.wrap.removeAttr("style").addClass("fancybox-tmp"), -b.trigger("onUpdate")),b.update())},hideLoading:function(){m.unbind(".loading");f("#fancybox-loading").remove()},showLoading:function(){var a,d;b.hideLoading();a=f('
').click(b.cancel).appendTo("body");m.bind("keydown.loading",function(a){if(27===(a.which||a.keyCode))a.preventDefault(),b.cancel()});b.defaults.fixed||(d=b.getViewport(),a.css({position:"absolute",top:0.5*d.h+d.y,left:0.5*d.w+d.x}))},getViewport:function(){var a=b.current&&b.current.locked|| -!1,d={x:r.scrollLeft(),y:r.scrollTop()};a?(d.w=a[0].clientWidth,d.h=a[0].clientHeight):(d.w=n&&B.innerWidth?B.innerWidth:r.width(),d.h=n&&B.innerHeight?B.innerHeight:r.height());return d},unbindEvents:function(){b.wrap&&s(b.wrap)&&b.wrap.unbind(".fb");m.unbind(".fb");r.unbind(".fb")},bindEvents:function(){var a=b.current,d;a&&(r.bind("orientationchange.fb"+(n?"":" resize.fb")+(a.autoCenter&&!a.locked?" scroll.fb":""),b.update),(d=a.keys)&&m.bind("keydown.fb",function(e){var c=e.which||e.keyCode,j= -e.target||e.srcElement;if(27===c&&b.coming)return!1;!e.ctrlKey&&(!e.altKey&&!e.shiftKey&&!e.metaKey&&(!j||!j.type&&!f(j).is("[contenteditable]")))&&f.each(d,function(d,j){if(1h[0].clientWidth||h[0].clientHeight&&h[0].scrollHeight>h[0].clientHeight),h=f(h).parent();if(0!==c&&!i&&1g||0>j)b.next(0>g?"up":"right");d.preventDefault()}}))},trigger:function(a,d){var e,c=d||b.coming||b.current;if(c){f.isFunction(c[a])&&(e=c[a].apply(c,Array.prototype.slice.call(arguments,1)));if(!1===e)return!1;c.helpers&&f.each(c.helpers,function(d, -e){e&&(b.helpers[d]&&f.isFunction(b.helpers[d][a]))&&(e=f.extend(!0,{},b.helpers[d].defaults,e),b.helpers[d][a](e,c))});f.event.trigger(a+".fb")}},isImage:function(a){return p(a)&&a.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp)((\?|#).*)?$)/i)},isSWF:function(a){return p(a)&&a.match(/\.(swf)((\?|#).*)?$/i)},_start:function(a){var d={},e,c,a=k(a);e=b.group[a]||null;if(!e)return!1;d=f.extend(!0,{},b.opts,e);e=d.margin;c=d.padding;"number"===f.type(e)&&(d.margin=[e,e,e,e]);"number"===f.type(c)&& -(d.padding=[c,c,c,c]);d.modal&&f.extend(!0,d,{closeBtn:!1,closeClick:!1,nextClick:!1,arrows:!1,mouseWheel:!1,keys:null,helpers:{overlay:{closeClick:!1}}});d.autoSize&&(d.autoWidth=d.autoHeight=!0);"auto"===d.width&&(d.autoWidth=!0);"auto"===d.height&&(d.autoHeight=!0);d.group=b.group;d.index=a;b.coming=d;if(!1===b.trigger("beforeLoad"))b.coming=null;else{c=d.type;e=d.href;if(!c)return b.coming=null,b.current&&b.router&&"jumpto"!==b.router?(b.current.index=a,b[b.router](b.direction)):!1;b.isActive= -!0;if("image"===c||"swf"===c)d.autoHeight=d.autoWidth=!1,d.scrolling="visible";"image"===c&&(d.aspectRatio=!0);"iframe"===c&&n&&(d.scrolling="scroll");d.wrap=f(d.tpl.wrap).addClass("fancybox-"+(n?"mobile":"desktop")+" fancybox-type-"+c+" fancybox-tmp "+d.wrapCSS).appendTo(d.parent||"body");f.extend(d,{skin:f(".fancybox-skin",d.wrap),outer:f(".fancybox-outer",d.wrap),inner:f(".fancybox-inner",d.wrap)});f.each(["Top","Right","Bottom","Left"],function(a,b){d.skin.css("padding"+b,v(d.padding[a]))});b.trigger("onReady"); -if("inline"===c||"html"===c){if(!d.content||!d.content.length)return b._error("content")}else if(!e)return b._error("href");"image"===c?b._loadImage():"ajax"===c?b._loadAjax():"iframe"===c?b._loadIframe():b._afterLoad()}},_error:function(a){f.extend(b.coming,{type:"html",autoWidth:!0,autoHeight:!0,minWidth:0,minHeight:0,scrolling:"no",hasError:a,content:b.coming.tpl.error});b._afterLoad()},_loadImage:function(){var a=b.imgPreload=new Image;a.onload=function(){this.onload=this.onerror=null;b.coming.width= -this.width;b.coming.height=this.height;b._afterLoad()};a.onerror=function(){this.onload=this.onerror=null;b._error("image")};a.src=b.coming.href;!0!==a.complete&&b.showLoading()},_loadAjax:function(){var a=b.coming;b.showLoading();b.ajaxLoad=f.ajax(f.extend({},a.ajax,{url:a.href,error:function(a,e){b.coming&&"abort"!==e?b._error("ajax",a):b.hideLoading()},success:function(d,e){"success"===e&&(a.content=d,b._afterLoad())}}))},_loadIframe:function(){var a=b.coming,d=f(a.tpl.iframe.replace(/\{rnd\}/g, -(new Date).getTime())).attr("scrolling",n?"auto":a.iframe.scrolling).attr("src",a.href);f(a.wrap).bind("onReset",function(){try{f(this).find("iframe").hide().attr("src","//about:blank").end().empty()}catch(a){}});a.iframe.preload&&(b.showLoading(),d.one("load",function(){f(this).data("ready",1);n||f(this).bind("load.fb",b.update);f(this).parents(".fancybox-wrap").width("100%").removeClass("fancybox-tmp").show();b._afterLoad()}));a.content=d.appendTo(a.inner);a.iframe.preload||b._afterLoad()},_preloadImages:function(){var a= -b.group,d=b.current,e=a.length,c=d.preload?Math.min(d.preload,e-1):0,f,g;for(g=1;g<=c;g+=1)f=a[(d.index+g)%e],"image"===f.type&&f.href&&((new Image).src=f.href)},_afterLoad:function(){var a=b.coming,d=b.current,e,c,j,g,h;b.hideLoading();if(a&&!1!==b.isActive)if(!1===b.trigger("afterLoad",a,d))a.wrap.stop(!0).trigger("onReset").remove(),b.coming=null;else{d&&(b.trigger("beforeChange",d),d.wrap.stop(!0).removeClass("fancybox-opened").find(".fancybox-item, .fancybox-nav").remove());b.unbindEvents(); -e=a.content;c=a.type;j=a.scrolling;f.extend(b,{wrap:a.wrap,skin:a.skin,outer:a.outer,inner:a.inner,current:a,previous:d});g=a.href;switch(c){case "inline":case "ajax":case "html":a.selector?e=f("
").html(e).find(a.selector):s(e)&&(e.data("fancybox-placeholder")||e.data("fancybox-placeholder",f('
').insertAfter(e).hide()),e=e.show().detach(),a.wrap.bind("onReset",function(){f(this).find(e).length&&e.hide().replaceAll(e.data("fancybox-placeholder")).data("fancybox-placeholder", -!1)}));break;case "image":e=a.tpl.image.replace("{href}",g);break;case "swf":e='',h="",f.each(a.swf,function(a,b){e+='';h+=" "+a+'="'+b+'"'}),e+='"}(!s(e)||!e.parent().is(a.inner))&&a.inner.append(e);b.trigger("beforeShow"); -a.inner.css("overflow","yes"===j?"scroll":"no"===j?"hidden":j);b._setDimension();b.reposition();b.isOpen=!1;b.coming=null;b.bindEvents();if(b.isOpened){if(d.prevMethod)b.transitions[d.prevMethod]()}else f(".fancybox-wrap").not(a.wrap).stop(!0).trigger("onReset").remove();b.transitions[b.isOpened?a.nextMethod:a.openMethod]();b._preloadImages()}},_setDimension:function(){var a=b.getViewport(),d=0,e=!1,c=!1,e=b.wrap,j=b.skin,g=b.inner,h=b.current,c=h.width,i=h.height,l=h.minWidth,t=h.minHeight,m=h.maxWidth, -n=h.maxHeight,r=h.scrolling,p=h.scrollOutside?h.scrollbarWidth:0,w=h.margin,y=k(w[1]+w[3]),q=k(w[0]+w[2]),x,z,s,C,A,F,B,D,u;e.add(j).add(g).width("auto").height("auto").removeClass("fancybox-tmp");w=k(j.outerWidth(!0)-j.width());x=k(j.outerHeight(!0)-j.height());z=y+w;s=q+x;C=E(c)?(a.w-z)*k(c)/100:c;A=E(i)?(a.h-s)*k(i)/100:i;if("iframe"===h.type){if(u=h.content,h.autoHeight&&1===u.data("ready"))try{u[0].contentWindow.document.location&&(g.width(C).height(9999),F=u.contents().find("body"),p&&F.css("overflow-x", -"hidden"),A=F.height())}catch(G){}}else if(h.autoWidth||h.autoHeight)g.addClass("fancybox-tmp"),h.autoWidth||g.width(C),h.autoHeight||g.height(A),h.autoWidth&&(C=g.width()),h.autoHeight&&(A=g.height()),g.removeClass("fancybox-tmp");c=k(C);i=k(A);D=C/A;l=k(E(l)?k(l,"w")-z:l);m=k(E(m)?k(m,"w")-z:m);t=k(E(t)?k(t,"h")-s:t);n=k(E(n)?k(n,"h")-s:n);F=m;B=n;h.fitToView&&(m=Math.min(a.w-z,m),n=Math.min(a.h-s,n));z=a.w-y;q=a.h-q;h.aspectRatio?(c>m&&(c=m,i=k(c/D)),i>n&&(i=n,c=k(i*D)),cz||y>q)&&(c>l&&i>t)&&!(19m&&(c=m,i=k(c/D)),g.width(c).height(i),e.width(c+w),a=e.width(),y=e.height();else c=Math.max(l,Math.min(c,c-(a-z))),i=Math.max(t,Math.min(i,i-(y-q)));p&&("auto"===r&&iz||y>q)&&c>l&&i>t;c=h.aspectRatio?ct&&i
').appendTo("body");this.fixed=!1;a.fixed&&b.defaults.fixed&&(this.overlay.addClass("fancybox-overlay-fixed"),this.fixed=!0)},open:function(a){var d=this,a=f.extend({},this.defaults,a);this.overlay?this.overlay.unbind(".overlay").width("auto").height("auto"):this.create(a);this.fixed||(r.bind("resize.overlay",f.proxy(this.update,this)),this.update());a.closeClick&&this.overlay.bind("click.overlay",function(a){f(a.target).hasClass("fancybox-overlay")&& -(b.isActive?b.close():d.close())});this.overlay.css(a.css).show()},close:function(){f(".fancybox-overlay").remove();r.unbind("resize.overlay");this.overlay=null;!1!==this.margin&&(f("body").css("margin-right",this.margin),this.margin=!1);this.el&&this.el.removeClass("fancybox-lock")},update:function(){var a="100%",b;this.overlay.width(a).height("100%");f.browser.msie?(b=Math.max(x.documentElement.offsetWidth,x.body.offsetWidth),m.width()>b&&(a=m.width())):m.width()>r.width()&&(a=m.width());this.overlay.width(a).height(m.height())}, -onReady:function(a,b){f(".fancybox-overlay").stop(!0,!0);this.overlay||(this.margin=m.height()>r.height()||"scroll"===f("body").css("overflow-y")?f("body").css("margin-right"):!1,this.el=x.all&&!x.querySelector?f("html"):f("body"),this.create(a));a.locked&&this.fixed&&(b.locked=this.overlay.append(b.wrap),b.fixed=!1);!0===a.showEarly&&this.beforeShow.apply(this,arguments)},beforeShow:function(a,b){b.locked&&(this.el.addClass("fancybox-lock"),!1!==this.margin&&f("body").css("margin-right",k(this.margin)+ -b.scrollbarWidth));this.open(a)},onUpdate:function(){this.fixed||this.update()},afterClose:function(a){this.overlay&&!b.isActive&&this.overlay.fadeOut(a.speedOut,f.proxy(this.close,this))}};b.helpers.title={defaults:{type:"float",position:"bottom"},beforeShow:function(a){var d=b.current,e=d.title,c=a.type;f.isFunction(e)&&(e=e.call(d.element,d));if(p(e)&&""!==f.trim(e)){d=f('
'+e+"
");switch(c){case "inside":c=b.skin;break;case "outside":c= -b.wrap;break;case "over":c=b.inner;break;default:c=b.skin,d.appendTo("body"),f.browser.msie&&d.width(d.width()),d.wrapInner(''),b.current.margin[2]+=Math.abs(k(d.css("margin-bottom")))}d["top"===a.position?"prependTo":"appendTo"](c)}}};f.fn.fancybox=function(a){var d,e=f(this),c=this.selector||"",j=function(g){var h=f(this).blur(),i=d,j,k;!g.ctrlKey&&(!g.altKey&&!g.shiftKey&&!g.metaKey)&&!h.is(".fancybox-wrap")&&(j=a.groupAttr||"data-fancybox-group",k=h.attr(j),k||(j="rel", -k=h.get(0)[j]),k&&(""!==k&&"nofollow"!==k)&&(h=c.length?f(c):e,h=h.filter("["+j+'="'+k+'"]'),i=h.index(this)),a.index=i,!1!==b.open(h,a)&&g.preventDefault())},a=a||{};d=a.index||0;!c||!1===a.live?e.unbind("click.fb-start").bind("click.fb-start",j):m.undelegate(c,"click.fb-start").delegate(c+":not('.fancybox-item, .fancybox-nav')","click.fb-start",j);this.filter("[data-fancybox-start=1]").trigger("click");return this};m.ready(function(){f.scrollbarWidth===q&&(f.scrollbarWidth=function(){var a=f('
').appendTo("body"), -b=a.children(),b=b.innerWidth()-b.height(99).innerWidth();a.remove();return b});if(f.support.fixedPosition===q){var a=f.support,d=f('
').appendTo("body"),e=20===d[0].offsetTop||15===d[0].offsetTop;d.remove();a.fixedPosition=e}f.extend(b.defaults,{scrollbarWidth:f.scrollbarWidth(),fixed:f.support.fixedPosition,parent:f("body")})})})(window,document,jQuery); \ No newline at end of file diff --git a/_static/fancybox/jquery.mousewheel-3.0.6.pack.js b/_static/fancybox/jquery.mousewheel-3.0.6.pack.js deleted file mode 100644 index e39a83a..0000000 --- a/_static/fancybox/jquery.mousewheel-3.0.6.pack.js +++ /dev/null @@ -1,13 +0,0 @@ -/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) - * Licensed under the MIT License (LICENSE.txt). - * - * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. - * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. - * Thanks to: Seamus Leahy for adding deltaX and deltaY - * - * Version: 3.0.6 - * - * Requires: 1.2.2+ - */ -(function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;b.axis!==void 0&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);b.wheelDeltaY!==void 0&&(g=b.wheelDeltaY/120);b.wheelDeltaX!==void 0&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]= -d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,false);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery); \ No newline at end of file diff --git a/_static/favicon.ico b/_static/favicon.ico deleted file mode 100644 index 4e32375..0000000 Binary files a/_static/favicon.ico and /dev/null differ diff --git a/_static/file.png b/_static/file.png deleted file mode 100644 index d18082e..0000000 Binary files a/_static/file.png and /dev/null differ diff --git a/_static/ipy_0.11.png b/_static/ipy_0.11.png deleted file mode 100644 index 56d952a..0000000 Binary files a/_static/ipy_0.11.png and /dev/null differ diff --git a/_static/ipy_0.12.png b/_static/ipy_0.12.png deleted file mode 100644 index 9f2a5f6..0000000 Binary files a/_static/ipy_0.12.png and /dev/null differ diff --git a/_static/ipy_0.13.png b/_static/ipy_0.13.png deleted file mode 100644 index eb5ef2b..0000000 Binary files a/_static/ipy_0.13.png and /dev/null differ diff --git a/_static/ipython-book.jpg b/_static/ipython-book.jpg deleted file mode 100644 index 80838f9..0000000 Binary files a/_static/ipython-book.jpg and /dev/null differ diff --git a/_static/ipython.css b/_static/ipython.css deleted file mode 100644 index e9799a7..0000000 --- a/_static/ipython.css +++ /dev/null @@ -1,27 +0,0 @@ -/* Extra styles for the IPython website - */ - -/* Used to make a box with side-by-side Ohloh.net buttons */ -#ohloh { - padding: 0; -} - -#ohloh-use { - float: left; -} - -#ohloh-stats { - float: right; - margin: 3px 0px 0px 0px; -} - -/* A simple div to flush previously-set attributes that may mess up layout further down if they are kept unmodified. - */ -.clear { - height: 0; - font-size: 1px; - margin: 0; - padding: 0; - line-height: 0; - clear: both; -} diff --git a/_static/jquery.js b/_static/jquery.js deleted file mode 100644 index bc3fbc8..0000000 --- a/_static/jquery.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v1.8.2 jquery.com | jquery.org/license */ -(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write(""),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b
a",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="
t
",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="
",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;be.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="
",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="

",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b0)for(e=d;e=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*\s*$/g,bz={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X
","
"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1>");try{for(;d1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]===""&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("
").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/_static/minus.png b/_static/minus.png deleted file mode 100644 index da1c562..0000000 Binary files a/_static/minus.png and /dev/null differ diff --git a/_static/plus.png b/_static/plus.png deleted file mode 100644 index b3cb374..0000000 Binary files a/_static/plus.png and /dev/null differ diff --git a/_static/pygments.css b/_static/pygments.css deleted file mode 100644 index d79caa1..0000000 --- a/_static/pygments.css +++ /dev/null @@ -1,62 +0,0 @@ -.highlight .hll { background-color: #ffffcc } -.highlight { background: #eeffcc; } -.highlight .c { color: #408090; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #007020; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #007020 } /* Comment.Preproc */ -.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #333333 } /* Generic.Output */ -.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0044DD } /* Generic.Traceback */ -.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #007020 } /* Keyword.Pseudo */ -.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #902000 } /* Keyword.Type */ -.highlight .m { color: #208050 } /* Literal.Number */ -.highlight .s { color: #4070a0 } /* Literal.String */ -.highlight .na { color: #4070a0 } /* Name.Attribute */ -.highlight .nb { color: #007020 } /* Name.Builtin */ -.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ -.highlight .no { color: #60add5 } /* Name.Constant */ -.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ -.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #007020 } /* Name.Exception */ -.highlight .nf { color: #06287e } /* Name.Function */ -.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ -.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #bb60d5 } /* Name.Variable */ -.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mf { color: #208050 } /* Literal.Number.Float */ -.highlight .mh { color: #208050 } /* Literal.Number.Hex */ -.highlight .mi { color: #208050 } /* Literal.Number.Integer */ -.highlight .mo { color: #208050 } /* Literal.Number.Oct */ -.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ -.highlight .sc { color: #4070a0 } /* Literal.String.Char */ -.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ -.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ -.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ -.highlight .sx { color: #c65d09 } /* Literal.String.Other */ -.highlight .sr { color: #235388 } /* Literal.String.Regex */ -.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ -.highlight .ss { color: #517918 } /* Literal.String.Symbol */ -.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ -.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ -.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ -.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/screenshots/ipython-notebook-thumb.png b/_static/screenshots/ipython-notebook-thumb.png deleted file mode 100644 index b10683b..0000000 Binary files a/_static/screenshots/ipython-notebook-thumb.png and /dev/null differ diff --git a/_static/screenshots/ipython-notebook.png b/_static/screenshots/ipython-notebook.png deleted file mode 100644 index ab37f6c..0000000 Binary files a/_static/screenshots/ipython-notebook.png and /dev/null differ diff --git a/_static/screenshots/ipython-qtconsole-thumb.png b/_static/screenshots/ipython-qtconsole-thumb.png deleted file mode 100644 index a7f92e4..0000000 Binary files a/_static/screenshots/ipython-qtconsole-thumb.png and /dev/null differ diff --git a/_static/screenshots/ipython-qtconsole.png b/_static/screenshots/ipython-qtconsole.png deleted file mode 100644 index cc6cc80..0000000 Binary files a/_static/screenshots/ipython-qtconsole.png and /dev/null differ diff --git a/_static/screenshots/ipython-terminal-thumb.png b/_static/screenshots/ipython-terminal-thumb.png deleted file mode 100644 index 1874f4c..0000000 Binary files a/_static/screenshots/ipython-terminal-thumb.png and /dev/null differ diff --git a/_static/screenshots/ipython-terminal.png b/_static/screenshots/ipython-terminal.png deleted file mode 100644 index 8c2cdd0..0000000 Binary files a/_static/screenshots/ipython-terminal.png and /dev/null differ diff --git a/_static/sloangrant/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png b/_static/sloangrant/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png deleted file mode 100644 index 15c7500..0000000 Binary files a/_static/sloangrant/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png and /dev/null differ diff --git a/_static/underscore.js b/_static/underscore.js deleted file mode 100644 index 5b55f32..0000000 --- a/_static/underscore.js +++ /dev/null @@ -1,31 +0,0 @@ -// Underscore.js 1.3.1 -// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore is freely distributable under the MIT license. -// Portions of Underscore are inspired or borrowed from Prototype, -// Oliver Steele's Functional, and John Resig's Micro-Templating. -// For all details and documentation: -// http://documentcloud.github.com/underscore -(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== -c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c, -h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each= -b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a== -null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect= -function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e= -e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= -function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a, -c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}}; -b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments, -1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)}; -b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"}; -b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a), -function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+ -u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]= -function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain= -true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); diff --git a/_static/up-pressed.png b/_static/up-pressed.png deleted file mode 100644 index 8bd587a..0000000 Binary files a/_static/up-pressed.png and /dev/null differ diff --git a/_static/up.png b/_static/up.png deleted file mode 100644 index b946256..0000000 Binary files a/_static/up.png and /dev/null differ diff --git a/_static/websupport.js b/_static/websupport.js deleted file mode 100644 index 19fcda5..0000000 --- a/_static/websupport.js +++ /dev/null @@ -1,808 +0,0 @@ -/* - * websupport.js - * ~~~~~~~~~~~~~ - * - * sphinx.websupport utilties for all documentation. - * - * :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -(function($) { - $.fn.autogrow = function() { - return this.each(function() { - var textarea = this; - - $.fn.autogrow.resize(textarea); - - $(textarea) - .focus(function() { - textarea.interval = setInterval(function() { - $.fn.autogrow.resize(textarea); - }, 500); - }) - .blur(function() { - clearInterval(textarea.interval); - }); - }); - }; - - $.fn.autogrow.resize = function(textarea) { - var lineHeight = parseInt($(textarea).css('line-height'), 10); - var lines = textarea.value.split('\n'); - var columns = textarea.cols; - var lineCount = 0; - $.each(lines, function() { - lineCount += Math.ceil(this.length / columns) || 1; - }); - var height = lineHeight * (lineCount + 1); - $(textarea).css('height', height); - }; -})(jQuery); - -(function($) { - var comp, by; - - function init() { - initEvents(); - initComparator(); - } - - function initEvents() { - $('a.comment-close').live("click", function(event) { - event.preventDefault(); - hide($(this).attr('id').substring(2)); - }); - $('a.vote').live("click", function(event) { - event.preventDefault(); - handleVote($(this)); - }); - $('a.reply').live("click", function(event) { - event.preventDefault(); - openReply($(this).attr('id').substring(2)); - }); - $('a.close-reply').live("click", function(event) { - event.preventDefault(); - closeReply($(this).attr('id').substring(2)); - }); - $('a.sort-option').live("click", function(event) { - event.preventDefault(); - handleReSort($(this)); - }); - $('a.show-proposal').live("click", function(event) { - event.preventDefault(); - showProposal($(this).attr('id').substring(2)); - }); - $('a.hide-proposal').live("click", function(event) { - event.preventDefault(); - hideProposal($(this).attr('id').substring(2)); - }); - $('a.show-propose-change').live("click", function(event) { - event.preventDefault(); - showProposeChange($(this).attr('id').substring(2)); - }); - $('a.hide-propose-change').live("click", function(event) { - event.preventDefault(); - hideProposeChange($(this).attr('id').substring(2)); - }); - $('a.accept-comment').live("click", function(event) { - event.preventDefault(); - acceptComment($(this).attr('id').substring(2)); - }); - $('a.delete-comment').live("click", function(event) { - event.preventDefault(); - deleteComment($(this).attr('id').substring(2)); - }); - $('a.comment-markup').live("click", function(event) { - event.preventDefault(); - toggleCommentMarkupBox($(this).attr('id').substring(2)); - }); - } - - /** - * Set comp, which is a comparator function used for sorting and - * inserting comments into the list. - */ - function setComparator() { - // If the first three letters are "asc", sort in ascending order - // and remove the prefix. - if (by.substring(0,3) == 'asc') { - var i = by.substring(3); - comp = function(a, b) { return a[i] - b[i]; }; - } else { - // Otherwise sort in descending order. - comp = function(a, b) { return b[by] - a[by]; }; - } - - // Reset link styles and format the selected sort option. - $('a.sel').attr('href', '#').removeClass('sel'); - $('a.by' + by).removeAttr('href').addClass('sel'); - } - - /** - * Create a comp function. If the user has preferences stored in - * the sortBy cookie, use those, otherwise use the default. - */ - function initComparator() { - by = 'rating'; // Default to sort by rating. - // If the sortBy cookie is set, use that instead. - if (document.cookie.length > 0) { - var start = document.cookie.indexOf('sortBy='); - if (start != -1) { - start = start + 7; - var end = document.cookie.indexOf(";", start); - if (end == -1) { - end = document.cookie.length; - by = unescape(document.cookie.substring(start, end)); - } - } - } - setComparator(); - } - - /** - * Show a comment div. - */ - function show(id) { - $('#ao' + id).hide(); - $('#ah' + id).show(); - var context = $.extend({id: id}, opts); - var popup = $(renderTemplate(popupTemplate, context)).hide(); - popup.find('textarea[name="proposal"]').hide(); - popup.find('a.by' + by).addClass('sel'); - var form = popup.find('#cf' + id); - form.submit(function(event) { - event.preventDefault(); - addComment(form); - }); - $('#s' + id).after(popup); - popup.slideDown('fast', function() { - getComments(id); - }); - } - - /** - * Hide a comment div. - */ - function hide(id) { - $('#ah' + id).hide(); - $('#ao' + id).show(); - var div = $('#sc' + id); - div.slideUp('fast', function() { - div.remove(); - }); - } - - /** - * Perform an ajax request to get comments for a node - * and insert the comments into the comments tree. - */ - function getComments(id) { - $.ajax({ - type: 'GET', - url: opts.getCommentsURL, - data: {node: id}, - success: function(data, textStatus, request) { - var ul = $('#cl' + id); - var speed = 100; - $('#cf' + id) - .find('textarea[name="proposal"]') - .data('source', data.source); - - if (data.comments.length === 0) { - ul.html('
  • No comments yet.
  • '); - ul.data('empty', true); - } else { - // If there are comments, sort them and put them in the list. - var comments = sortComments(data.comments); - speed = data.comments.length * 100; - appendComments(comments, ul); - ul.data('empty', false); - } - $('#cn' + id).slideUp(speed + 200); - ul.slideDown(speed); - }, - error: function(request, textStatus, error) { - showError('Oops, there was a problem retrieving the comments.'); - }, - dataType: 'json' - }); - } - - /** - * Add a comment via ajax and insert the comment into the comment tree. - */ - function addComment(form) { - var node_id = form.find('input[name="node"]').val(); - var parent_id = form.find('input[name="parent"]').val(); - var text = form.find('textarea[name="comment"]').val(); - var proposal = form.find('textarea[name="proposal"]').val(); - - if (text == '') { - showError('Please enter a comment.'); - return; - } - - // Disable the form that is being submitted. - form.find('textarea,input').attr('disabled', 'disabled'); - - // Send the comment to the server. - $.ajax({ - type: "POST", - url: opts.addCommentURL, - dataType: 'json', - data: { - node: node_id, - parent: parent_id, - text: text, - proposal: proposal - }, - success: function(data, textStatus, error) { - // Reset the form. - if (node_id) { - hideProposeChange(node_id); - } - form.find('textarea') - .val('') - .add(form.find('input')) - .removeAttr('disabled'); - var ul = $('#cl' + (node_id || parent_id)); - if (ul.data('empty')) { - $(ul).empty(); - ul.data('empty', false); - } - insertComment(data.comment); - var ao = $('#ao' + node_id); - ao.find('img').attr({'src': opts.commentBrightImage}); - if (node_id) { - // if this was a "root" comment, remove the commenting box - // (the user can get it back by reopening the comment popup) - $('#ca' + node_id).slideUp(); - } - }, - error: function(request, textStatus, error) { - form.find('textarea,input').removeAttr('disabled'); - showError('Oops, there was a problem adding the comment.'); - } - }); - } - - /** - * Recursively append comments to the main comment list and children - * lists, creating the comment tree. - */ - function appendComments(comments, ul) { - $.each(comments, function() { - var div = createCommentDiv(this); - ul.append($(document.createElement('li')).html(div)); - appendComments(this.children, div.find('ul.comment-children')); - // To avoid stagnating data, don't store the comments children in data. - this.children = null; - div.data('comment', this); - }); - } - - /** - * After adding a new comment, it must be inserted in the correct - * location in the comment tree. - */ - function insertComment(comment) { - var div = createCommentDiv(comment); - - // To avoid stagnating data, don't store the comments children in data. - comment.children = null; - div.data('comment', comment); - - var ul = $('#cl' + (comment.node || comment.parent)); - var siblings = getChildren(ul); - - var li = $(document.createElement('li')); - li.hide(); - - // Determine where in the parents children list to insert this comment. - for(i=0; i < siblings.length; i++) { - if (comp(comment, siblings[i]) <= 0) { - $('#cd' + siblings[i].id) - .parent() - .before(li.html(div)); - li.slideDown('fast'); - return; - } - } - - // If we get here, this comment rates lower than all the others, - // or it is the only comment in the list. - ul.append(li.html(div)); - li.slideDown('fast'); - } - - function acceptComment(id) { - $.ajax({ - type: 'POST', - url: opts.acceptCommentURL, - data: {id: id}, - success: function(data, textStatus, request) { - $('#cm' + id).fadeOut('fast'); - $('#cd' + id).removeClass('moderate'); - }, - error: function(request, textStatus, error) { - showError('Oops, there was a problem accepting the comment.'); - } - }); - } - - function deleteComment(id) { - $.ajax({ - type: 'POST', - url: opts.deleteCommentURL, - data: {id: id}, - success: function(data, textStatus, request) { - var div = $('#cd' + id); - if (data == 'delete') { - // Moderator mode: remove the comment and all children immediately - div.slideUp('fast', function() { - div.remove(); - }); - return; - } - // User mode: only mark the comment as deleted - div - .find('span.user-id:first') - .text('[deleted]').end() - .find('div.comment-text:first') - .text('[deleted]').end() - .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + - ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) - .remove(); - var comment = div.data('comment'); - comment.username = '[deleted]'; - comment.text = '[deleted]'; - div.data('comment', comment); - }, - error: function(request, textStatus, error) { - showError('Oops, there was a problem deleting the comment.'); - } - }); - } - - function showProposal(id) { - $('#sp' + id).hide(); - $('#hp' + id).show(); - $('#pr' + id).slideDown('fast'); - } - - function hideProposal(id) { - $('#hp' + id).hide(); - $('#sp' + id).show(); - $('#pr' + id).slideUp('fast'); - } - - function showProposeChange(id) { - $('#pc' + id).hide(); - $('#hc' + id).show(); - var textarea = $('#pt' + id); - textarea.val(textarea.data('source')); - $.fn.autogrow.resize(textarea[0]); - textarea.slideDown('fast'); - } - - function hideProposeChange(id) { - $('#hc' + id).hide(); - $('#pc' + id).show(); - var textarea = $('#pt' + id); - textarea.val('').removeAttr('disabled'); - textarea.slideUp('fast'); - } - - function toggleCommentMarkupBox(id) { - $('#mb' + id).toggle(); - } - - /** Handle when the user clicks on a sort by link. */ - function handleReSort(link) { - var classes = link.attr('class').split(/\s+/); - for (var i=0; iThank you! Your comment will show up ' - + 'once it is has been approved by a moderator.
    '); - } - // Prettify the comment rating. - comment.pretty_rating = comment.rating + ' point' + - (comment.rating == 1 ? '' : 's'); - // Make a class (for displaying not yet moderated comments differently) - comment.css_class = comment.displayed ? '' : ' moderate'; - // Create a div for this comment. - var context = $.extend({}, opts, comment); - var div = $(renderTemplate(commentTemplate, context)); - - // If the user has voted on this comment, highlight the correct arrow. - if (comment.vote) { - var direction = (comment.vote == 1) ? 'u' : 'd'; - div.find('#' + direction + 'v' + comment.id).hide(); - div.find('#' + direction + 'u' + comment.id).show(); - } - - if (opts.moderator || comment.text != '[deleted]') { - div.find('a.reply').show(); - if (comment.proposal_diff) - div.find('#sp' + comment.id).show(); - if (opts.moderator && !comment.displayed) - div.find('#cm' + comment.id).show(); - if (opts.moderator || (opts.username == comment.username)) - div.find('#dc' + comment.id).show(); - } - return div; - } - - /** - * A simple template renderer. Placeholders such as <%id%> are replaced - * by context['id'] with items being escaped. Placeholders such as <#id#> - * are not escaped. - */ - function renderTemplate(template, context) { - var esc = $(document.createElement('div')); - - function handle(ph, escape) { - var cur = context; - $.each(ph.split('.'), function() { - cur = cur[this]; - }); - return escape ? esc.text(cur || "").html() : cur; - } - - return template.replace(/<([%#])([\w\.]*)\1>/g, function() { - return handle(arguments[2], arguments[1] == '%' ? true : false); - }); - } - - /** Flash an error message briefly. */ - function showError(message) { - $(document.createElement('div')).attr({'class': 'popup-error'}) - .append($(document.createElement('div')) - .attr({'class': 'error-message'}).text(message)) - .appendTo('body') - .fadeIn("slow") - .delay(2000) - .fadeOut("slow"); - } - - /** Add a link the user uses to open the comments popup. */ - $.fn.comment = function() { - return this.each(function() { - var id = $(this).attr('id').substring(1); - var count = COMMENT_METADATA[id]; - var title = count + ' comment' + (count == 1 ? '' : 's'); - var image = count > 0 ? opts.commentBrightImage : opts.commentImage; - var addcls = count == 0 ? ' nocomment' : ''; - $(this) - .append( - $(document.createElement('a')).attr({ - href: '#', - 'class': 'sphinx-comment-open' + addcls, - id: 'ao' + id - }) - .append($(document.createElement('img')).attr({ - src: image, - alt: 'comment', - title: title - })) - .click(function(event) { - event.preventDefault(); - show($(this).attr('id').substring(2)); - }) - ) - .append( - $(document.createElement('a')).attr({ - href: '#', - 'class': 'sphinx-comment-close hidden', - id: 'ah' + id - }) - .append($(document.createElement('img')).attr({ - src: opts.closeCommentImage, - alt: 'close', - title: 'close' - })) - .click(function(event) { - event.preventDefault(); - hide($(this).attr('id').substring(2)); - }) - ); - }); - }; - - var opts = { - processVoteURL: '/_process_vote', - addCommentURL: '/_add_comment', - getCommentsURL: '/_get_comments', - acceptCommentURL: '/_accept_comment', - deleteCommentURL: '/_delete_comment', - commentImage: '/static/_static/comment.png', - closeCommentImage: '/static/_static/comment-close.png', - loadingImage: '/static/_static/ajax-loader.gif', - commentBrightImage: '/static/_static/comment-bright.png', - upArrow: '/static/_static/up.png', - downArrow: '/static/_static/down.png', - upArrowPressed: '/static/_static/up-pressed.png', - downArrowPressed: '/static/_static/down-pressed.png', - voting: false, - moderator: false - }; - - if (typeof COMMENT_OPTIONS != "undefined") { - opts = jQuery.extend(opts, COMMENT_OPTIONS); - } - - var popupTemplate = '\ -
    \ -

    \ - Sort by:\ - best rated\ - newest\ - oldest\ -

    \ -
    Comments
    \ -
    \ - loading comments...
    \ -
      \ -
      \ -

      Add a comment\ - (markup):

      \ -
      \ - reStructured text markup: *emph*, **strong**, \ - ``code``, \ - code blocks: :: and an indented block after blank line
      \ -
      \ - \ -

      \ - \ - Propose a change ▹\ - \ - \ - Propose a change ▿\ - \ -

      \ - \ - \ - \ - \ - \ -
      \ -
      '; - - var commentTemplate = '\ -
      \ -
      \ -
      \ - \ - \ - \ - \ - \ - \ -
      \ -
      \ - \ - \ - \ - \ - \ - \ -
      \ -
      \ -
      \ -

      \ - <%username%>\ - <%pretty_rating%>\ - <%time.delta%>\ -

      \ -
      <#text#>
      \ -

      \ - \ - reply ▿\ - proposal ▹\ - proposal ▿\ - \ - \ -

      \ -
      \
      -<#proposal_diff#>\
      -        
      \ -
        \ -
        \ -
        \ -
        \ - '; - - var replyTemplate = '\ -
      • \ -
        \ -
        \ - \ - \ - \ - \ - \ - \ -
        \ -
      • '; - - $(document).ready(function() { - init(); - }); -})(jQuery); - -$(document).ready(function() { - // add comment anchors for all paragraphs that are commentable - $('.sphinx-has-comment').comment(); - - // highlight search words in search results - $("div.context").each(function() { - var params = $.getQueryParameters(); - var terms = (params.q) ? params.q[0].split(/\s+/) : []; - var result = $(this); - $.each(terms, function() { - result.highlightText(this.toLowerCase(), 'highlighted'); - }); - }); - - // directly open comment window if requested - var anchor = document.location.hash; - if (anchor.substring(0, 9) == '#comment-') { - $('#ao' + anchor.substring(9)).click(); - document.location.hash = '#s' + anchor.substring(9); - } -}); diff --git a/astro.config.mjs b/astro.config.mjs new file mode 100644 index 0000000..4467235 --- /dev/null +++ b/astro.config.mjs @@ -0,0 +1,30 @@ +import { defineConfig } from "astro/config"; +import react from "@astrojs/react"; +import tailwind from "@astrojs/tailwind"; + +// Get base path from environment variable +// For GitHub Pages: if repo is username.github.io, use "" (root) +// Otherwise use /repo-name (must start with / and not end with /) +// Can be set via BASE_PATH env var or defaults to empty (root) +let base = process.env.BASE_PATH || ""; + +// Normalize base path: ensure it starts with / if not empty, and remove trailing / +if (base && !base.startsWith('/')) { + base = '/' + base; +} +if (base.endsWith('/') && base !== '/') { + base = base.slice(0, -1); +} + +// Construct site URL - GitHub Pages format +const owner = process.env.GITHUB_REPOSITORY_OWNER || 'carreau'; +const site = base + ? `https://${owner}.github.io${base}` + : `https://${owner}.github.io`; + +export default defineConfig({ + integrations: [react(), tailwind()], + base: base, + site: site, + output: "static", +}); diff --git a/citing.html b/citing.html deleted file mode 100644 index c8af354..0000000 --- a/citing.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - - - Citing IPython — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        Citing IPython

        -

        If IPython been significant to a project that leads to an academic publication, -please acknowledge that fact by citing the project. As of now, the canonical -academic reference for IPython is this paper, for which here are both -a BibTex and a plaintext reference you can use:

        -
        @Article{PER-GRA:2007,
        -  Author         = {P\'erez, Fernando and Granger, Brian E.},
        -  Title          = {{IP}ython: a {S}ystem for {I}nteractive {S}cientific
        -                 {C}omputing},
        -  Journal        = {{C}omput. {S}ci. {E}ng.},
        -  Volume         = {9},
        -  Number         = {3},
        -  Pages          = {21-29},
        -  month          = may,
        -  year           = 2007,
        -  url            = "http://ipython.org",
        -}
        -
        -

        or in plaintext:

        -
        -
        Fernando Pérez, Brian E. Granger, IPython: A System for Interactive -Scientific Computing, Computing in Science and Engineering, vol. 9, no. 3, -pp. 21-29, May/June 2007, doi:10.1109/MCSE.2007.53. URL: http://ipython.org
        -

        Thank you!

        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/documentation.html b/documentation.html deleted file mode 100644 index 5827760..0000000 --- a/documentation.html +++ /dev/null @@ -1,314 +0,0 @@ - - - - - - - - - Documentation — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        Documentation

        -
        -

        IPython manual

        - -

        This introduction to some key features -is a good place to start if you haven’t used IPython before.

        -

        The manuals for previous releases are here:

        - -
        -
        -

        Other useful documentation

        - -
        - -
        -

        Other projects using IPython

        -

        Here you can -find a list of projects that use IPython in one form or another. If you use -IPython as part of a project, please do add your information to this page or -email Fernando.Perez@Berkeley.edu and -I’ll be happy to add it. Also, if your project is of academic relevance, -please provide a citation to IPython.

        -
        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/donate.html b/donate.html deleted file mode 100644 index dbfe51d..0000000 --- a/donate.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - - - Support IPython Development — IPython - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        Support IPython Development

        -

        IPython will always be 100% open source software, free for all to use and -released under the liberal terms of the modified BSD license. But while the -whole team does its best to work efficiently, and we actively try to find -funding from multiple sources, the reality is that we have limited resources -and this fact hinders our development capabilities.

        -

        If you have found IPython to be useful in your work, research or company, -please consider making a donation to the project commensurate with your -resources. Any amount helps!

        -

        All donations will be used strictly to fund IPython development, by supporting -tasks such as developer sprints, better installers, improved documentation and -paying for hosting costs for services such as the IPython Notebook Viewer.

        -

        Our donations are managed by the NumFOCUS foundation, which passes 100% of your -contribution to the IPython project. NumFOCUS is a 501(c)3 non-profit -foundation, so if you are subject to US Tax law, your contributions will be -tax-deductible.

        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/download.html b/download.html deleted file mode 100644 index 8246e86..0000000 --- a/download.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - -

        The download page has moved to this link.

        - - \ No newline at end of file diff --git a/faq.html b/faq.html deleted file mode 100644 index 62b6f2a..0000000 --- a/faq.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - - - FAQ — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        FAQ

        -

        If your question isn’t answered below, check the docs, then ask on the user mailing list.

        - -
        -

        Can IPython run under IronPython/PyPy/Jython/other Python interpreters?

        -

        The terminal-based shell should run on any interpreter which complies with -the necessary version of Python. IPython 0.11 requires Python 2.6 -or above, and as of June 2011, IronPython and PyPy both support this.

        -

        The most likely problems would come from Readline and from using the undocumented -sys._getframe() function. On Windows we ship our own pyreadline, -which might also work under IronPython. PyPy ships its own readline module, -which should now work.

        -

        If IPython does not work under a supported interpreter, please -file a bug.

        -
        -
        -

        IPython crashes under OS X when using the arrow keys

        -

        Under some circumstances, using the arrow keys to navigate your input history can cause a complete crash of the Python interpreter.

        -

        Answer: This is due to a bug in the readline library from the official builds. There are a few solutions you can take:

        -
        -
          -
        1. Use a different Python version from Apple’s default (MacPython or Fink have been reported to work)

          -
        2. -
        3. You can disable in your ipythonrc file the following lines by commenting them out:

          -
          readline_parse_and_bind "\e[A": history-search-backward
          -readline_parse_and_bind "\e[B": history-search-forward
          -
          -
        4. -
        -
        -

        You will lose searching in your history with the arrow keys, but at least Python won’t crash.

        -
        -
        -

        Does IPython play well with Windows?

        -

        Yes, it most definitely does! There are some things that should be noted: see -the installation documentation.

        -
        -
        -

        What is the best way to install IPython?

        -

        See the installation documentation for full details.

        -

        The standard Python installation mechanisms (setup.py, pip or easy_install) all work for installing IPython to use in a terminal. Windows users are best off installing distribute, then running the .exe installer, to create start menu shortcuts.

        -

        To use the notebook or the Qt console, it’s easiest to install through a package manager, or download a Python distribution such as Anaconda or EPD. Otherwise, you will need to install pyzmq, along with tornado for the notebook, and PyQt4/PySide and pygments for the Qt console.

        -
        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/google46f5e5c36b67754a.html b/google46f5e5c36b67754a.html deleted file mode 100644 index bde95f2..0000000 --- a/google46f5e5c36b67754a.html +++ /dev/null @@ -1 +0,0 @@ -google-site-verification: google46f5e5c36b67754a.html \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 094a6ae..0000000 --- a/index.html +++ /dev/null @@ -1,370 +0,0 @@ - - - - - - - - - Announcements — IPython - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -

        IPython provides a rich architecture for interactive computing with:

        -
          -
        • Powerful interactive shells (terminal and Qt-based).
        • -
        • A browser-based notebook with support for code, text, mathematical -expressions, inline plots and other rich media.
        • -
        • Support for interactive data visualization and use of GUI toolkits.
        • -
        • Flexible, embeddable interpreters to load into your own projects.
        • -
        • Easy to use, high performance tools for parallel computing.
        • -
        -IPython clients -

        While the focus of the project is Python, our architecture is designed in a -language-agnostic way to facilitate interactive computing in any language. An -interactive kernel speaks to clients such as the terminal or web notebook via a -well-specified protocol, and all features of a kernel are available to all -clients. We ship the official IPython kernel, but kernels for other languages -are being currently developed, with prototypes in Ruby and JavaScript already -existing. Additionally, the IPython kernel supports multi-language -integration, letting you for example mix Python code with Cython, R, Octave, -and scripting in Bash, Perl or Ruby.

        -

        To get started with the IPython Notebook, see our official example -collection. Our notebook gallery is an excellent way to see the many -things you can do with IPython while learning about a variety of topics, from -basic programming to advanced statistics or quantum mechanics.

        -

        To learn more about IPython, you can watch our videos and screencasts, download our talks and presentations, or read -our extensive documentation. IPython is open source -(BSD license), and is used by a range of other projects; add your project to that -list if it uses IPython as a library, and please don’t forget to cite the -project.

        -

        IPython supports Python 2.6 to 2.7 and 3.2 or newer. Our older 0.10 series -supports Python 2.5, and can be used with Python 2.4.

        -
        -

        Announcements

        -
          -
        • IPython 1.0 We are getting ready to release IPython 1.0. -We have an alpha release ready for testing, out on July 21, 2013, -and should have a release candidate around August 1. -The alpha has gone fairly smoothly, so assuming all goes well with the release candidate -IPython 1.0.0 should be released by around August 15, 2013.
        • -
        • Book: Cyrille Rossant has published the first IPython-focused book: -Learning IPython for Interactive Computing and Data Visualization, -for which Matthias Bussonnier was a technical -reviewer. We thank Packt Publishing for donating a portion of the proceeds -from this book to support IPython’s development.
        • -
        • FSF Award: Fernando Perez was awarded the 2012 Award for the Advancement -of Free Software for -the creation of IPython and his work in the Scientific Python community. -More -details.
        • -
        • IPython tutorial at PyCon 2013: Fernando Perez, Brian Granger and Min -Ragan-Kelley presented in-depth tutorial about IPython. -It covers IPython’s architecture and hands-on examples on customization, -embedding, effective uses of the various applications, the architecture of -the web notebook and how to use IPython for parallel and distributed -computing.
        • -
        • Roadmap to 1.0 and beyond: IPython 1.0 is coming mid-July 2013. See the -grant which is funding the bulk of the work, as well as our roadmap for -achieving the grant’s objectives. -Read on for more details.
        • -
        • Sloan Foundation grant: IPython has been awarded a $1.15 million grant -from the Alfred P. Sloan Foundation. This will -support several core developers, allowing them to focus on building the -IPython Notebook into a tool for open, collaborative, reproducible scientific -computing. We’ll also be bringing developers together for two sprints each -year in California. See more details.
        • -
        -

        More news...

        -

        John Hunter (1968-2012)

        -
        - - - - - - -
        - - -

        - On August 28 2012 at 10am, John D. Hunter, creator of matplotlib - and IPython contributor, died from complications - arising from cancer treatment, after a brief but intense battle with - this terrible illness. John is survived by his wife Miriam, his - three daughters Rahel, Ava and Clara, his sisters Layne and Mary, - and his mother Sarah.

        - -

        - If you have benefited from John's many contributions, please say - thanks in the way that would matter most to him: by making a donation to - the John Hunter Memorial - Fund.

        -
        -
        -

        Citing IPython

        -

        Several of the authors of IPython are connected with academic and scientific -research, so it is important for us to be able to show the impact of our work -in other projects and fields.

        -

        If IPython contributes to a project that leads to a scientific publication, -please acknowledge this fact by citing the project. You can use this -ready-made citation entry.

        -
        -
        -

        Support

        -

        We gratefully acknowledge the support we’ve received over the years from the -following sources:

        -
          -
        • In December 2012, IPython was awarded a $1.15 million grant from the Alfred P. Sloan Foundation that will fund -the core team for the 2012-2013 period.
        • -
        • Since 2011, we have had support from the US DoD High Performance Computing -Modernization Program (HPCMP), which funds several IPython developers in -collaboration with the US Army Engineer Research and Development Center -(ERDC) that provides computing resources and support from the staff.
        • -
        • Enthought Inc has supported IPython since its beginning in multiple forms, -including –but not limited to– the funding of our Qt console, hosting our -website for many years, the continued hosting of our mailing lists, and the -inclusion of IPython in the Enthought Python Distribution.
        • -
        • NiPy/NIH: funding via the NiPy project (NIH grant 5R01MH081909-02) supported -our 2009 refactoring work.
        • -
        • Sage/NSF: funding via the grant Sage: Unifying Mathematical Software for -Scientists, Engineers, and Mathematicians (NSF grant -DMS-1015114) supported our Seattle 2011 developer meeting.
        • -
        • Microsoft’s team working on Python Tools for Visual Studio developed the integraton of IPython into the -Python plugin for Visual Studio 2010.
        • -
        • Tech-X Corporation supported in 2008 the development -of our parallel computing tools.
        • -
        • Google Summer of Code: in 2005 and 2010 we’ve had GSoC support for prototypes -in several areas of the project.
        • -
        • The Ohio Supercomputer Center and the Department of Defense High Performance -Computing Modernization Program (HPCMP), for sponsoring work in 2009 on our -parallel computing tools.
        • -
        • Bivio Software hosted an IPython sprint in 2006, in -addition to their support of the Front Range Pythoneers group in Boulder, CO.
        • -
        • GitHub hosts our development workflow and -documentation.
        • -
        • ShiningPanda gives us a free continuous -integration service.
        • -
        -
        -
        -
        - - -
        - - - -
        - - - - - - - \ No newline at end of file diff --git a/install.html b/install.html deleted file mode 100644 index 5020155..0000000 --- a/install.html +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - Installing IPython — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        Installing IPython

        -

        There are multiple ways of installing IPython, and our official documentation -contains detailed instructions for manual -installs from source, targeted at advanced users and developers.

        -

        For new users who want to get up and running with minimal effort, we suggest -you follow the instructions on this page, which provide a setup based on Python -2.7. This includes all the dependencies to run the notebook and optionally the -basic libraries for scientific computing and data analysis.

        -

        Mac or Windows

        -

        1. Download and install Anaconda or the free edition of the Enthought Python Distribution -(EPD).

        -
          -
        1. Update IPython to the current version:
        2. -
        -
          -
        • On a Mac, using the Terminal application:

          -

          Anaconda:

          -
          conda update conda
          -conda update ipython
          -
          -

          EPD:

          -
          sudo enpkg enstaller
          -sudo enpkg ipython
          -
          -
        • -
        • On Windows, at the Command Prompt (cmd.exe application):

          -

          Anaconda:

          -
          conda update conda
          -conda update ipython
          -
          -

          EPD:

          -
          enpkg enstaller
          -enpkg ipython
          -
          -
        • -
        -

        Linux

        -

        On Linux, most distributions have everything you need in their package -managers.

        -
          -
        1. Install IPython and its dependencies:
        2. -
        -
          -
        • On Ubuntu or other Debian-based distributions, type at the shell:

          -
          sudo apt-get install ipython-notebook
          -
          -
        • -
        • On Fedora 18 and newer related distributions, use:

          -
          sudo yum install python-ipython-notebook
          -
          -
        • -
        -
          -
        1. Optionally install additional tools for scientific computing:
        2. -
        -
          -
        • On Ubuntu or other Debian-based distributions, type at the shell:

          -
          sudo apt-get install python-matplotlib python-scipy \
          -                     python-pandas python-sympy python-nose
          -
          -
        • -
        • On Fedora 18 and newer related distributions, use:

          -
          sudo yum install python-matplotlib scipy python-pandas sympy python-nose
          -
          -
        • -
        -
        -

        Downloads

        -

        You can manually download IPython from either Github or PyPI. Those locations contain source -distributions as well as binary Windows installers, which will be recognized by -easy_install and pip (for the source ones).

        -

        Our downloads archive also contains all -IPython releases, including old versions.

        -
        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/news.html b/news.html deleted file mode 100644 index 4c7b45c..0000000 --- a/news.html +++ /dev/null @@ -1,505 +0,0 @@ - - - - - - - - - News — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        News

        -
        -

        The first IPython book

        -

        On April 25 2013, Cyrille Rossant published the first IPython-focused book: -Learning IPython for Interactive Computing and Data Visualization, -for which Matthias Bussonnier was a technical -reviewer. We thank Packt Publishing for donating a portion of the proceeds from -this book to support IPython’s development.

        -
        -
        -

        FSF Award

        -

        On March 23 2013, Fernando Perez was awarded the 2012 Award for the -Advancement of Free Software for -the creation of IPython and his work in the Scientific Python community. More -details are available in this profile -from UC Berkeley.

        -
        -
        -

        PyCon 2013 Tutorial

        -

        Fernando Perez, Brian Granger and Min Ragan-Kelley presented in-depth tutorial -about IPython. It covers IPython’s architecture and hands-on examples on customization, -embedding, effective uses of the various applications, the architecture of the -web notebook and how to use IPython for parallel and distributed computing.

        -
        -
        -

        IPython 0.13.2

        -

        IPython 0.13.2 was released on April 5, 2013. This is a bugfix-only release. -Download it now, or see the release notes for more -details. This will probably be the last release before 1.0.

        -
        -
        -

        Roadmap to 1.0 and Beyond

        -

        IPython 1.0 is coming mid-July 2013. See the grant which is funding the bulk -of the work, as well as our roadmap for achieving the grant’s objectives. -Read on for more details.

        -
        -
        -

        Sloan Foundation Grant

        -

        IPython has been awarded a $1.15 million grant from the Alfred P. Sloan -Foundation. This will support several core developers, -who’ll focus on building the IPython Notebook into a tool for open, collaborative, -reproducible scientific computing. We’ll also be bringing developers together -for two sprints each year in California. See more details.

        -
        -
        -

        IPython 0.13

        -

        IPython 0.13 was released on June 30, 2012. This release sees a substantial -redesign of the IPython Notebook, the introduction of ‘cell magic functions’, -as well as numerous other improvements. Download it now, or -see the release notes for more -details.

        -
        -
        -

        IPython 0.12.1

        -

        IPython 0.12.1 was released on April 21, 2012. This is a bugfix-only release; -no new features have been introduced but over 70 issues have been fixed. -All users of IPython 0.12 are encouraged to upgrade to this release.

        -
        -
        -

        IPython 0.12

        -

        IPython 0.12 was released on 18 December 2011. The major new feature with this -release is the IPython Notebook, -an interactive Python interface running in the browser. Download -it now, or read more about what’s new.

        -_images/ipy_0.12.png -
        -
        -

        Try IPython online

        -

        As of Autumn 2011, you can try IPython online in your browser. New users can -explore the features before installing it, or you can do some quick -calculations from any computer with web access.

        -

        Thanks to the guys at PythonAnywhere for -providing this. If you sign up for an account there (it’s in beta at the moment), -you also get persistent consoles, disk space, and more.

        -
        -
        -

        IPython 0.11

        -

        We’re pleased to announce the immediate release of IPython 0.11, on 31 July 2011. -Despite the small shift in the version number, this brings a lot of changes, -including a new Qt frontend and a rewritten parallel computing framework. -Download it now, or look at what’s new.

        -_images/ipy_0.11.png -
        -
        -

        User survey

        -

        From May to September 2011, we ran a survey to find out more about who uses -IPython, amassing 240 responses by the time we closed it. We’d like to thank all -the respondents, and invite you to read the findings.

        -
        -
        -

        IPython 0.10.2 released

        -

        IPython 0.10.2 was released on 9 April, 2011. This is a bugfix release for the -0.10 series. See the release notes -for more details.

        -
        -
        -

        Python 3 support in progress

        -

        Work has started to get IPython running on Python 3. If you’re interested in -testing it, get the code from -GitHub. We hope to release this along with IPython 0.11.

        -
        -
        -

        IPython 0.10.1 is out!

        -

        On October 11, 2010, we released IPython 0.10.1. The full release notes can be -found here -, -describing in detail the changes in this release.

        -
        -
        -

        Windows HPC Server Case Study

        -

        As a result of the Microsoft-funded work on providing support for Windows HPC -Server 2008, a case study is now available that provides some details on the collaboration -between IPython and the University of Colorado’s Mechanical Engineering -Department.

        -
        -
        -

        Support for Windows HPC Server 2008

        -_images/logo-hpc2008-header.png -

        Recently, we have added support for Windows HPC Server 2008 in ipcluster. This -makes it easy to get started with IPython’s parallel computing capabilities on -Windows. These features are now in trunk and will be in the upcoming 0.11 -release. Brian Granger has created a whitepaper and two -videos -about using IPython on Windows HPC Server 2008. Additional information about -these features can be found in our documentation here. -Many thanks to Microsoft for funding this effort.

        -
        -
        -

        What will become IPython 0.11 is taking shape, big changes ahead

        -

        As of November 2009, we have major changes coming to IPython. The next release -will include a lot of architectural updates, all of which we know are necessary -to really make significant improvements to IPython, but that also include -inevitable backward compatibility breaks. We would like to encourage you to -start looking at the nightly documentation and -source tarball (you can also -follow the trunk from Launchpad).

        -
        -
        -

        IPython 0.10 has been released

        -

        On August 4 2009, we’ve released version 0.10 of IPython. The full release -notes can be found here, -describing in detail all new features, bug fixes and API changes of this -release.

        -
        -
        -

        IPython 0.9.1 has been released

        -

        Unfortunately, release 0.9 turned out to have compatibility issues with Python -2.4. This quick bugfix release addresses this issue but adds no other -features.

        -
        -
        -

        IPython 0.9 is out!

        -

        On September 14, 2008, the IPython team is proud to release version 0.9 final. -See here for -the full announcement; a detailed description of the changes can be found here.

        -
        -
        -

        IPython 0.9 betas are ready

        -

        At the usual location you can now -find the beta release of the 0.9 upcoming release. We’d greatly appreciate -your testing and feedback!

        -
        -
        -

        IPython1 is dead, long live IPython (Summer 2008)

        -

        For the past three years, IPython1 has existed as a separate codebase from -IPython. IPython1 was being used to develop IPython’s architecture for -parallel computing as well as test new ideas for IPython itself. Because the -parallel computing stuff is relatively stable now, we have completely merged -IPython1 into IPython. Thus starting with IPython version 0.9, the parallel -computing capabilities (as well as a lot more new stuff) of IPython1 will be -available in regular IPython. From here on out, there is no IPython1, just -IPython.

        -
        -
        -

        IPython 0.8.4

        -

        IPython 0.8.4 was released.

        -
        -
        -

        IPython 0.8.3

        -

        IPython 0.8.3 was released. See what’s new.

        -
        -
        -

        IPython1 and the Scripps Institute’s Vision

        -

        Jose Unpingco made this really neat -screencast showing how to -couple IPython1 with the Vision environment. -Vision is an extremely impressive visual programming environment developed by -Michel Sanner’s team at the Scripps -Institute in La Jolla, CA.

        -
        -
        -

        IPython and Django

        -

        A blog entry by -Peter Sheats describing how to use IPython as the interactive shell for Django.

        -
        -
        -

        A new article about IPython at IBM Developer Works (Dec 12, 2007)

        -

        Noah Gift wrote a great article at the IBM -Developer Works site, on using the Net-SNMP library to interactively explore -and manage a network (the interactive part courtesy of IPython, of course).

        -
        -
        -

        IPython 0.8.2 is released (Nov 30, 2007)

        -

        Version 0.8.2 is out. See a summary of the changes , or -read the gory details in the full ChangeLog.

        -
        -
        -

        First release of IpyKit (May 24, 2007)

        -

        IpyKit is a standalone IPython executable, -created with py2exe and as such works on machines without python (or where you -just don’t have time to mess with installation). It includes pyreadline for -full tab completion and color support. Get the first release (fully functional, -based on svn IPython) here. Just unzip and run ipython.exe -to go.

        -
        -
        -

        Backports for 0.8.1 (may 23, 2007)

        -

        We will backport some critical bug fixes to 0.8.1, if necessary - even if we -may not cut an official release, you can trust that the quality of the latest -version in 0.8.1 branch is at least as good as the 0.8.1 release. Get it with -svn by doing svn co. See the -changelog -for the list of applied fixes.

        -
        -
        -

        IPython 0.8.1 is released (May 10, 2007)

        -

        Version 0.8.1 is out. See WhatsNew for a summary of changes, or read the gory -details in the full ChangeLog.

        -

        Windows users can now safely upgrade, as long as they also use a current -release of PyReadline] from the download page.

        -
        -
        -

        Article about IPython in CiSE (May 2007)

        -

        The issue of the journal ‘’Computing in Science and Engineering’’ was -entirely devoted to Python in scientific computing. One of the IPython.

        -
        -
        -

        IPython1 0.9alpha1 (Saw) is released (April 24, 2007)

        -

        The first alpha of the new version of IPython1, called Saw, is now out. Please -see the release notes, and this page for more details.

        -
        -
        -

        Coding Sprint in Boulder (Coming April 28, 2007)

        -

        On April 28, we’ll hold a coding sprint to push the saw branch and the -integration of the trunk into it. Details here.

        -
        -
        -

        IPython 0.8.0 is released (April 10, 2007)

        -

        Version 0.8.0 is out. See WhatsNew for a summary of changes, or read the gory -details in the full ChangeLog.

        -

        ‘’‘WARNING’‘’ for Windows users: IPython 0.8.0 does ‘’‘NOT’‘’ work correctly -with PyReadline 1.3 , Use PyReadLine 1.4 instead.

        -
        -
        -

        IPython 0.7.3 is released (December 19, 2006)

        -

        We are pleased to announce the release of IPython 0.7.3. The release has many -improvements and new features.

        -

        IPython 0.7.3 can be downloaded here.

        -

        See our Trac wiki for release notes.

        -
        -
        -

        New IPython Wiki (September 27, 2006)

        -

        IPython has a new moin based wiki site. This site will eventually replace the -old plain html IPython web site. Please feel free to explore and contribute to -this new site.

        -
        -
        -

        IPython 0.7.2 is released (June 6, 2006)

        -

        We are pleased to announce the release of IPython 0.7.2. The release has many -improvements and new features.

        -

        IPython 0.7.2 can be downloaded here .

        -
        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/notebook.html b/notebook.html deleted file mode 100644 index 8e47f35..0000000 --- a/notebook.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - - The IPython Notebook — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        The IPython Notebook

        -

        The IPython Notebook is a web-based interactive computational environment where -you can combine code execution, text, mathematics, plots and rich media into a -single document:

        -The IPython notebook with embedded text, code, math and figures. -

        These notebooks are normal files that can be shared with colleagues, converted -to other formats such as HTML or PDF, etc. You can share any publicly -available notebook by using the IPython Notebook Viewer service which will render it as a static web -page. This makes it easy to give your colleagues a document they can read -immediately without having to install anything.

        -

        To learn more about using the IPython Notebook, you can visit our example -collection, and you can read the documentation for all the details on how to -use and configure the system. The Notebook Gallery showcases many -interesting notebooks covering a variety of topics, from basic programming to -advanced scientific computing.

        -

        Here is a short demo of the notebook’s basic features by the Pybonacci team:

        -

        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/objects.inv b/objects.inv deleted file mode 100644 index ed57309..0000000 --- a/objects.inv +++ /dev/null @@ -1,7 +0,0 @@ -# Sphinx inventory version 2 -# Project: IPython -# Version: -# The remainder of this file is compressed using zlib. -xm1 0Vpuu*ir$N(ߋ\܎}C -d )c3F - [EN(Lnbh0N9ퟍנ̜>#z5+$¨*r ?;80[L8|ocmdj[ \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f530aa5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6264 @@ +{ + "name": "ipython-website", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ipython-website", + "version": "1.0.0", + "dependencies": { + "@astrojs/react": "^4.4.2", + "@astrojs/tailwind": "^6.0.2", + "astro": "^5.16.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tailwindcss": "^3.4.18" + }, + "devDependencies": { + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "tailwind-merge": "^3.4.0", + "tw-animate-css": "^1.4.0", + "typescript": "^5.3.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.0.tgz", + "integrity": "sha512-mqVORhUJViA28fwHYaWmsXSzLO9osbdZ5ImUfxBarqsYdMlPbqAqGJCxsNzvppp1BEzc1mJNjOVvQqeDN8Vspw==" + }, + "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/markdown-remark": { + "version": "6.3.9", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.9.tgz", + "integrity": "sha512-hX2cLC/KW74Io1zIbn92kI482j9J7LleBLGCVU9EP3BeH5MVrnFawOnqD0t/q6D1Z+ZNeQG2gNKMslCcO36wng==", + "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.0", + "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.13.0", + "smol-toml": "^1.4.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/react": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@astrojs/react/-/react-4.4.2.tgz", + "integrity": "sha512-1tl95bpGfuaDMDn8O3x/5Dxii1HPvzjvpL2YTuqOOrQehs60I2DKiDgh1jrKc7G8lv+LQT5H15V6QONQ+9waeQ==", + "dependencies": { + "@vitejs/plugin-react": "^4.7.0", + "ultrahtml": "^1.6.0", + "vite": "^6.4.1" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", + "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", + "react": "^17.0.2 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@astrojs/tailwind": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@astrojs/tailwind/-/tailwind-6.0.2.tgz", + "integrity": "sha512-j3mhLNeugZq6A8dMNXVarUa8K6X9AW+QHU9u3lKNrPLMHhOQ0S7VeWhHwEeJFpEK1BTKEUY1U78VQv2gN6hNGg==", + "dependencies": { + "autoprefixer": "^10.4.21", + "postcss": "^8.5.3", + "postcss-load-config": "^4.0.2" + }, + "peerDependencies": { + "astro": "^3.0.0 || ^4.0.0 || ^5.0.0", + "tailwindcss": "^3.0.24" + } + }, + "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/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "engines": { + "node": ">=6.9.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==", + "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==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "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": "3.0.1", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-3.0.1.tgz", + "integrity": "sha512-8XqW8xGn++Eqqbz3e9wKuK7mxryeRjs4LOHLxbh2lwKeSbuNR4NFifDZT4KzvjU6HMOPbiNTsWpniK5EJfTWkg==", + "license": "MIT", + "dependencies": { + "fontkit": "^2.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "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/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "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==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "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==", + "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==", + "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==" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "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==" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz", + "integrity": "sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz", + "integrity": "sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz", + "integrity": "sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz", + "integrity": "sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz", + "integrity": "sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz", + "integrity": "sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz", + "integrity": "sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz", + "integrity": "sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz", + "integrity": "sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz", + "integrity": "sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz", + "integrity": "sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz", + "integrity": "sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz", + "integrity": "sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", + "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz", + "integrity": "sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz", + "integrity": "sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz", + "integrity": "sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz", + "integrity": "sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz", + "integrity": "sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz", + "integrity": "sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.19.0.tgz", + "integrity": "sha512-L7SrRibU7ZoYi1/TrZsJOFAnnHyLTE1SwHG1yNWjZIVCqjOEmCSuK2ZO9thnRbJG6TOkPp+Z963JmpCNw5nzvA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.19.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.19.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.19.0.tgz", + "integrity": "sha512-ZfWJNm2VMhKkQIKT9qXbs76RRcT0SF/CAvEz0+RkpUDAoDaCx0uFdCGzSRiD9gSlhm6AHkjdieOBJMaO2eC1rQ==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.19.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.19.0.tgz", + "integrity": "sha512-1hRxtYIJfJSZeM5ivbUXv9hcJP3PWRo5prG/V2sWwiubUKTa+7P62d2qxCW8jiVFX4pgRHhnHNp+qeR7Xl+6kg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.19.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.19.0.tgz", + "integrity": "sha512-dBMFzzg1QiXqCVQ5ONc0z2ebyoi5BKz+MtfByLm0o5/nbUu3Iz8uaTCa5uzGiscQKm7lVShfZHU1+OG3t5hgwg==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.19.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.19.0.tgz", + "integrity": "sha512-H36qw+oh91Y0s6OlFfdSuQ0Ld+5CgB/VE6gNPK+Hk4VRbVG/XQgkjnt4KzfnnoO6tZPtKJKHPjwebOCfjd6F8A==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.19.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.19.0.tgz", + "integrity": "sha512-Z2hdeEQlzuntf/BZpFG8a+Fsw9UVXdML7w0o3TgSXV3yNESGon+bs9ITkQb3Ki7zxoXOOu5oJWqZ2uto06V9iQ==", + "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/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "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==" + }, + "node_modules/@types/fontkit": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/fontkit/-/fontkit-2.0.8.tgz", + "integrity": "sha512-wN+8bYxIpJf+5oZdrdtaX04qUuWHcKxcDEgRS9Qm9ZClSHjzEn13SxUC+5eRM+4yXIeTYk8mTzLAWGF64847ew==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "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==", + "dependencies": { + "@types/unist": "*" + } + }, + "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==", + "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/node": { + "version": "24.10.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz", + "integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz", + "integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "peer": true, + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "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==" + }, + "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==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "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==", + "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==" + }, + "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==", + "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==", + "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==", + "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==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "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==", + "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==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "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==" + }, + "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==", + "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.4", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.16.4.tgz", + "integrity": "sha512-rgXI/8/tnO3Y9tfAaUyg/8beKhlIMltbiC8Q6jCoAfEidOyaue4KYKzbe0gJIb6qEdEaG3Kf3BY3EOSLkbWOLg==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/markdown-remark": "6.3.9", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^3.0.1", + "@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.0.2", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.5.0", + "diff": "^5.2.0", + "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.3.1", + "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.5.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.15.0", + "smol-toml": "^1.5.2", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.6.0", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.3", + "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.0", + "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/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/astro/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/astro/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/astro/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/astro/node_modules/unstorage": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.3.tgz", + "integrity": "sha512-i+JYyy0DoKmQ3FximTHbGadmIYb8JEpq7lxUjnjeB702bCPum0vzo6oy5Mfu0lpqISw7hCyMW2yj4nWC8bqJ3Q==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^4.0.3", + "destr": "^2.0.5", + "h3": "^1.15.4", + "lru-cache": "^10.4.3", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.1" + }, + "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.0.3 || ^7.0.0", + "@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.0.1", + "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/autoprefixer": { + "version": "10.4.22", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.22.tgz", + "integrity": "sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.27.0", + "caniuse-lite": "^1.0.30001754", + "fraction.js": "^5.3.4", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.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==", + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/baseline-browser-mapping": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.4.tgz", + "integrity": "sha512-ZCQ9GEWl73BVm8bu5Fts8nt7MHdbt5vY9bP6WGnUh+r3l8M7CgfyTlwsgCbMC66BNxPr6Xoce3j66Ms5YUQTNA==", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "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==", + "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==", + "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/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001759", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001759.tgz", + "integrity": "sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "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==", + "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==", + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "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/chokidar/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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "dev": true, + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "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==", + "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==" + }, + "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==" + }, + "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/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==", + "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/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "peer": true + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "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==", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.5.0.tgz", + "integrity": "sha512-69sM5yrHfFLJt0AZ9QqZXGCPfJ7fQjvpln3Rq5+PS03LD32Ost1Q9N+eEnaQwGRIriKkMImXD56ocjQmfjbV3w==" + }, + "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==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "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==" + }, + "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/electron-to-chromium": { + "version": "1.5.266", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.266.tgz", + "integrity": "sha512-kgWEglXvkEfMH7rxP5OSZZwnaDWT7J9EoZCujhnpLbfi0bbNtRkgdX2E3gt0Uer11c61qCYktB3hwkAS325sJg==" + }, + "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==" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "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==" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "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==", + "engines": { + "node": ">=6" + } + }, + "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/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "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==", + "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==", + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "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==", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.3.1.tgz", + "integrity": "sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg==", + "license": "MIT", + "dependencies": { + "@types/fontkit": "^2.0.8", + "fontkit": "^2.0.4" + } + }, + "node_modules/fontkit": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fontkit/-/fontkit-2.0.4.tgz", + "integrity": "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==", + "license": "MIT", + "dependencies": { + "@swc/helpers": "^0.5.12", + "brotli": "^1.3.2", + "clone": "^2.1.2", + "dfa": "^1.2.0", + "fast-deep-equal": "^3.1.3", + "restructure": "^3.0.0", + "tiny-inflate": "^1.0.3", + "unicode-properties": "^1.4.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "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, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "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-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/h3": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.4.tgz", + "integrity": "sha512-z5cFQWDffyOe4vQ9xIqNfCZdV4p//vy6fBnr8Q1AWnVZ0teurKMG66rLj++TKwKPUP3u7iMUvrvKaEUiQw2QWQ==", + "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.2", + "radix3": "^1.1.2", + "ufo": "^1.6.1", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==" + }, + "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/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-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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "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==", + "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/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "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/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==", + "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-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/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==", + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "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-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-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" + } + ], + "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" + } + ] + }, + "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" + } + ], + "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" + } + ] + }, + "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" + } + ] + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "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==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "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==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "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" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "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/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "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/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "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/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==", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "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==", + "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==", + "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/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "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==", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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==" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "engines": { + "node": ">= 6" + } + }, + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "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==", + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "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==", + "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==", + "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==", + "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/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/restructure": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/restructure/-/restructure-3.0.2.tgz", + "integrity": "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==", + "license": "MIT" + }, + "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==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.3.tgz", + "integrity": "sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==", + "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.53.3", + "@rollup/rollup-android-arm64": "4.53.3", + "@rollup/rollup-darwin-arm64": "4.53.3", + "@rollup/rollup-darwin-x64": "4.53.3", + "@rollup/rollup-freebsd-arm64": "4.53.3", + "@rollup/rollup-freebsd-x64": "4.53.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.3", + "@rollup/rollup-linux-arm-musleabihf": "4.53.3", + "@rollup/rollup-linux-arm64-gnu": "4.53.3", + "@rollup/rollup-linux-arm64-musl": "4.53.3", + "@rollup/rollup-linux-loong64-gnu": "4.53.3", + "@rollup/rollup-linux-ppc64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-gnu": "4.53.3", + "@rollup/rollup-linux-riscv64-musl": "4.53.3", + "@rollup/rollup-linux-s390x-gnu": "4.53.3", + "@rollup/rollup-linux-x64-gnu": "4.53.3", + "@rollup/rollup-linux-x64-musl": "4.53.3", + "@rollup/rollup-openharmony-arm64": "4.53.3", + "@rollup/rollup-win32-arm64-msvc": "4.53.3", + "@rollup/rollup-win32-ia32-msvc": "4.53.3", + "@rollup/rollup-win32-x64-gnu": "4.53.3", + "@rollup/rollup-win32-x64-msvc": "4.53.3", + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "license": "BlueOak-1.0.0" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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/sharp/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", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shiki": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.19.0.tgz", + "integrity": "sha512-77VJr3OR/VUZzPiStyRhADmO2jApMM0V2b1qf0RpfWya8Zr1PeZev5AEpPGAAKWdiYUtcZGBE4F5QvJml1PvWA==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.19.0", + "@shikijs/engine-javascript": "3.19.0", + "@shikijs/engine-oniguruma": "3.19.0", + "@shikijs/langs": "3.19.0", + "@shikijs/themes": "3.19.0", + "@shikijs/types": "3.19.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==" + }, + "node_modules/smol-toml": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", + "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", + "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==", + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/tailwind-merge": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", + "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.18.tgz", + "integrity": "sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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==", + "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==", + "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==", + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "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" + }, + "node_modules/tw-animate-css": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", + "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/Wombosvideo" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "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==" + }, + "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-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==" + }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "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.6.0", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.6.0.tgz", + "integrity": "sha512-5Fx50fFQMQL5aeHyWnZX9122sSLckcDvcfFiBf3QYeHa7a1MKJooUy52b67moi2MJYkrfo/TWY+CoLdr/w0tTA==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0", + "ofetch": "^1.4.1", + "ohash": "^2.0.0" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "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==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.2.tgz", + "integrity": "sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.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==" + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "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/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "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==", + "engines": { + "node": ">=12" + } + }, + "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==", + "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==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", + "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", + "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==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..fb74777 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "ipython-website", + "version": "1.0.0", + "description": "Modern website for IPython", + "type": "module", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview" + }, + "dependencies": { + "@astrojs/react": "^4.4.2", + "@astrojs/tailwind": "^6.0.2", + "astro": "^5.16.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tailwindcss": "^3.4.18" + }, + "devDependencies": { + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "tailwind-merge": "^3.4.0", + "tw-animate-css": "^1.4.0", + "typescript": "^5.3.3" + } +} diff --git a/presentation.html b/presentation.html deleted file mode 100644 index 72ba17c..0000000 --- a/presentation.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - - - - Presentations on IPython — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        Presentations on IPython

        -

        We have given a number of talks and presentations about IPython:

        -
        -

        2012

        - -
        -
        -

        2011

        -
          -
        • Slides -from a talk about IPython for the Sheffield Python user group.
        • -
        • Slides and video -of a presentation about the new features in IPython 0.11 at the Scipy 2011 -conference.
        • -
        • A tutorial on using IPython -for parallel computing with our new ZeroMQ infrastructure.
        • -
        -
        -
        -

        2010

        -
          -
        • Slides -from a talk that Fernando Perez presented at the SciPy India 2010 conference.
        • -
        • Brian Granger has written a whitepaper -describing the new support that ipcluster has for Windows HPC Server 2008. If -you use IPython’s parallel computing architecture on Windows, this provides a -very nice way of starting the controller and engines on a cluster. The -whitepaper shows how to get started with IPython and Windows HPC Server 200 -as well two examples of using IPython to perform an interactive parallel -computation. This material is also in our documentation here and -here. -Many thanks to Microsoft for funding Brian Granger to work on this.
        • -
        -
        -
        -

        2009

        - -
        -
        -

        2008

        -
          -
        • A talk at -23andMe where I spoke about ipython in general, with -some details about its facilities for distributed computing.
        • -
        -
        -
        -

        2007

        - -
        -
        -

        2006

        - -
        -
        -

        2005

        - -
        -
        -

        2004

        -
          -
        • A talk at SciPy‘04.
        • -
        -
        -
        -

        2003

        - -
        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/public/_images/components.png b/public/_images/components.png new file mode 100644 index 0000000..2d774b6 Binary files /dev/null and b/public/_images/components.png differ diff --git a/_images/countries.png b/public/_images/countries.png similarity index 100% rename from _images/countries.png rename to public/_images/countries.png diff --git a/public/_images/countries1.png b/public/_images/countries1.png new file mode 100644 index 0000000..b622eee Binary files /dev/null and b/public/_images/countries1.png differ diff --git a/public/_images/help_resources.png b/public/_images/help_resources.png new file mode 100644 index 0000000..8949088 Binary files /dev/null and b/public/_images/help_resources.png differ diff --git a/public/_images/installation.png b/public/_images/installation.png new file mode 100644 index 0000000..16c5965 Binary files /dev/null and b/public/_images/installation.png differ diff --git a/_images/ipy_0.11.png b/public/_images/ipy_0.11.png similarity index 100% rename from _images/ipy_0.11.png rename to public/_images/ipy_0.11.png diff --git a/_images/ipy_0.12.png b/public/_images/ipy_0.12.png similarity index 100% rename from _images/ipy_0.12.png rename to public/_images/ipy_0.12.png diff --git a/_images/ipy_0.13.png b/public/_images/ipy_0.13.png similarity index 100% rename from _images/ipy_0.13.png rename to public/_images/ipy_0.13.png diff --git a/public/_images/ipy_versions.png b/public/_images/ipy_versions.png new file mode 100644 index 0000000..f0537be Binary files /dev/null and b/public/_images/ipy_versions.png differ diff --git a/public/_images/ipython-cookbook-2nd.png b/public/_images/ipython-cookbook-2nd.png new file mode 100644 index 0000000..be5dfee Binary files /dev/null and b/public/_images/ipython-cookbook-2nd.png differ diff --git a/public/_images/jupyter-for-ds.png b/public/_images/jupyter-for-ds.png new file mode 100644 index 0000000..8b3f9a7 Binary files /dev/null and b/public/_images/jupyter-for-ds.png differ diff --git a/public/_images/jupyter-in-depth.png b/public/_images/jupyter-in-depth.png new file mode 100644 index 0000000..52a2cf6 Binary files /dev/null and b/public/_images/jupyter-in-depth.png differ diff --git a/public/_images/learning-jupyter-book.png b/public/_images/learning-jupyter-book.png new file mode 100644 index 0000000..e107115 Binary files /dev/null and b/public/_images/learning-jupyter-book.png differ diff --git a/_images/logo-hpc2008-header.png b/public/_images/logo-hpc2008-header.png similarity index 100% rename from _images/logo-hpc2008-header.png rename to public/_images/logo-hpc2008-header.png diff --git a/public/_images/mastering-ipython-book.png b/public/_images/mastering-ipython-book.png new file mode 100644 index 0000000..76389ec Binary files /dev/null and b/public/_images/mastering-ipython-book.png differ diff --git a/public/_images/microsoft-logo.png b/public/_images/microsoft-logo.png new file mode 100644 index 0000000..3fd279c Binary files /dev/null and b/public/_images/microsoft-logo.png differ diff --git a/_images/partsused.png b/public/_images/partsused.png similarity index 100% rename from _images/partsused.png rename to public/_images/partsused.png diff --git a/_images/platforms.png b/public/_images/platforms.png similarity index 100% rename from _images/platforms.png rename to public/_images/platforms.png diff --git a/public/_images/platforms1.png b/public/_images/platforms1.png new file mode 100644 index 0000000..c0d1fd8 Binary files /dev/null and b/public/_images/platforms1.png differ diff --git a/public/_images/py_versions.png b/public/_images/py_versions.png new file mode 100644 index 0000000..4d07884 Binary files /dev/null and b/public/_images/py_versions.png differ diff --git a/public/_images/role.png b/public/_images/role.png new file mode 100644 index 0000000..6c9b204 Binary files /dev/null and b/public/_images/role.png differ diff --git a/_images/sector.png b/public/_images/sector.png similarity index 100% rename from _images/sector.png rename to public/_images/sector.png diff --git a/_static/sloangrant/13_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-widgets.png b/public/_static/sloangrant/13_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-widgets.png similarity index 100% rename from _static/sloangrant/13_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-widgets.png rename to public/_static/sloangrant/13_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-widgets.png diff --git a/_images/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png b/public/_static/sloangrant/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png similarity index 100% rename from _images/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png rename to public/_static/sloangrant/9_home_fperez_prof_grants_1207-sloan-ipython_proposal_fig_ipython-notebook-specgram.png diff --git a/_static/sloangrant/sloan-grant.html b/public/_static/sloangrant/sloan-grant.html similarity index 100% rename from _static/sloangrant/sloan-grant.html rename to public/_static/sloangrant/sloan-grant.html diff --git a/_static/sloangrant/sloan-grant.pdf b/public/_static/sloangrant/sloan-grant.pdf similarity index 100% rename from _static/sloangrant/sloan-grant.pdf rename to public/_static/sloangrant/sloan-grant.pdf diff --git a/_static/survey2011/countries.png b/public/_static/survey2011/countries.png similarity index 100% rename from _static/survey2011/countries.png rename to public/_static/survey2011/countries.png diff --git a/_static/survey2011/partsused.png b/public/_static/survey2011/partsused.png similarity index 100% rename from _static/survey2011/partsused.png rename to public/_static/survey2011/partsused.png diff --git a/_static/survey2011/platforms.png b/public/_static/survey2011/platforms.png similarity index 100% rename from _static/survey2011/platforms.png rename to public/_static/survey2011/platforms.png diff --git a/_static/survey2011/sector.png b/public/_static/survey2011/sector.png similarity index 100% rename from _static/survey2011/sector.png rename to public/_static/survey2011/sector.png diff --git a/public/_static/survey2013/components.png b/public/_static/survey2013/components.png new file mode 100644 index 0000000..2d774b6 Binary files /dev/null and b/public/_static/survey2013/components.png differ diff --git a/public/_static/survey2013/countries.png b/public/_static/survey2013/countries.png new file mode 100644 index 0000000..b622eee Binary files /dev/null and b/public/_static/survey2013/countries.png differ diff --git a/public/_static/survey2013/help_resources.png b/public/_static/survey2013/help_resources.png new file mode 100644 index 0000000..8949088 Binary files /dev/null and b/public/_static/survey2013/help_resources.png differ diff --git a/public/_static/survey2013/installation.png b/public/_static/survey2013/installation.png new file mode 100644 index 0000000..16c5965 Binary files /dev/null and b/public/_static/survey2013/installation.png differ diff --git a/public/_static/survey2013/ipy_versions.png b/public/_static/survey2013/ipy_versions.png new file mode 100644 index 0000000..f0537be Binary files /dev/null and b/public/_static/survey2013/ipy_versions.png differ diff --git a/public/_static/survey2013/platforms.png b/public/_static/survey2013/platforms.png new file mode 100644 index 0000000..c0d1fd8 Binary files /dev/null and b/public/_static/survey2013/platforms.png differ diff --git a/public/_static/survey2013/py_versions.png b/public/_static/survey2013/py_versions.png new file mode 100644 index 0000000..4d07884 Binary files /dev/null and b/public/_static/survey2013/py_versions.png differ diff --git a/public/_static/survey2013/role.png b/public/_static/survey2013/role.png new file mode 100644 index 0000000..6c9b204 Binary files /dev/null and b/public/_static/survey2013/role.png differ diff --git a/public/ipython-logo.png b/public/ipython-logo.png new file mode 100644 index 0000000..25a4328 Binary files /dev/null and b/public/ipython-logo.png differ diff --git a/pyreadline.html b/pyreadline.html deleted file mode 100644 index 42781ad..0000000 --- a/pyreadline.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - - - PyReadline — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        PyReadline

        -
        -

        PyReadline: a ctypes-based readline for Windows

        -

        pyreadline is based on UNC readline by Gary Bishop and its development is now -led by Jörgen Stenarson. The following new features have been added over the -original UNC readline:

        -
        -
          -
        • Support for international characters (if you have the correct codepage active)
        • -
        • Copy and paste using the clipboard
        • -
        • Smart paste for convenient use with ipython. Converting tab separated data -to python list or numpy array. Converting file paths to use / and escaping -any spaces using .
        • -
        • Pasting of multiline code removing empty lines
        • -
        • System bell is disabled by default, can be activated in config file.
        • -
        -
        -

        Note: UNC readline is not being developed further by Gary, and PyReadline can -be considered the continuation of that project. This was done in full agreement -with Gary, given his current development priorities.

        -
        -
        -

        Installation

        -

        You can install PyReadline from PyPI, -where you can find binary installers and source downloads.

        -
        -
        -

        Mailing list

        -

        Questions and bug reports can be directed to the ipython-user mailing list.

        -
        -
        -

        Status and development

        -

        The current stable release is 1.7.

        -

        Development is hosted at github. The issue tracker is hosted there as well.

        -
        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/roadmap-announcement.html b/roadmap-announcement.html deleted file mode 100644 index 39b23d5..0000000 --- a/roadmap-announcement.html +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - - Roadmap to 1.0 and Beyond — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        Roadmap to 1.0 and Beyond

        -

        TL;DR summary: Hi! IPython 1.0 coming mid-August 2013. See the grant which is -funding the bulk of the work, as well as our roadmap for achieving the -grant’s objectives.

        -

        There’s been a lot of excitement on about the grant the IPython team received -from the Sloan Foundation. The easiest way to communicate the contents of the -Sloan grant is to just provide it in its entirety, which is what we’ve done -with direct links for html and pdf version.

        -

        The interested reader will find a description of changes coming to IPython -over the next two years, as well as the motivation behind them, and the -personnel involved. (For example, the astute reader of the grant will -correctly infer that this email is one way in which I am filling my -responsibility as “community engagement and evangelism”... GO TEAM!)

        -

        Two weeks ago, the bulk of IPython’s core contributors had a series of -planning sessions. For three days, Brian, Fernando, Min, and -I met on campus in Berkeley, with Thomas and Matthias -joining in via video teleconference (and Brad, for one of the days, too).

        -

        You can see the full notes from those meetings.

        -

        Our primary objective was to outline a plan of what work we want to accomplish -in the next two years (broadly speaking) as well as to make concrete goals for -our next (1.0!) release, which will land around mid-August 2013.

        -

        It’s kind of funny that there’s a message from Fernando to [ipython-user] back -in April of 2005 titled “Towards IPython 1.0, the famous big cleanup”. In -it, Fernando makes a last call for outstanding critical bugs because he’s -preparing users for a transition toward big changes in the IPython code base. -Because, once he makes the first commit and starts working on the cleanup, -he’ll have to ignore every request made “until the new shiny ipython emerges -from the process, reborn in a glory which shall blind the world.” Toward the -end of the email, he finishes with: “I hope the changes will be worth it, and -when the dust settles, we’ll have something we can call IPython 1.0”... And -eight years and a few months after that email was sent, we will! :)

        -

        What will 1.0 look like? Biggest changes on the user side will be the -integration of nbconvert into IPython proper. But that’s just my summary -of it, the interested reader is encouraged to read the gory details in the -roadmap.

        -

        that’s it from me for now,

        -

        best,

        -

        Paul Ivanov

        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/screenshots/index.html b/screenshots/index.html deleted file mode 100644 index 6e46a39..0000000 --- a/screenshots/index.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - - — IPython - - - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -

        Screenshots

        -

        Below are screenshots of IPython running in a terminal, the Qt console, and a web browser via the HTML notebook.

        -

        Terminal

        -

        -IPython shell in a terminal -

        -

        Qt Console

        -

        -IPython Qt console app -

        -

        HTML Notebook

        -

        -IPython HTML notebook -

        - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/search.html b/search.html deleted file mode 100644 index da5953e..0000000 --- a/search.html +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - - - - Search — IPython - - - - - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -

        Search

        -
        - -

        - Please activate JavaScript to enable the search - functionality. -

        -
        -

        - From here you can search these documents. Enter your search - words into the box below and click "search". Note that the search - function will automatically search for all of the words. Pages - containing fewer words won't appear in the result list. -

        -
        - - - -
        - -
        - -
        - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/searchresults.html b/searchresults.html deleted file mode 100644 index 1f5a418..0000000 --- a/searchresults.html +++ /dev/null @@ -1,357 +0,0 @@ - - - - - - - - - Search results — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        Search results

        -
        Loading
        - - -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/showmedo.html b/showmedo.html deleted file mode 100644 index 6aff422..0000000 --- a/showmedo.html +++ /dev/null @@ -1,262 +0,0 @@ - - - - - - - - - ShowMeDo — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        ShowMeDo

        -
        -

        ShowMeDo IPython videos

        -

        The ShowMeDo website by Ian Ozsvald and Kyran Dale provides instructional videos on a number of topics, and they have a series of them devoted to IPython.

        -

        This page can serve as a repository of ideas for new videos whose focus is IPython. If you have ideas for new videos or a ‘script’ on what one of them can contain post it here even if you don’t have the time to make it yourself. Someone else may be able to pick up the ball and finish it.

        -
        -

        Ideas

        -
        -
        -

        Using IPython as command shell

        -

        (also showcase new features; will probably show with svn version)

        -
        -
          -
        • Launch with sh profile
        • -
        • Show bookmarks, cd -b <tab>, cd -<tab> completion
        • -
        • Declare and %store aliases, %rehashdir, %rehashx, %which
        • -
        • Custom completers (hg, svn etc)
        • -
        • %hist -g, %rep
        • -
        -
        -
        -
        -
        -

        A note about ShowMeDo

        -

        (Ian at ShowMeDo.com) The videos I made for IPython are a bit long in the tooth now, it would be great if someone could make one or more videos which show off IPython’s strengths. I’m very happy to assist at a technical level, having helped with the production of 50 or so ‘casts (and made a fair number myself) I’ve taken most of the brain damage now.

        -

        A new user could be up and making screencasts within an hour, as long as they had a mic, and the software is open source for Windows and Linux (and pretty cheap for a Mac). The old perception that making videos is hard is simply no longer true :-)

        -

        We handle all of the transcoding, hosting and getting the word out, what we need is people who have the skills to share some of that knowledge. A collaborative effort here to discuss the features that could be displayed, leading to a rough script(s), would make for an ideal starting point. If you’re curious about the process, just ping me (ian@showmedo.com) and I’ll answer your questions.

        -

        We have screencasts showing you how to use Cam Studio (Windows) and pyvnc2swf (Linux) here along with notes on how to make a screencast.

        -
        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/sloan-grant.html b/sloan-grant.html deleted file mode 100644 index 33c267d..0000000 --- a/sloan-grant.html +++ /dev/null @@ -1,280 +0,0 @@ - - - - - - - - - Sloan Foundation Grant — IPython - - - - - - - - - - - - - - - -
        -
        - - -
        - Install · -Docs · -Videos · -Notebook Viewer · -News · -Cite · -Donate -
        -
        -
        - -
        -
        - - -
        -
        -
        -
        Loading
        - - - - -
        -
        -

        John Hunter

        - 1968–2012
        - J. Hunter Memorial Fund -
        - -
        -
        -

        Versions

        - -

        Stable

        - 0.13.2 – April 2013
        - Download -
        - -

        Development

        - 1.0.dev
        - Github -
        - -
        - - - - -
        -

        Book

        - - - -
        - -
        -

        Community

        - - - -
        - - - - - -
        - -
        - - - - - -
        - - -
        -
        -
        - -
        - -
        -
        -
        - -
        -

        Sloan Foundation Grant

        -

        We are pleased to announce that the IPython project has received a $1.15M grant -from the Alfred P. Sloan foundation, that will support -IPython development for the next two years (1/1/2013-12/31/2014). The grant, -which is being made to the University of California, Berkeley and California -Polytechnic State University, San Luis Obispo, will enable the project to focus -on developing the IPython Notebook as a general tool for scientific and -technical computing that is open, collaborative and reproducible.

        -

        The grant ( html | pdf ) will fund the following project staff for two -years:

        -
          -
        • Fernando Perez, UC Berkeley, ¾ time project PI
        • -
        • Brian Granger, Cal Poly San Luis Obispo, ¾ time project co-PI
        • -
        • Min Ragan-Kelley, UC Berkeley, full time lead project engineer
        • -
        • Paul Ivanov, UC Berkeley, Postdoc, full time developer
        • -
        • Thomas Kluyver, UC Berkeley, Postdoc, full time developer
        • -
        • Matthew Brett, UC Berkeley, ½ time researcher (Y1), applied statistics Notebooks
        • -
        • JB Poline, UC Berkeley, ½ time researcher (Y1), applied statistics Notebooks
        • -
        -

        The main objectives of the grant are:

        -
          -
        • Build interactive JavaScript widgets for the IPython Notebook that enable -computations and visualizations to be controlled with UI controls (sliders, -buttons, etc.).
        • -
        • Improve the IPython Notebook format by creating libraries for converting -Notebooks to various formats (LaTeX, PDF, HTML, Presentations) and integrating -these into the Notebook web application.
        • -
        • Adding multiuser support to the Notebook web application, to enable small to -medium sized groups of trusted individuals to run a central Notebook server -for collaborative research and teaching.
        • -
        • Develop IPython Notebooks for applied statistics in collaboration with -Jonathan Taylor, who will use these materials in his Applied Statistics -course at Stanford (STAT 191)
        • -
        -

        The grant will also provide resources for two development sprints per year at -UC Berkeley, which will include all of the core IPython developers, as well as -funding for cloud computing resources (for things like CI hosting and nbviewer) -and conference travel for project staff.

        -

        We’d like to thank Josh Greenberg, our program director at the Sloan foundation, -for the phenomenal guidance and support he provided during the grant proposal -preparation and detailed review process. We look forward to working with him -over the next few years!

        -

        And last but not least, we want to thank the entire community of users and -developers of IPython, without whom this would not have been possible: IPython -is a project driven strictly by the real-world needs of its users, and therein -lies its value.

        -

        You can view the full grant here: html pdf.

        -
        - - -
        -
        -
        -
        -
        -
        -
        - - - - - \ No newline at end of file diff --git a/src/components/AnimatedTerminal.tsx b/src/components/AnimatedTerminal.tsx new file mode 100644 index 0000000..eb0600c --- /dev/null +++ b/src/components/AnimatedTerminal.tsx @@ -0,0 +1,571 @@ +import { useEffect, useState, useMemo, useRef } from "react"; + +type TerminalExample = { + name: string; + lines: string[]; +}; + +interface AnimatedTerminalProps { + version?: string | null; +} + +/** + * Dedent a multiline string by removing common leading whitespace + * and split it into lines + */ +function dedentAndSplit(text: string): string[] { + const lines = text.split("\n"); + + // Trim leading and trailing empty lines + while (lines.length > 0 && lines[0].trim().length === 0) { + lines.shift(); + } + while (lines.length > 0 && lines[lines.length - 1].trim().length === 0) { + lines.pop(); + } + + // Find the minimum indentation (excluding empty lines) + let minIndent = Infinity; + for (const line of lines) { + if (line.trim().length > 0) { + const indent = line.match(/^(\s*)/)?.[1].length || 0; + minIndent = Math.min(minIndent, indent); + } + } + + // If no indentation found, return lines as-is + if (minIndent === Infinity) { + return lines; + } + + // Remove the common indentation from all lines + return lines.map((line) => { + if (line.trim().length === 0) { + return ""; + } + return line.slice(minIndent); + }); +} + +const getExamples = (version: string = "9.8.0"): TerminalExample[] => [ + { + name: "NumPy Basics", + lines: dedentAndSplit(` + $ ipython + IPython ${version} -- An enhanced Interactive Python + Type 'copyright', 'credits' or 'license' for more information + + In [1]: import numpy as np + + In [2]: data = np.array([1, 2, 3, 4, 5]) + + In [3]: data.mean() + Out[3]: 3.0 + `), + }, + { + name: "Performance & Plotting", + lines: dedentAndSplit(` + $ ipython + IPython ${version} -- An enhanced Interactive Python + + In [1]: %timeit sum(range(1000)) + 14.2 µs ± 245 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each) + + In [2]: %matplotlib inline + + In [3]: import matplotlib.pyplot as plt + `), + }, + { + name: "Functions", + lines: dedentAndSplit(` + $ ipython + IPython ${version} -- An enhanced Interactive Python + + In [1]: def fibonacci(n): + ...: if n <= 1: + ...: return n + ...: return fibonacci(n-1) + fibonacci(n-2) + ...: + + In [2]: fibonacci(10) + Out[2]: 55 + `), + }, + { + name: "Async", + lines: dedentAndSplit(` + $ ipython + IPython ${version} -- An enhanced Interactive Python + + In [1]: # we will use await at top level ! + ...: import asyncio + + In [2]: async def fetch_data(): + ...: await asyncio.sleep(0.1) + ...: return "Data fetched!" + ...: + + In [3]: await fetch_data() + Out[3]: 'Data fetched!' + + In [4]: async def process_items(items): + ...: results = [] + ...: for item in items: + ...: await asyncio.sleep(0.05) + ...: results.append(item * 2) + ...: return results + + In [5]: await process_items([1, 2, 3]) + Out[5]: [2, 4, 6] + `), + }, + { + name: "Object Introspection", + lines: dedentAndSplit(` + $ ipython + IPython ${version} -- An enhanced Interactive Python + + In [1]: import json + + In [2]: json.dumps? + Signature: json.dumps(obj, *, skipkeys=False, ensure_ascii=True, ...) + Docstring: Serialize obj to a JSON formatted str. + + In [3]: json.dumps?? + Source: + def dumps(obj, *, skipkeys=False, ensure_ascii=True, ...): + return _default_encoder.encode(obj) + `), + }, + { + name: "History System", + lines: dedentAndSplit(` + $ ipython + IPython ${version} -- An enhanced Interactive Python + + In [1]: x = 42 + + In [2]: y = x * 2 + + In [3]: y + Out[3]: 84 + + In [4]: _ + Out[4]: 84 + + In [5]: _ih[1] + Out[5]: 'y = x * 2' + `), + }, + { + name: "System Integration", + lines: dedentAndSplit(` + $ ipython + IPython ${version} -- An enhanced Interactive Python + + In [1]: !echo "Hello from shell" + Hello from shell + + In [2]: files = !ls *.py + + In [3]: len(files) + Out[3]: 5 + + In [4]: %cd /tmp + /tmp + `), + }, + { + name: "Magic Commands", + lines: dedentAndSplit(` + $ ipython + IPython ${version} -- An enhanced Interactive Python + + In [1]: def slow_func(): + ...: return sum(range(10000)) + ...: + + In [2]: %timeit slow_func() + 245 µs ± 12.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) + + In [3]: %prun slow_func() + 5 function calls in 0.000 seconds + `), + }, + { + name: "Data Science", + lines: dedentAndSplit(` + $ ipython + IPython ${version} -- An enhanced Interactive Python + + In [1]: import pandas as pd + + In [2]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) + + In [3]: df.describe() + Out[3]: + A B + count 3.000000 3.000000 + mean 2.000000 5.000000 + std 1.000000 1.000000 + `), + }, +]; + +const EXAMPLE_DELAY = 4000; // Delay before starting next example + +export default function AnimatedTerminal({ version }: AnimatedTerminalProps) { + const examples = useMemo(() => getExamples(version || undefined), [version]); + const [currentExample, setCurrentExample] = useState(0); + const [displayedLines, setDisplayedLines] = useState([]); + const [currentLineIndex, setCurrentLineIndex] = useState(0); + const [isVisible, setIsVisible] = useState(true); + const isVisibleRef = useRef(true); + + useEffect(() => { + const handleVisibilityChange = () => { + const visible = !document.hidden; + isVisibleRef.current = visible; + setIsVisible(visible); + }; + + const handleWindowBlur = () => { + isVisibleRef.current = false; + setIsVisible(false); + }; + + const handleWindowFocus = () => { + const visible = !document.hidden; + isVisibleRef.current = visible; + setIsVisible(visible); + }; + + document.addEventListener("visibilitychange", handleVisibilityChange); + window.addEventListener("blur", handleWindowBlur); + window.addEventListener("focus", handleWindowFocus); + const initialVisible = !document.hidden && document.hasFocus(); + isVisibleRef.current = initialVisible; + setIsVisible(initialVisible); + + return () => { + document.removeEventListener("visibilitychange", handleVisibilityChange); + window.removeEventListener("blur", handleWindowBlur); + window.removeEventListener("focus", handleWindowFocus); + }; + }, []); + + // Function to switch to a specific example + const switchToExample = (index: number) => { + if (index >= 0 && index < examples.length) { + setCurrentExample(index); + setCurrentLineIndex(0); + setDisplayedLines([]); + } + }; + + useEffect(() => { + // Pause animation when page is not visible + if (!isVisible) { + return; + } + + const example = examples[currentExample]; + if (!example) return; + + const baseLineDelay = 300; // delay between lines appearing + const currentLine = example.lines[currentLineIndex]; + // Add 100ms delay for empty lines + const lineDelay = + currentLine && currentLine.trim().length === 0 + ? baseLineDelay + 300 + : baseLineDelay; + + if (currentLineIndex < example.lines.length) { + // Show next line + const timer = setTimeout(() => { + if (isVisibleRef.current) { + setDisplayedLines((prev) => [ + ...prev, + example.lines[currentLineIndex], + ]); + setCurrentLineIndex((prev) => prev + 1); + } + }, lineDelay); + + return () => clearTimeout(timer); + } else { + // All lines displayed, wait then cycle to next example + const timer = setTimeout(() => { + if (isVisibleRef.current) { + setCurrentExample((prev) => (prev + 1) % examples.length); + setCurrentLineIndex(0); + setDisplayedLines([]); + } + }, EXAMPLE_DELAY); + + return () => clearTimeout(timer); + } + }, [currentExample, currentLineIndex, examples, isVisible]); + + const getLinePrefix = ( + line: string + ): { prefix: string; content: string; prefixColor: string } => { + if (line.startsWith("In [")) { + const match = line.match(/^(In \[\d+\]:\s*)(.*)$/); + if (match) { + return { + prefix: match[1], + content: match[2], + prefixColor: "text-theme-primary", + }; + } + } + if (line.startsWith("Out[")) { + const match = line.match(/^(Out\[\d+\]:\s*)(.*)$/); + if (match) { + return { + prefix: match[1], + content: match[2], + prefixColor: "text-theme-accent", + }; + } + } + if (line.startsWith(" ...:")) { + return { + prefix: " ...: ", + content: line.substring(8), + prefixColor: "text-gray-500 dark:text-gray-400", + }; + } + return { prefix: "", content: line, prefixColor: "" }; + }; + + const getLineColor = (line: string): string => { + if (line.startsWith("$")) { + return "text-theme-secondary"; + } + if (line.startsWith("Out[")) { + return "text-theme-accent"; + } + if (line.startsWith("IPython") || line.includes("Type")) { + return "text-gray-600 dark:text-gray-300"; + } + if (line.trim() === "") { + return "text-gray-500 dark:text-gray-400"; + } + return "text-gray-700 dark:text-gray-300"; + }; + + /** + * Highlight Python syntax in a line of code + */ + const highlightPython = (text: string): JSX.Element[] => { + if (!text.trim()) { + return [{text || "\u00A0"}]; + } + + const keywords = [ + "def", + "async", + "await", + "import", + "from", + "if", + "elif", + "else", + "return", + "for", + "in", + "as", + "and", + "or", + "not", + "True", + "False", + "None", + ]; + + // Find comment position (comments take priority) + const commentMatch = text.match(/#.*$/); + const commentIndex = commentMatch ? commentMatch.index! : text.length; + const codeText = text.slice(0, commentIndex); + const commentText = commentMatch ? commentMatch[0] : ""; + + // Match strings (single and double quoted) + const stringRegex = /(['"])(?:(?=(\\?))\2.)*?\1/g; + let stringMatch; + const stringMatches: Array<{ start: number; end: number; text: string }> = []; + while ((stringMatch = stringRegex.exec(codeText)) !== null) { + stringMatches.push({ + start: stringMatch.index, + end: stringMatch.index + stringMatch[0].length, + text: stringMatch[0], + }); + } + + // Match numbers + const numberRegex = /\b\d+\.?\d*\b/g; + let numberMatch; + const numberMatches: Array<{ start: number; end: number; text: string }> = []; + while ((numberMatch = numberRegex.exec(codeText)) !== null) { + numberMatches.push({ + start: numberMatch.index, + end: numberMatch.index + numberMatch[0].length, + text: numberMatch[0], + }); + } + + // Match keywords + const keywordRegex = new RegExp(`\\b(${keywords.join("|")})\\b`, "g"); + let keywordMatch; + const keywordMatches: Array<{ start: number; end: number; text: string }> = []; + while ((keywordMatch = keywordRegex.exec(codeText)) !== null) { + keywordMatches.push({ + start: keywordMatch.index, + end: keywordMatch.index + keywordMatch[0].length, + text: keywordMatch[0], + }); + } + + // Combine all matches and sort by position + const allMatches = [ + ...stringMatches.map((m) => ({ ...m, type: "string" })), + ...numberMatches.map((m) => ({ ...m, type: "number" })), + ...keywordMatches.map((m) => ({ ...m, type: "keyword" })), + ].sort((a, b) => a.start - b.start); + + // Remove overlapping matches (strings take priority, then numbers, then keywords) + const filteredMatches: typeof allMatches = []; + for (const match of allMatches) { + const overlaps = filteredMatches.some( + (existing) => + (match.start >= existing.start && match.start < existing.end) || + (match.end > existing.start && match.end <= existing.end) || + (match.start <= existing.start && match.end >= existing.end) + ); + if (!overlaps) { + filteredMatches.push(match); + } + } + + // Build parts array for the code part (before comment) + const resultParts: Array<{ text: string; type: string }> = []; + let currentIndex = 0; + filteredMatches.forEach((match) => { + if (match.start > currentIndex) { + resultParts.push({ + text: codeText.slice(currentIndex, match.start), + type: "text", + }); + } + resultParts.push({ text: match.text, type: match.type }); + currentIndex = match.end; + }); + if (currentIndex < codeText.length) { + resultParts.push({ + text: codeText.slice(currentIndex), + type: "text", + }); + } + + // If no matches were found, add the whole codeText as text + if (resultParts.length === 0 && codeText.length > 0) { + resultParts.push({ text: codeText, type: "text" }); + } + + // Add comment if it exists + if (commentText) { + resultParts.push({ text: commentText, type: "comment" }); + } + + if (resultParts.length === 0) { + resultParts.push({ text, type: "text" }); + } + + return resultParts.map((part, index) => { + const className = + part.type === "keyword" + ? "text-theme-primary" + : part.type === "string" + ? "text-theme-secondary" + : part.type === "number" + ? "text-theme-accent" + : part.type === "comment" + ? "text-gray-500 dark:text-gray-400 italic opacity-75" + : ""; + return ( + + {part.text} + + ); + }); + }; + + // Calculate max height based on the longest example + const maxLines = Math.max(...examples.map((ex) => ex.lines.length)); + const lineHeight = 1.25; // rem (20px for text-sm) + const padding = 1 * 2; // rem (top + bottom padding) + const controlsHeight = 2; // rem (window controls height) + const minHeight = `${maxLines * lineHeight + padding + controlsHeight}rem`; + + return ( +
        +
        + {/* macOS Window Controls */} +
        +
        +
        +
        +
        + + {/* Terminal Content */} +
        + {displayedLines.map((line, index) => { + const { prefix, content, prefixColor } = getLinePrefix(line); + const lineColor = getLineColor(line); + + // Check if this line should have syntax highlighting (Python code) + const isPythonCode = + line.startsWith("In [") || + line.startsWith(" ...:") || + (line.startsWith("Out[") && content.trim().length > 0); + + return ( +
        + {prefix && {prefix}} + {isPythonCode && content.trim() + ? highlightPython(content) + : content || "\u00A0"} +
        + ); + })} + {displayedLines.length === 0 && ( +
        $ ipython
        + )} +
        +
        + + {/* Indicator Dots */} +
        + {examples.map((example, index) => ( +
        +
        + ); +} diff --git a/src/components/ChristmasLights.tsx b/src/components/ChristmasLights.tsx new file mode 100644 index 0000000..0cdf80c --- /dev/null +++ b/src/components/ChristmasLights.tsx @@ -0,0 +1,155 @@ +import { useEffect, useRef } from 'react'; + +interface Sparkle { + x: number; + y: number; + size: number; + opacity: number; + twinkleTimer: number; + twinkleSpeed: number; + color: string; +} + +export default function ChristmasSparkles() { + const canvasRef = useRef(null); + const animationFrameRef = useRef(); + const sparklesRef = useRef([]); + const isVisibleRef = useRef(true); + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + const colors = ['#c8102e', '#006b3c', '#ffffff', '#ffd700']; + + const resizeCanvas = () => { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + }; + + resizeCanvas(); + window.addEventListener('resize', resizeCanvas); + + // Create sparkles scattered across the viewport + const createSparkles = () => { + sparklesRef.current = []; + const sparkleCount = Math.floor((canvas.width * canvas.height) / 15000); + for (let i = 0; i < sparkleCount; i++) { + sparklesRef.current.push({ + x: Math.random() * canvas.width, + y: Math.random() * canvas.height, + size: 3 + Math.random() * 4, + opacity: 0.3 + Math.random() * 0.7, + twinkleTimer: Math.random() * Math.PI * 2, + twinkleSpeed: 0.02 + Math.random() * 0.03, + color: colors[Math.floor(Math.random() * colors.length)], + }); + } + }; + + createSparkles(); + + const cleanup = () => { + window.removeEventListener('resize', resizeCanvas); + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + }; + + const drawSparkle = (ctx: CanvasRenderingContext2D, sparkle: Sparkle) => { + ctx.save(); + + // Update twinkle + sparkle.twinkleTimer += sparkle.twinkleSpeed; + const twinkle = Math.sin(sparkle.twinkleTimer) * 0.5 + 0.5; + const currentOpacity = sparkle.opacity * twinkle; + + // Draw sparkle as a star + ctx.translate(sparkle.x, sparkle.y); + ctx.globalAlpha = currentOpacity; + ctx.strokeStyle = sparkle.color; + ctx.fillStyle = sparkle.color; + ctx.lineWidth = 1.5; + + // Draw 4-pointed star + const size = sparkle.size; + ctx.beginPath(); + for (let i = 0; i < 4; i++) { + const angle = (i * Math.PI) / 2; + const x1 = Math.cos(angle) * size; + const y1 = Math.sin(angle) * size; + const x2 = Math.cos(angle + Math.PI / 4) * size * 0.5; + const y2 = Math.sin(angle + Math.PI / 4) * size * 0.5; + + if (i === 0) { + ctx.moveTo(x1, y1); + } else { + ctx.lineTo(x1, y1); + } + ctx.lineTo(x2, y2); + } + ctx.closePath(); + ctx.fill(); + ctx.stroke(); + + // Draw center dot + ctx.beginPath(); + ctx.arc(0, 0, size * 0.3, 0, Math.PI * 2); + ctx.fill(); + + ctx.restore(); + }; + + const handleVisibilityChange = () => { + isVisibleRef.current = !document.hidden; + }; + + const handleWindowBlur = () => { + isVisibleRef.current = false; + }; + + const handleWindowFocus = () => { + isVisibleRef.current = true; + }; + + document.addEventListener('visibilitychange', handleVisibilityChange); + window.addEventListener('blur', handleWindowBlur); + window.addEventListener('focus', handleWindowFocus); + isVisibleRef.current = !document.hidden && document.hasFocus(); + + const animate = () => { + // Pause animation when page is not visible + if (!isVisibleRef.current) { + animationFrameRef.current = requestAnimationFrame(animate); + return; + } + + ctx.clearRect(0, 0, canvas.width, canvas.height); + + sparklesRef.current.forEach((sparkle) => { + drawSparkle(ctx, sparkle); + }); + + animationFrameRef.current = requestAnimationFrame(animate); + }; + + animate(); + + return () => { + cleanup(); + document.removeEventListener('visibilitychange', handleVisibilityChange); + window.removeEventListener('blur', handleWindowBlur); + window.removeEventListener('focus', handleWindowFocus); + }; + }, []); + + return ( + + ); +} diff --git a/src/components/ColorThemeDropdown.tsx b/src/components/ColorThemeDropdown.tsx new file mode 100644 index 0000000..a8fa7e2 --- /dev/null +++ b/src/components/ColorThemeDropdown.tsx @@ -0,0 +1,146 @@ +import { useEffect, useState, useRef } from "react"; +import { themes, changeTheme, subscribeToThemeChanges, initializeThemeWatcher } from "../lib/themeUtils"; + +export default function ColorThemeDropdown() { + const [currentTheme, setCurrentTheme] = useState("default"); + const [isOpen, setIsOpen] = useState(false); + const [isMounted, setIsMounted] = useState(false); + const dropdownRef = useRef(null); + + useEffect(() => { + setIsMounted(true); + + // Initialize theme watcher (only once globally, but safe to call multiple times) + const watcherCleanup = initializeThemeWatcher(); + + // Subscribe to theme changes + const unsubscribe = subscribeToThemeChanges((themeId) => { + setCurrentTheme(themeId); + }); + + return () => { + unsubscribe(); + watcherCleanup(); + }; + }, []); + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if ( + dropdownRef.current && + !dropdownRef.current.contains(event.target as Node) + ) { + setIsOpen(false); + } + }; + + if (isOpen) { + document.addEventListener("mousedown", handleClickOutside); + } + + return () => { + document.removeEventListener("mousedown", handleClickOutside); + }; + }, [isOpen]); + + + const handleThemeChange = (themeId: string) => { + changeTheme(themeId); + setIsOpen(false); + }; + + if (!isMounted) return null; + + const currentThemeData = themes.find((t) => t.id === currentTheme) || themes[0]; + + return ( +
        + + + {isOpen && ( +
        +
        + {themes.map((theme) => ( + + ))} +
        +
        + )} +
        + ); +} diff --git a/src/components/ColorThemeSwitcher.tsx b/src/components/ColorThemeSwitcher.tsx new file mode 100644 index 0000000..24023a2 --- /dev/null +++ b/src/components/ColorThemeSwitcher.tsx @@ -0,0 +1,68 @@ +import { useEffect, useState } from 'react'; +import { themes, changeTheme, subscribeToThemeChanges, initializeThemeWatcher } from '../lib/themeUtils'; + +export default function ColorThemeSwitcher() { + const [currentTheme, setCurrentTheme] = useState('default'); + const [isMounted, setIsMounted] = useState(false); + + useEffect(() => { + setIsMounted(true); + + // Initialize theme watcher (only once globally) + const watcherCleanup = initializeThemeWatcher(); + + // Subscribe to theme changes + const unsubscribe = subscribeToThemeChanges((themeId) => { + setCurrentTheme(themeId); + }); + + return () => { + unsubscribe(); + watcherCleanup(); + }; + }, []); + + const handleThemeChange = (themeId: string) => { + changeTheme(themeId); + }; + + if (!isMounted) return null; + + return ( +
        + Color theme: +
        + {themes.map((theme) => ( + + ))} +
        +
        + ); +} diff --git a/src/components/ConditionalChristmas.tsx b/src/components/ConditionalChristmas.tsx new file mode 100644 index 0000000..5bf0882 --- /dev/null +++ b/src/components/ConditionalChristmas.tsx @@ -0,0 +1,40 @@ +import { useEffect, useState } from 'react'; +import ChristmasSparkles from './ChristmasLights'; + +export default function ConditionalChristmas() { + const [showChristmas, setShowChristmas] = useState(false); + + useEffect(() => { + const checkTheme = () => { + const theme = document.documentElement.getAttribute('data-color-theme'); + setShowChristmas(theme === 'christmas'); + }; + + // Check initial theme + checkTheme(); + + // Watch for theme changes + const observer = new MutationObserver(checkTheme); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-color-theme'], + }); + + // Also check localStorage changes + const handleStorageChange = () => { + checkTheme(); + }; + window.addEventListener('storage', handleStorageChange); + + // Poll for changes (fallback) + const interval = setInterval(checkTheme, 100); + + return () => { + observer.disconnect(); + window.removeEventListener('storage', handleStorageChange); + clearInterval(interval); + }; + }, []); + + return showChristmas ? : null; +} diff --git a/src/components/ConditionalOcean.tsx b/src/components/ConditionalOcean.tsx new file mode 100644 index 0000000..4f7e5c8 --- /dev/null +++ b/src/components/ConditionalOcean.tsx @@ -0,0 +1,40 @@ +import { useEffect, useState } from 'react'; +import OceanWaves from './OceanWaves'; + +export default function ConditionalOcean() { + const [showOcean, setShowOcean] = useState(false); + + useEffect(() => { + const checkTheme = () => { + const theme = document.documentElement.getAttribute('data-color-theme'); + setShowOcean(theme === 'ocean'); + }; + + // Check initial theme + checkTheme(); + + // Watch for theme changes + const observer = new MutationObserver(checkTheme); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-color-theme'], + }); + + // Also check localStorage changes + const handleStorageChange = () => { + checkTheme(); + }; + window.addEventListener('storage', handleStorageChange); + + // Poll for changes (fallback) + const interval = setInterval(checkTheme, 100); + + return () => { + observer.disconnect(); + window.removeEventListener('storage', handleStorageChange); + clearInterval(interval); + }; + }, []); + + return showOcean ? : null; +} diff --git a/src/components/ConditionalSnow.tsx b/src/components/ConditionalSnow.tsx new file mode 100644 index 0000000..ebdd766 --- /dev/null +++ b/src/components/ConditionalSnow.tsx @@ -0,0 +1,40 @@ +import { useEffect, useState } from 'react'; +import SnowEffect from './SnowEffect'; + +export default function ConditionalSnow() { + const [showSnow, setShowSnow] = useState(false); + + useEffect(() => { + const checkTheme = () => { + const theme = document.documentElement.getAttribute('data-color-theme'); + setShowSnow(theme === 'winter'); + }; + + // Check initial theme + checkTheme(); + + // Watch for theme changes + const observer = new MutationObserver(checkTheme); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-color-theme'], + }); + + // Also check localStorage changes (in case theme changes via another tab) + const handleStorageChange = () => { + checkTheme(); + }; + window.addEventListener('storage', handleStorageChange); + + // Poll for changes (fallback) + const interval = setInterval(checkTheme, 100); + + return () => { + observer.disconnect(); + window.removeEventListener('storage', handleStorageChange); + clearInterval(interval); + }; + }, []); + + return showSnow ? : null; +} diff --git a/src/components/Footer.astro b/src/components/Footer.astro new file mode 100644 index 0000000..b68fdda --- /dev/null +++ b/src/components/Footer.astro @@ -0,0 +1,76 @@ +--- +import ColorThemeSwitcher from './ColorThemeSwitcher'; +import { baseUrl } from '../lib/utils'; +// Footer component with links and copyright +const currentYear = new Date().getFullYear(); +--- + + diff --git a/src/components/GitHubContributors.tsx b/src/components/GitHubContributors.tsx new file mode 100644 index 0000000..c8bbee6 --- /dev/null +++ b/src/components/GitHubContributors.tsx @@ -0,0 +1,252 @@ +import { useEffect, useState } from 'react'; +import { baseUrl } from '../lib/utils'; + +type Contributor = { + login: string; + avatar_url: string; + html_url: string; + contributions: number; + name?: string; +}; + +type Maintainer = { + login: string; + avatar_url: string; + html_url: string; + name?: string; + bio?: string; + contributions?: number; +}; + +interface GitHubContributorsProps { + initialContributors: Contributor[]; + initialMaintainer: Maintainer | null; +} + +export default function GitHubContributors({ + initialContributors, + initialMaintainer, +}: GitHubContributorsProps) { + const [contributors, setContributors] = useState([]); + const [maintainer, setMaintainer] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [contributorsError, setContributorsError] = useState(false); + const [maintainerError, setMaintainerError] = useState(false); + // Data source is always 'static' since we don't fetch from client-side + const [dataSource] = useState<'static' | 'live'>('static'); + + useEffect(() => { + // Step 1: Initialize from static JSON file + const initializeFromJSON = async () => { + try { + console.log('[Build Data] 🔄 Initializing contributors/maintainer from static JSON file...'); + const response = await fetch(baseUrl('build-data-contributors.json')); + if (response.ok) { + const data = await response.json(); + let loaded = false; + if (data.contributors && Array.isArray(data.contributors) && data.contributors.length > 0) { + setContributors(data.contributors); + setContributorsError(false); + loaded = true; + } + if (data.maintainer) { + setMaintainer(data.maintainer); + setMaintainerError(false); + loaded = true; + } + if (loaded) { + setDataSource('static'); + setIsLoading(false); + console.log( + `[Build Data] ✓ Initialized from static JSON: ${data.contributors?.length || 0} contributors, maintainer: ${data.maintainer ? 'Yes' : 'No'}` + ); + return true; + } + } + } catch (error) { + console.error('[Build Data] ✗ Failed to initialize from static JSON:', error); + } + setIsLoading(false); + return false; + }; + + // No client-side fetching - GitHub API has CORS restrictions + // Data is only loaded from static JSON files generated at build time + initializeFromJSON(); + }, []); + + return ( + <> + {/* Current Maintainer */} +
        +

        + Current Maintainer + {isLoading && ( + (loading...) + )} +

        + {maintainerError && !maintainer ? ( +
        +

        + Unable to load maintainer information at this time. This may be due to GitHub API + rate limits. Please visit{' '} + + @Carreau's GitHub profile + {' '} + directly. +

        +
        + ) : maintainer ? ( +
        +
        + + {`${maintainer.name}'s + +
        + +

        + {maintainer.name} +

        +

        @{maintainer.login}

        +
        + {maintainer.contributions !== undefined && ( +

        + {maintainer.contributions}{' '} + {maintainer.contributions === 1 ? 'contribution' : 'contributions'} +

        + )} + {maintainer.bio && ( +

        {maintainer.bio}

        + )} +
        +
        +
        + ) : !maintainer ? ( +
        +

        + Unable to load maintainer information at this time. Please visit{' '} + + @Carreau's GitHub profile + {' '} + directly. +

        +
        + ) : null} +
        + + {/* Developers */} +
        +

        + Developers & Contributors +

        +

        + IPython is built and maintained by a vibrant community of developers and contributors + from around the world. Here are some of the key contributors to the project: +

        + {contributorsError && contributors.length === 0 ? ( +
        +

        + Unable to load contributors at this time. This may be due to GitHub API rate limits. +

        +

        + Please visit our{' '} + + GitHub contributors page + {' '} + to see all contributors. +

        +
        + ) : contributors.length > 0 ? ( + + ) : contributors.length === 0 ? ( +
        +

        + Unable to load contributors at this time. +

        +

        + Please visit our{' '} + + GitHub contributors page + {' '} + to see all contributors. +

        +
        + ) : null} +

        + Want to contribute? Check out our{' '} + + GitHub repository + {' '} + to get started! +

        +
        + + + ); +} diff --git a/src/components/GitHubPRCount.tsx b/src/components/GitHubPRCount.tsx new file mode 100644 index 0000000..75a634a --- /dev/null +++ b/src/components/GitHubPRCount.tsx @@ -0,0 +1,107 @@ +import { useEffect, useState } from 'react'; +import { baseUrl } from '../lib/utils'; + +interface GitHubPRCountProps { + initialCount: number | null; +} + +export default function GitHubPRCount({ initialCount }: GitHubPRCountProps) { + const [prCount, setPrCount] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [dataSource, setDataSource] = useState<'static' | 'live'>('static'); + + useEffect(() => { + // Step 1: Initialize from Astro endpoint + const initializeFromEndpoint = async () => { + try { + console.log('[Build Data] 🔄 Initializing PR count from static JSON file...'); + const response = await fetch(baseUrl('build-data-pr.json')); + if (response.ok) { + const data = await response.json(); + if (data.count !== null && data.count !== undefined) { + setPrCount(data.count); + setDataSource('static'); + setIsLoading(false); + console.log(`[Build Data] ✓ Initialized from static JSON: ${data.count} open PRs`); + return true; + } + } + } catch (error) { + console.error('[Build Data] ✗ Failed to initialize from static JSON:', error); + } + return false; + }; + + // Step 2: Try to update with direct GitHub API call + const updateFromGitHub = async () => { + setIsLoading(true); + console.log('[GitHub API] 🔄 Attempting to update PR count from GitHub API...'); + + try { + const response = await fetch( + 'https://api.github.com/search/issues?q=repo:ipython/ipython+type:pr+state:open' + ); + + if (response.ok) { + const data = await response.json(); + const count = data.total_count || 0; + setPrCount(count); + setDataSource('live'); + console.log(`[GitHub API] ✓ Updated from GitHub: ${count} open PRs`); + } else { + console.error(`[GitHub API] ✗ Could not reach GitHub API: ${response.status} ${response.statusText}`); + // Keep dataSource as 'static' since update failed + setDataSource('static'); + } + } catch (error) { + console.error('[GitHub API] ✗ Could not reach GitHub API:', error); + // Keep dataSource as 'static' since update failed + setDataSource('static'); + } finally { + setIsLoading(false); + } + }; + + // Initialize from endpoint, then try to update from GitHub + initializeFromEndpoint().then(() => { + // Try to update after a short delay + setTimeout(updateFromGitHub, 100); + }); + }, []); + + if (prCount === null) { + return null; + } + + return ( +
        +
        +
        +

        + Open Pull Requests + {dataSource === 'static' && ( + (static) + )} + {dataSource === 'live' && ( + (live) + )} + {isLoading && ( + (updating...) + )} +

        +

        {prCount}

        +
        + + + + + +
        +
        + ); +} diff --git a/src/components/Navigation.astro b/src/components/Navigation.astro new file mode 100644 index 0000000..ac9a2bf --- /dev/null +++ b/src/components/Navigation.astro @@ -0,0 +1,60 @@ +--- +import ThemeToggle from './ThemeToggle'; +import ColorThemeDropdown from './ColorThemeDropdown'; +import { baseUrl } from '../lib/utils'; +--- + + + + diff --git a/src/components/OceanWaves.tsx b/src/components/OceanWaves.tsx new file mode 100644 index 0000000..c9cfc75 --- /dev/null +++ b/src/components/OceanWaves.tsx @@ -0,0 +1,267 @@ +import { useEffect, useRef } from 'react'; + +interface Bubble { + x: number; + y: number; + size: number; + speed: number; + opacity: number; + drift: number; +} + +export default function OceanWaves() { + const canvasRef = useRef(null); + const animationFrameRef = useRef(); + const bubblesRef = useRef([]); + const waveOffsetRef = useRef(0); + const sectionDividersRef = useRef>([]); + const isVisibleRef = useRef(true); + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + const findSections = () => { + const sections = document.querySelectorAll('section, main > div'); + sectionDividersRef.current = []; + + sections.forEach((section, index) => { + if (index === 0) return; // Skip first section + const rect = section.getBoundingClientRect(); + const scrollY = window.scrollY; + const sectionTop = rect.top + scrollY; + + // Check if section has different background + const computedStyle = window.getComputedStyle(section); + const bgColor = computedStyle.backgroundColor; + const prevSection = sections[index - 1] as HTMLElement; + const prevBgColor = prevSection ? window.getComputedStyle(prevSection).backgroundColor : ''; + + // Add divider if sections have different backgrounds or are substantial + if (bgColor !== prevBgColor || rect.height > 200) { + sectionDividersRef.current.push({ + y: sectionTop, + inverted: index % 2 === 0, // Alternate wave direction + }); + } + }); + }; + + const resizeCanvas = () => { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + + // Create bubbles (distribute across viewport) + bubblesRef.current = []; + const bubbleCount = Math.floor((canvas.width * canvas.height) / 20000); + for (let i = 0; i < bubbleCount; i++) { + bubblesRef.current.push({ + x: Math.random() * canvas.width, + y: Math.random() * canvas.height, + size: 2 + Math.random() * 8, + speed: 0.5 + Math.random() * 1.5, + opacity: 0.2 + Math.random() * 0.4, + drift: (Math.random() - 0.5) * 0.5, + }); + } + + findSections(); + }; + + resizeCanvas(); + window.addEventListener('resize', resizeCanvas); + window.addEventListener('scroll', findSections, { passive: true }); + + // Update sections periodically + const sectionInterval = setInterval(findSections, 1000); + + const drawWave = (ctx: CanvasRenderingContext2D, screenY: number, amplitude: number, frequency: number, speed: number, color: string, opacity: number, inverted: boolean = false) => { + ctx.save(); + ctx.beginPath(); + + const direction = inverted ? -1 : 1; + const waveSpeed = speed * direction; + + // Reduced gradient height - only 80px above/below the wave + const gradientHeight = 80; + const gradientStart = inverted ? screenY + amplitude : screenY - amplitude; + const gradientEnd = inverted ? screenY + amplitude - gradientHeight : screenY - amplitude + gradientHeight; + + ctx.moveTo(0, screenY); + + for (let x = 0; x <= canvas.width; x += 2) { + const waveY = screenY + Math.sin((x * frequency + waveOffsetRef.current * waveSpeed) * 0.01) * amplitude * direction; + ctx.lineTo(x, waveY); + } + + if (inverted) { + // Wave going up - fill above (limited height) + ctx.lineTo(canvas.width, gradientEnd); + ctx.lineTo(0, gradientEnd); + } else { + // Wave going down - fill below (limited height) + ctx.lineTo(canvas.width, gradientEnd); + ctx.lineTo(0, gradientEnd); + } + ctx.closePath(); + + const gradient = ctx.createLinearGradient(0, gradientStart, 0, gradientEnd); + gradient.addColorStop(0, color + Math.floor(opacity * 255).toString(16).padStart(2, '0')); + gradient.addColorStop(1, color + '00'); + + ctx.fillStyle = gradient; + ctx.fill(); + ctx.restore(); + }; + + const drawBubble = (ctx: CanvasRenderingContext2D, bubble: Bubble) => { + ctx.save(); + ctx.globalAlpha = bubble.opacity; + + const scrollY = window.scrollY; + const screenX = bubble.x; + const screenY = bubble.y - scrollY; + + // Draw bubble + const gradient = ctx.createRadialGradient( + screenX - bubble.size * 0.3, + screenY - bubble.size * 0.3, + 0, + screenX, + screenY, + bubble.size + ); + gradient.addColorStop(0, 'rgba(255, 255, 255, 0.8)'); + gradient.addColorStop(0.7, 'rgba(0, 212, 255, 0.3)'); + gradient.addColorStop(1, 'rgba(0, 212, 255, 0)'); + + ctx.fillStyle = gradient; + ctx.beginPath(); + ctx.arc(screenX, screenY, bubble.size, 0, Math.PI * 2); + ctx.fill(); + + // Draw highlight + ctx.fillStyle = 'rgba(255, 255, 255, 0.6)'; + ctx.beginPath(); + ctx.arc(screenX - bubble.size * 0.3, screenY - bubble.size * 0.3, bubble.size * 0.3, 0, Math.PI * 2); + ctx.fill(); + + ctx.restore(); + }; + + const handleVisibilityChange = () => { + isVisibleRef.current = !document.hidden; + }; + + const handleWindowBlur = () => { + isVisibleRef.current = false; + }; + + const handleWindowFocus = () => { + isVisibleRef.current = true; + }; + + document.addEventListener('visibilitychange', handleVisibilityChange); + window.addEventListener('blur', handleWindowBlur); + window.addEventListener('focus', handleWindowFocus); + isVisibleRef.current = !document.hidden && document.hasFocus(); + + const animate = () => { + // Pause animation when page is not visible + if (!isVisibleRef.current) { + animationFrameRef.current = requestAnimationFrame(animate); + return; + } + + ctx.clearRect(0, 0, canvas.width, canvas.height); + + // Update wave offset + waveOffsetRef.current += 1; + + const scrollY = window.scrollY; + + // Draw waves at section dividers + sectionDividersRef.current.forEach((divider) => { + const dividerScreenY = divider.y - scrollY; + + // Only draw if in or near viewport (reduced range to match smaller gradient) + if (dividerScreenY > -100 && dividerScreenY < window.innerHeight + 100) { + if (divider.inverted) { + // Wave going up - more vibrant colors + drawWave(ctx, dividerScreenY, 18, 0.5, 1.5, '#00EFFF', 0.25, true); + drawWave(ctx, dividerScreenY - 15, 15, 0.6, 1.2, '#00C8FF', 0.2, true); + drawWave(ctx, dividerScreenY - 30, 12, 0.7, 1, '#00A8FF', 0.15, true); + } else { + // Wave going down - more vibrant colors + drawWave(ctx, dividerScreenY, 18, 0.5, 1.5, '#00EFFF', 0.25, false); + drawWave(ctx, dividerScreenY + 15, 15, 0.6, 1.2, '#00C8FF', 0.2, false); + drawWave(ctx, dividerScreenY + 30, 12, 0.7, 1, '#00A8FF', 0.15, false); + } + } + }); + + // Draw waves at the bottom of document (footer) + const docHeight = Math.max(document.documentElement.scrollHeight, window.innerHeight); + const bottomWaveDocY = docHeight - 100; + const bottomWaveScreenY = bottomWaveDocY - scrollY; + + // Only draw if in or near viewport (reduced range) + if (bottomWaveScreenY > -100 && bottomWaveScreenY < window.innerHeight + 100) { + drawWave(ctx, bottomWaveScreenY, 20, 0.5, 2, '#00EFFF', 0.28); + drawWave(ctx, bottomWaveScreenY + 20, 16, 0.6, 1.5, '#00C8FF', 0.22); + drawWave(ctx, bottomWaveScreenY + 40, 14, 0.7, 1, '#00A8FF', 0.18); + } + + // Update and draw bubbles (viewport-relative) + bubblesRef.current.forEach((bubble) => { + // Update bubble position (viewport coordinates) + bubble.y -= bubble.speed; + bubble.x += bubble.drift; + + // Reset if off screen + if (bubble.y < -bubble.size) { + bubble.y = window.innerHeight + bubble.size; + bubble.x = Math.random() * canvas.width; + } + if (bubble.y > window.innerHeight + bubble.size) { + bubble.y = -bubble.size; + bubble.x = Math.random() * canvas.width; + } + + // Wrap horizontally + if (bubble.x < -bubble.size) bubble.x = canvas.width + bubble.size; + if (bubble.x > canvas.width + bubble.size) bubble.x = -bubble.size; + + // Draw bubble (already in viewport coordinates) + drawBubble(ctx, bubble); + }); + + animationFrameRef.current = requestAnimationFrame(animate); + }; + + animate(); + + return () => { + window.removeEventListener('resize', resizeCanvas); + window.removeEventListener('scroll', findSections); + document.removeEventListener('visibilitychange', handleVisibilityChange); + window.removeEventListener('blur', handleWindowBlur); + window.removeEventListener('focus', handleWindowFocus); + clearInterval(sectionInterval); + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + }; + }, []); + + return ( + + ); +} diff --git a/src/components/PageHeader.astro b/src/components/PageHeader.astro new file mode 100644 index 0000000..b650084 --- /dev/null +++ b/src/components/PageHeader.astro @@ -0,0 +1,17 @@ +--- +interface Props { + title: string; + description?: string; +} + +const { title, description } = Astro.props; +--- + +
        +
        +

        {title}

        + {description && ( +

        {description}

        + )} +
        +
        diff --git a/src/components/PyPIRelease.tsx b/src/components/PyPIRelease.tsx new file mode 100644 index 0000000..04ca2c9 --- /dev/null +++ b/src/components/PyPIRelease.tsx @@ -0,0 +1,162 @@ +import { useEffect, useState } from "react"; +import { baseUrl } from "../lib/utils"; + +interface PyPIReleaseProps { + initialVersion: string | null; + initialReleaseDate: string | null; +} + +export default function PyPIRelease({ + initialVersion, + initialReleaseDate, +}: PyPIReleaseProps) { + const [version, setVersion] = useState(null); + const [releaseDate, setReleaseDate] = useState(null); + const [isLoading, setIsLoading] = useState(true); + const [dataSource, setDataSource] = useState<"static" | "live">("static"); + + useEffect(() => { + // Step 1: Initialize from static JSON file + const initializeFromJSON = async () => { + try { + console.log( + "[Build Data] 🔄 Initializing PyPI data from static JSON file..." + ); + const response = await fetch(baseUrl("build-data-pypi.json")); + if (response.ok) { + const data = await response.json(); + if (data.version) { + setVersion(data.version); + setReleaseDate(data.releaseDate); + setDataSource("static"); + setIsLoading(false); + console.log( + `[Build Data] ✓ Initialized from static JSON: v${data.version} (${ + data.releaseDate || "date unknown" + })` + ); + return true; + } + } + } catch (error) { + console.error( + "[Build Data] ✗ Failed to initialize from static JSON:", + error + ); + } + setIsLoading(false); + return false; + }; + + // Step 2: Try to update with direct PyPI API call + const updateFromPyPI = async () => { + setIsLoading(true); + console.log( + "[PyPI API] 🔄 Attempting to update PyPI data from PyPI API..." + ); + + try { + const response = await fetch("https://pypi.org/pypi/ipython/json"); + + if (response.ok) { + const data = await response.json(); + const newVersion = data.info.version; + const releases = data.releases[newVersion]; + let newReleaseDate: string | null = null; + + if (releases && releases.length > 0) { + const latestRelease = releases[releases.length - 1]; + if (latestRelease.upload_time) { + const date = new Date(latestRelease.upload_time); + newReleaseDate = date.toLocaleDateString("en-US", { + year: "numeric", + month: "long", + day: "numeric", + }); + } + } + + setVersion(newVersion); + setReleaseDate(newReleaseDate); + setDataSource("live"); + console.log( + `[PyPI API] ✓ Updated from PyPI: v${newVersion} (${ + newReleaseDate || "date unknown" + })` + ); + } else { + console.error( + `[PyPI API] ✗ Could not reach PyPI API: ${response.status} ${response.statusText}` + ); + // Don't change dataSource - keep it as 'static' since update failed + } + } catch (error) { + console.error("[PyPI API] ✗ Could not reach PyPI API:", error); + // Don't change dataSource - keep it as 'static' since update failed + } finally { + setIsLoading(false); + } + }; + + // Initialize from JSON, then try to update from PyPI + initializeFromJSON().then((initialized) => { + if (initialized) { + // Only try to update if we successfully initialized + setTimeout(updateFromPyPI, 100); + } + }); + }, []); + + if (!version) { + return null; + } + + return ( +
        +
        +
        +

        + Latest Release + {dataSource === "static" && ( + (static) + )} + {dataSource === "live" && ( + (live) + )} + {isLoading && ( + (updating...) + )} +

        +

        + v{version} +

        + {releaseDate && ( +

        + Released {releaseDate} +

        + )} +
        + + + + + +
        +
        + ); +} diff --git a/src/components/SnowEffect.tsx b/src/components/SnowEffect.tsx new file mode 100644 index 0000000..7fa06a2 --- /dev/null +++ b/src/components/SnowEffect.tsx @@ -0,0 +1,478 @@ +import { useEffect, useRef } from 'react'; + +interface Snowflake { + x: number; + y: number; + size: number; + speed: number; + opacity: number; + sway: number; + swaySpeed: number; + rotation: number; + rotationSpeed: number; + sparkleTimer: number; + stuck?: boolean; + stuckElement?: HTMLElement; + stuckX?: number; // Relative to element + stuckY?: number; // Relative to element top +} + +interface Accumulation { + element: HTMLElement; + stuckFlakes: Snowflake[]; + maxAmount: number; +} + +export default function SnowEffect() { + const canvasRef = useRef(null); + const animationFrameRef = useRef(); + const snowflakesRef = useRef([]); + const windRef = useRef(0); + const accumulationsRef = useRef>(new Map()); + const isVisibleRef = useRef(true); + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + + const ctx = canvas.getContext('2d'); + if (!ctx) return; + + // Create snowflakes function + const createSnowflake = (canvas: HTMLCanvasElement): Snowflake => ({ + x: Math.random() * canvas.width, + y: Math.random() * canvas.height - canvas.height, // Start above viewport + size: Math.random() * 4 + 1.5, + speed: Math.random() * 2.5 + 0.8, + opacity: Math.random() * 0.6 + 0.4, + sway: Math.random() * Math.PI * 2, + swaySpeed: Math.random() * 0.03 + 0.015, + rotation: Math.random() * Math.PI * 2, + rotationSpeed: (Math.random() - 0.5) * 0.05, + sparkleTimer: Math.random() * 100, + }); + + // Set canvas size + const resizeCanvas = () => { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + // Only recreate non-stuck snowflakes on resize + const activeCount = snowflakesRef.current.filter(f => !f.stuck).length; + const targetCount = Math.floor((canvas.width * canvas.height) / 12000); + if (activeCount < targetCount) { + const needed = targetCount - activeCount; + for (let i = 0; i < needed; i++) { + snowflakesRef.current.push(createSnowflake(canvas)); + } + } + }; + resizeCanvas(); + window.addEventListener('resize', resizeCanvas); + + // Initialize snowflakes + const snowflakeCount = Math.floor((canvas.width * canvas.height) / 12000); + snowflakesRef.current = Array.from({ length: snowflakeCount }, () => createSnowflake(canvas)); + + // Find elements that can accumulate snow + const findAccumulationTargets = (): HTMLElement[] => { + const targets: HTMLElement[] = []; + + // Find buttons (a tags with button-like styling, button elements) + document.querySelectorAll('a[class*="px-"], button, a[class*="py-"]').forEach((el) => { + if (el instanceof HTMLElement) { + const rect = el.getBoundingClientRect(); + // Only include visible elements with reasonable size + if (rect.width > 50 && rect.height > 20 && rect.top < window.innerHeight && rect.bottom > 0) { + targets.push(el); + } + } + }); + + // Find terminals and code blocks (pre elements, AnimatedTerminal containers) + // AnimatedTerminal has: bg-gray-50 dark:bg-gray-900 rounded-lg font-mono + // Also look for divs containing the macOS window controls (red/yellow/green circles) + document.querySelectorAll('pre, code, div[class*="bg-gray-50"][class*="rounded-lg"], div[class*="bg-gray-900"][class*="rounded-lg"]').forEach((el) => { + if (el instanceof HTMLElement) { + const rect = el.getBoundingClientRect(); + // Check if it looks like a terminal/code block (has reasonable size and font-mono or contains window controls) + const hasWindowControls = el.querySelector('div[class*="bg-red-500"], div[class*="bg-yellow-500"], div[class*="bg-green-500"]'); + const hasFontMono = el.classList.contains('font-mono') || window.getComputedStyle(el).fontFamily.includes('mono'); + if (rect.width > 100 && rect.height > 50 && rect.top < window.innerHeight && rect.bottom > 0 && (hasWindowControls || hasFontMono)) { + targets.push(el); + } + } + }); + + // Find card-like containers (divs with rounded corners and padding) + document.querySelectorAll('div[class*="rounded-lg"], div[class*="rounded-xl"], div[class*="rounded-md"]').forEach((el) => { + if (el instanceof HTMLElement) { + const rect = el.getBoundingClientRect(); + // Only include substantial containers, not tiny icons + if (rect.width > 150 && rect.height > 80 && rect.top < window.innerHeight && rect.bottom > 0) { + // Check if it's not already added + if (!targets.includes(el)) { + targets.push(el); + } + } + } + }); + + return targets; + }; + + // Initialize accumulations + const updateAccumulationTargets = () => { + const targets = findAccumulationTargets(); + const currentMap = accumulationsRef.current; + + // Remove elements that are no longer in the DOM + currentMap.forEach((acc, element) => { + if (!document.contains(element)) { + // Unstick all flakes from this element + acc.stuckFlakes.forEach((flake) => { + flake.stuck = false; + flake.stuckElement = undefined; + // Add back to active flakes if they're still valid + if (flake.y < canvas.height + 100) { + snowflakesRef.current.push(flake); + } + }); + currentMap.delete(element); + // Remove accumulation style + element.style.position = ''; + element.style.overflow = ''; + const container = element.querySelector('.snow-accumulation-container'); + if (container) container.remove(); + } + }); + + // Add new elements + targets.forEach((element) => { + if (!currentMap.has(element)) { + currentMap.set(element, { + element, + stuckFlakes: [], + maxAmount: Math.min(element.offsetHeight * 0.3, 30), // Max 30% of height or 30px + }); + + // Set up element for accumulation overlay + const computedStyle = window.getComputedStyle(element); + if (computedStyle.position === 'static') { + element.style.position = 'relative'; + } + element.style.overflow = 'visible'; // Changed to visible so flakes can be seen + } + }); + }; + + // Check if snowflake is over an element + const isOverElement = (x: number, y: number, element: HTMLElement): boolean => { + const rect = element.getBoundingClientRect(); + return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom; + }; + + // Render stuck snowflakes on elements + const renderStuckFlakes = (acc: Accumulation) => { + const container = acc.element.querySelector('.snow-accumulation-container') as HTMLElement; + + if (acc.stuckFlakes.length === 0) { + if (container) container.remove(); + return; + } + + let flakesContainer = container; + if (!flakesContainer) { + flakesContainer = document.createElement('div'); + flakesContainer.className = 'snow-accumulation-container'; + flakesContainer.style.cssText = ` + position: absolute; + top: 0; + left: 0; + right: 0; + pointer-events: none; + z-index: 1000; + `; + acc.element.appendChild(flakesContainer); + } + + // Clear and re-render all stuck flakes + flakesContainer.innerHTML = ''; + + acc.stuckFlakes.forEach((flake) => { + if (flake.stuckX === undefined || flake.stuckY === undefined) return; + + const flakeDiv = document.createElement('div'); + flakeDiv.style.cssText = ` + position: absolute; + left: ${flake.stuckX}px; + top: ${flake.stuckY}px; + width: ${flake.size * 2}px; + height: ${flake.size * 2}px; + opacity: ${flake.opacity}; + pointer-events: none; + transform: translate(-50%, 0); + `; + + // Create SVG snowflake + const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + svg.setAttribute('width', `${flake.size * 2}`); + svg.setAttribute('height', `${flake.size * 2}`); + svg.setAttribute('viewBox', `0 0 ${flake.size * 2} ${flake.size * 2}`); + + const circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); + circle.setAttribute('cx', `${flake.size}`); + circle.setAttribute('cy', `${flake.size}`); + circle.setAttribute('r', `${flake.size}`); + circle.setAttribute('fill', 'white'); + svg.appendChild(circle); + + // Add star shape for larger flakes + if (flake.size > 2) { + for (let i = 0; i < 6; i++) { + const line = document.createElementNS('http://www.w3.org/2000/svg', 'line'); + line.setAttribute('x1', `${flake.size}`); + line.setAttribute('y1', `${flake.size}`); + line.setAttribute('x2', `${flake.size}`); + line.setAttribute('y2', '0'); + line.setAttribute('stroke', 'white'); + line.setAttribute('stroke-width', '1'); + line.setAttribute('transform', `rotate(${i * 60} ${flake.size} ${flake.size})`); + svg.appendChild(line); + } + } + + flakeDiv.appendChild(svg); + flakesContainer.appendChild(flakeDiv); + }); + }; + + updateAccumulationTargets(); + // Update targets periodically (in case new elements are added) + const targetsInterval = setInterval(updateAccumulationTargets, 2000); + + // Draw a more detailed snowflake + const drawSnowflake = (ctx: CanvasRenderingContext2D, x: number, y: number, size: number, rotation: number, opacity: number) => { + ctx.save(); + ctx.translate(x, y); + ctx.rotate(rotation); + ctx.globalAlpha = opacity; + + // Main circle + ctx.beginPath(); + ctx.arc(0, 0, size, 0, Math.PI * 2); + ctx.fillStyle = 'rgba(255, 255, 255, 0.9)'; + ctx.fill(); + + // Add sparkle effect + if (Math.random() > 0.95) { + ctx.shadowBlur = 15; + ctx.shadowColor = 'rgba(173, 216, 230, 0.8)'; + ctx.fill(); + ctx.shadowBlur = 0; + } + + // Draw 6-pointed star shape for larger flakes + if (size > 2) { + ctx.strokeStyle = 'rgba(255, 255, 255, 0.8)'; + ctx.lineWidth = 1; + for (let i = 0; i < 6; i++) { + ctx.beginPath(); + ctx.moveTo(0, 0); + ctx.lineTo(0, size * 1.5); + ctx.stroke(); + ctx.rotate(Math.PI / 3); + } + } + + ctx.restore(); + }; + + const handleVisibilityChange = () => { + isVisibleRef.current = !document.hidden; + }; + + const handleWindowBlur = () => { + isVisibleRef.current = false; + }; + + const handleWindowFocus = () => { + isVisibleRef.current = true; + }; + + document.addEventListener('visibilitychange', handleVisibilityChange); + window.addEventListener('blur', handleWindowBlur); + window.addEventListener('focus', handleWindowFocus); + isVisibleRef.current = !document.hidden && document.hasFocus(); + + // Animation loop + const animate = () => { + // Pause animation when page is not visible + if (!isVisibleRef.current) { + animationFrameRef.current = requestAnimationFrame(animate); + return; + } + + ctx.clearRect(0, 0, canvas.width, canvas.height); + + // Gentle wind effect + windRef.current += (Math.random() - 0.5) * 0.1; + windRef.current = Math.max(-1, Math.min(1, windRef.current)); + + // Update falling snowflakes and check for collisions + const activeFlakes: Snowflake[] = []; + + snowflakesRef.current.forEach((flake) => { + // Skip if already stuck + if (flake.stuck) { + return; + } + + // Update position + const prevY = flake.y; + flake.y += flake.speed; + flake.sway += flake.swaySpeed; + flake.rotation += flake.rotationSpeed; + flake.sparkleTimer += 0.1; + + // Wind effect + flake.x += Math.sin(flake.sway) * 0.8 + windRef.current * 0.3; + + // Check collision with accumulation targets + let stuck = false; + accumulationsRef.current.forEach((acc) => { + if (stuck) return; + + const rect = acc.element.getBoundingClientRect(); + + // Only check if element is visible and in viewport + if (rect.width === 0 || rect.height === 0) return; + if (rect.bottom < 0 || rect.top > window.innerHeight) return; // Element not in viewport + + // Check if snowflake is hitting the top of the element + // Canvas coordinates are viewport-relative (fixed position) + // getBoundingClientRect() also returns viewport-relative coordinates + const elementTop = rect.top; + const elementLeft = rect.left; + + // Check collision: flake must be horizontally over the element + // and vertically crossing from above to at/below the top + const horizontalOverlap = flake.x >= elementLeft - flake.size && flake.x <= elementLeft + rect.width + flake.size; + // Check if flake is crossing the top edge of the element + const verticalCrossing = prevY < elementTop && flake.y >= elementTop - 3; // Allow small overlap + const withinMaxHeight = flake.y <= elementTop + acc.maxAmount; + + if (horizontalOverlap && verticalCrossing && withinMaxHeight) { + // Stick the flake + flake.stuck = true; + flake.stuckElement = acc.element; + // Position relative to element's left edge and top + flake.stuckX = flake.x - elementLeft; + // Stack flakes - place new flake on top of existing ones, starting at the very top + const existingHeight = acc.stuckFlakes.reduce((max, f) => { + const fY = (f.stuckY ?? 0) + (f.size * 2); + return Math.max(max, fY); + }, 0); + // Start stacking from the very top (0), but allow stacking up to maxAmount + // First flake goes at top (0), subsequent ones stack on top + flake.stuckY = Math.min(existingHeight, acc.maxAmount - flake.size * 2); + + // Add to accumulation + acc.stuckFlakes.push(flake); + + // Limit accumulation height - remove oldest flakes + if (acc.stuckFlakes.length > 50) { + const removed = acc.stuckFlakes.shift(); + if (removed) { + removed.stuck = false; + removed.stuckElement = undefined; + removed.stuckX = undefined; + removed.stuckY = undefined; + } + } + + stuck = true; + } + }); + + if (!stuck) { + // Reset if off screen + if (flake.y > canvas.height + 10) { + flake.y = -10; + flake.x = Math.random() * canvas.width; + flake.sway = Math.random() * Math.PI * 2; + } + + // Wrap around horizontally + if (flake.x < -10) flake.x = canvas.width + 10; + if (flake.x > canvas.width + 10) flake.x = -10; + + activeFlakes.push(flake); + + // Pulsing opacity for sparkle effect + const sparkleOpacity = flake.opacity + Math.sin(flake.sparkleTimer) * 0.2; + + // Draw snowflake + drawSnowflake(ctx, flake.x, flake.y, flake.size, flake.rotation, Math.max(0.3, Math.min(1, sparkleOpacity))); + } + }); + + // Update active flakes list (remove stuck ones) + snowflakesRef.current = activeFlakes; + + // Spawn new flakes to maintain target count + const targetCount = Math.floor((canvas.width * canvas.height) / 12000); + const currentActiveCount = activeFlakes.length; + if (currentActiveCount < targetCount) { + const needed = targetCount - currentActiveCount; + for (let i = 0; i < needed; i++) { + activeFlakes.push(createSnowflake(canvas)); + } + snowflakesRef.current = activeFlakes; + } + + // Render stuck flakes on elements + accumulationsRef.current.forEach((acc) => { + // Gradually remove some stuck flakes (melting effect) + if (Math.random() > 0.995 && acc.stuckFlakes.length > 0) { + const removed = acc.stuckFlakes.shift(); + if (removed) { + removed.stuck = false; + removed.stuckElement = undefined; + } + } + + renderStuckFlakes(acc); + }); + + animationFrameRef.current = requestAnimationFrame(animate); + }; + + animate(); + + return () => { + window.removeEventListener('resize', resizeCanvas); + document.removeEventListener('visibilitychange', handleVisibilityChange); + window.removeEventListener('blur', handleWindowBlur); + window.removeEventListener('focus', handleWindowFocus); + clearInterval(targetsInterval); + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + // Clean up accumulation overlays + accumulationsRef.current.forEach((acc) => { + const container = acc.element.querySelector('.snow-accumulation-container'); + if (container) container.remove(); + acc.element.style.position = ''; + acc.element.style.overflow = ''; + }); + }; + }, []); + + return ( + + ); +} diff --git a/src/components/SunBackground.tsx b/src/components/SunBackground.tsx new file mode 100644 index 0000000..f6c4466 --- /dev/null +++ b/src/components/SunBackground.tsx @@ -0,0 +1,636 @@ +// Sun shader implementation based on: +// https://sangillee.com/2024-06-29-create-realistic-sun-with-shaders/ +// Uses exact shaders from the article with 3D sphere geometry + +import { useEffect, useRef, useState } from "react"; + +// Generate sphere geometry +function createSphere(radius: number, segments: number) { + const vertices: number[] = []; + const normals: number[] = []; + const indices: number[] = []; + + for (let lat = 0; lat <= segments; lat++) { + const theta = (lat * Math.PI) / segments; + const sinTheta = Math.sin(theta); + const cosTheta = Math.cos(theta); + + for (let lon = 0; lon <= segments; lon++) { + const phi = (lon * 2 * Math.PI) / segments; + const sinPhi = Math.sin(phi); + const cosPhi = Math.cos(phi); + + const x = cosPhi * sinTheta; + const y = cosTheta; + const z = sinPhi * sinTheta; + + vertices.push(radius * x, radius * y, radius * z); + normals.push(x, y, z); + } + } + + for (let lat = 0; lat < segments; lat++) { + for (let lon = 0; lon < segments; lon++) { + const first = lat * (segments + 1) + lon; + const second = first + segments + 1; + + indices.push(first, second, first + 1); + indices.push(second, second + 1, first + 1); + } + } + + return { vertices, normals, indices }; +} + +export default function SunBackground() { + const canvasRef = useRef(null); + const glRef = useRef(null); + const programRef = useRef(null); + const animationFrameRef = useRef(); + const timeRef = useRef(0); + const isVisibleRef = useRef(true); + const [showSun, setShowSun] = useState(false); + const [isDark, setIsDark] = useState(false); + + useEffect(() => { + if (typeof document === "undefined") return; + + const checkTheme = () => { + const theme = document.documentElement.getAttribute("data-color-theme"); + setShowSun(theme === "sun"); + setIsDark(document.documentElement.classList.contains("dark")); + }; + + checkTheme(); + + const observer = new MutationObserver(checkTheme); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ["data-color-theme", "class"], + }); + + const handleStorageChange = () => { + checkTheme(); + }; + window.addEventListener("storage", handleStorageChange); + + const interval = setInterval(checkTheme, 100); + + return () => { + observer.disconnect(); + window.removeEventListener("storage", handleStorageChange); + clearInterval(interval); + }; + }, []); + + useEffect(() => { + if (!showSun) return; + + const canvas = canvasRef.current; + if (!canvas) return; + + const gl = canvas.getContext("webgl"); + if (!gl) { + console.error("WebGL not supported or context creation failed"); + return; + } + + glRef.current = gl; + + // Vertex shader - exact from article + const vertexShaderSource = ` + attribute vec3 position; + attribute vec3 normal; + + uniform mat4 modelMatrix; + uniform mat4 viewMatrix; + uniform mat4 projectionMatrix; + uniform mat3 normalMatrix; + + varying vec3 vPosition; + varying vec3 vPositionModel; // Original model-space position for texture + varying vec3 vNormal; + varying vec3 vNormalModel; + varying vec3 vNormalView; + + void main() { + vec4 worldPosition = modelMatrix * vec4(position, 1.0); + vec4 viewPosition = viewMatrix * worldPosition; + + // Use the actual sphere surface position (normalized world position) + vPosition = normalize(worldPosition.xyz); + // Keep original model-space position for texture coordinates (doesn't rotate) + vPositionModel = normalize(position); + vNormal = normalize(mat3(modelMatrix) * normal); + vNormalModel = normal; + vNormalView = normalize(normalMatrix * normal); + + gl_Position = projectionMatrix * viewPosition; + } + `; + + // Fragment shader - exact from article + const fragmentShaderSource = ` + precision highp float; + uniform float u_time; + varying vec3 vPosition; + varying vec3 vPositionModel; // Original model-space position for texture + varying vec3 vNormal; + varying vec3 vNormalModel; + varying vec3 vNormalView; + + float random (in vec3 st) { + return fract(sin(dot(st,vec3(12.9898,78.233,23.112)))*12943.145); + } + + float noise (in vec3 _pos) { + vec3 i_pos = floor(_pos); + vec3 f_pos = fract(_pos); + + float i_time = floor(u_time*0.2); + float f_time = fract(u_time*0.2); + + // Four corners in 2D of a tile + float aa = random(i_pos + i_time); + float ab = random(i_pos + i_time + vec3(1., 0., 0.)); + float ac = random(i_pos + i_time + vec3(0., 1., 0.)); + float ad = random(i_pos + i_time + vec3(1., 1., 0.)); + float ae = random(i_pos + i_time + vec3(0., 0., 1.)); + float af = random(i_pos + i_time + vec3(1., 0., 1.)); + float ag = random(i_pos + i_time + vec3(0., 1., 1.)); + float ah = random(i_pos + i_time + vec3(1., 1., 1.)); + + float ba = random(i_pos + (i_time + 1.)); + float bb = random(i_pos + (i_time + 1.) + vec3(1., 0., 0.)); + float bc = random(i_pos + (i_time + 1.) + vec3(0., 1., 0.)); + float bd = random(i_pos + (i_time + 1.) + vec3(1., 1., 0.)); + float be = random(i_pos + (i_time + 1.) + vec3(0., 0., 1.)); + float bf = random(i_pos + (i_time + 1.) + vec3(1., 0., 1.)); + float bg = random(i_pos + (i_time + 1.) + vec3(0., 1., 1.)); + float bh = random(i_pos + (i_time + 1.) + vec3(1., 1., 1.)); + + // Smooth step + vec3 t = smoothstep(0., 1., f_pos); + float t_time = smoothstep(0., 1., f_time); + + // Mix 4 corners percentages + return + mix( + mix( + mix(mix(aa,ab,t.x), mix(ac,ad,t.x), t.y), + mix(mix(ae,af,t.x), mix(ag,ah,t.x), t.y), + t.z), + mix( + mix(mix(ba,bb,t.x), mix(bc,bd,t.x), t.y), + mix(mix(be,bf,t.x), mix(bg,bh,t.x), t.y), + t.z), + t_time); + } + + + +#define NUM_OCTAVES 6 +float fBm ( in vec3 _pos, in float sz) { + float v = 0.0; + float a = 0.2; + _pos *= sz; + + vec3 angle = vec3(-0.001*u_time,0.0001*u_time,0.0004*u_time); + mat3 rotx = mat3(1, 0, 0, + 0, cos(angle.x), -sin(angle.x), + 0, sin(angle.x), cos(angle.x)); + mat3 roty = mat3(cos(angle.y), 0, sin(angle.y), + 0, 1, 0, + -sin(angle.y), 0, cos(angle.y)); + mat3 rotz = mat3(cos(angle.z), -sin(angle.z), 0, + sin(angle.z), cos(angle.z), 0, + 0, 0, 1); + + for (int i = 0; i < NUM_OCTAVES; ++i) { + v += a * noise(_pos); + _pos = rotx * roty * rotz * _pos * 2.0; + a *= 0.8; + } + return v; +} + + +void main() { + vec3 st = vPositionModel; + + vec3 q = vec3(0.); + q.x = fBm( st, 5.); + q.y = fBm( st + vec3(1.2,3.2,1.52), 5.); + q.z = fBm( st + vec3(0.02,0.12,0.152), 5.); + + float n = fBm(st+q+vec3(1.82,1.32,1.09), 5.); + + vec3 color = vec3(0.); + color = mix(vec3(1.,0.4,0.), vec3(1.,1.,1.), n*n); + color = mix(color, vec3(1.,0.,0.), q*0.7); + gl_FragColor = vec4(1.6*color, 1.); + + + // Glow effect - exact from article + float raw_intensity = max(dot(vPosition, vNormalView), 0.); + float intensity = pow(raw_intensity, 4.); + vec3 u_color = vec3(1.0, 0.8, 0.4); + vec4 glowColor = vec4(u_color, intensity); + + // Fresnel effect - exact from article + //float fresnelTerm_inner = 0.2 - 0.7 * min(dot(vPosition, vNormalView), 0.0); + //fresnelTerm_inner = pow(fresnelTerm_inner, 5.0); + //float fresnelTerm_outer = 1.0 + dot(normalize(vPosition), normalize(vNormalView)); + //fresnelTerm_outer = pow(fresnelTerm_outer, 2.0); + //float fresnelTerm = fresnelTerm_inner + fresnelTerm_outer; + + // Combine - exact from article + //gl_FragColor = vec4(color, 0.7)*fresnelTerm + glowColor; +} + `; + + // Compile shader + function createShader( + gl: WebGLRenderingContext, + type: number, + source: string + ): WebGLShader | null { + const shader = gl.createShader(type); + if (!shader) return null; + gl.shaderSource(shader, source); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + console.error("Shader compile error:", gl.getShaderInfoLog(shader)); + gl.deleteShader(shader); + return null; + } + return shader; + } + + // Create program + function createProgram( + gl: WebGLRenderingContext, + vertexShader: WebGLShader, + fragmentShader: WebGLShader + ): WebGLProgram | null { + const program = gl.createProgram(); + if (!program) return null; + gl.attachShader(program, vertexShader); + gl.attachShader(program, fragmentShader); + gl.linkProgram(program); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + console.error("Program link error:", gl.getProgramInfoLog(program)); + gl.deleteProgram(program); + return null; + } + return program; + } + + // Matrix helpers + function createIdentityMatrix(): Float32Array { + return new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); + } + + function createOrthographicMatrix( + left: number, + right: number, + bottom: number, + top: number, + near: number, + far: number + ): Float32Array { + return new Float32Array([ + 2 / (right - left), + 0, + 0, + 0, + 0, + 2 / (top - bottom), + 0, + 0, + 0, + 0, + -2 / (far - near), + 0, + -(right + left) / (right - left), + -(top + bottom) / (top - bottom), + -(far + near) / (far - near), + 1, + ]); + } + + function createLookAtMatrix( + eyeX: number, + eyeY: number, + eyeZ: number, + centerX: number, + centerY: number, + centerZ: number, + upX: number, + upY: number, + upZ: number + ): Float32Array { + const fx = centerX - eyeX; + const fy = centerY - eyeY; + const fz = centerZ - eyeZ; + const len = Math.sqrt(fx * fx + fy * fy + fz * fz); + const f = [fx / len, fy / len, fz / len]; + + const sx = fy * upZ - fz * upY; + const sy = fz * upX - fx * upZ; + const sz = fx * upY - fy * upX; + const lenS = Math.sqrt(sx * sx + sy * sy + sz * sz); + const s = [sx / lenS, sy / lenS, sz / lenS]; + + const ux = s[1] * f[2] - s[2] * f[1]; + const uy = s[2] * f[0] - s[0] * f[2]; + const uz = s[0] * f[1] - s[1] * f[0]; + + return new Float32Array([ + s[0], + ux, + -f[0], + 0, + s[1], + uy, + -f[1], + 0, + s[2], + uz, + -f[2], + 0, + -(s[0] * eyeX + s[1] * eyeY + s[2] * eyeZ), + -(ux * eyeX + uy * eyeY + uz * eyeZ), + f[0] * eyeX + f[1] * eyeY + f[2] * eyeZ, + 1, + ]); + } + + function createNormalMatrix(modelMatrix: Float32Array): Float32Array { + // Extract upper-left 3x3 from model matrix + const m00 = modelMatrix[0], + m01 = modelMatrix[1], + m02 = modelMatrix[2]; + const m10 = modelMatrix[4], + m11 = modelMatrix[5], + m12 = modelMatrix[6]; + const m20 = modelMatrix[8], + m21 = modelMatrix[9], + m22 = modelMatrix[10]; + + // For rotation matrices, inverse transpose = same matrix + // Return the 3x3 rotation part + return new Float32Array([m00, m01, m02, m10, m11, m12, m20, m21, m22]); + } + + const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource); + const fragmentShader = createShader( + gl, + gl.FRAGMENT_SHADER, + fragmentShaderSource + ); + if (!vertexShader || !fragmentShader) { + console.error("Failed to create shaders"); + return; + } + + const program = createProgram(gl, vertexShader, fragmentShader); + if (!program) { + console.error("Failed to create program"); + return; + } + + programRef.current = program; + + // Create sphere geometry + const sphere = createSphere(0.6, 32); + const vertexBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); + gl.bufferData( + gl.ARRAY_BUFFER, + new Float32Array(sphere.vertices), + gl.STATIC_DRAW + ); + + const normalBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer); + gl.bufferData( + gl.ARRAY_BUFFER, + new Float32Array(sphere.normals), + gl.STATIC_DRAW + ); + + const indexBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer); + gl.bufferData( + gl.ELEMENT_ARRAY_BUFFER, + new Uint16Array(sphere.indices), + gl.STATIC_DRAW + ); + + const positionLocation = gl.getAttribLocation(program, "position"); + const normalLocation = gl.getAttribLocation(program, "normal"); + const timeLocation = gl.getUniformLocation(program, "u_time"); + const modelMatrixLocation = gl.getUniformLocation(program, "modelMatrix"); + const viewMatrixLocation = gl.getUniformLocation(program, "viewMatrix"); + const projectionMatrixLocation = gl.getUniformLocation( + program, + "projectionMatrix" + ); + const normalMatrixLocation = gl.getUniformLocation(program, "normalMatrix"); + + gl.enable(gl.DEPTH_TEST); + gl.enable(gl.BLEND); + gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA); + + const resizeCanvas = () => { + const container = canvas.parentElement; + if (container) { + const rect = container.getBoundingClientRect(); + const width = Math.max(rect.width, window.innerWidth); + const height = Math.max(rect.height, window.innerHeight); + canvas.width = width; + canvas.height = height; + gl.viewport(0, 0, canvas.width, canvas.height); + } else { + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + gl.viewport(0, 0, canvas.width, canvas.height); + } + }; + + resizeCanvas(); + setTimeout(resizeCanvas, 100); + window.addEventListener("resize", resizeCanvas); + + const handleVisibilityChange = () => { + isVisibleRef.current = !document.hidden; + }; + + const handleWindowBlur = () => { + isVisibleRef.current = false; + }; + + const handleWindowFocus = () => { + isVisibleRef.current = true; + }; + + document.addEventListener("visibilitychange", handleVisibilityChange); + window.addEventListener("blur", handleWindowBlur); + window.addEventListener("focus", handleWindowFocus); + isVisibleRef.current = !document.hidden && document.hasFocus(); + + const render = () => { + if (!isVisibleRef.current) { + animationFrameRef.current = requestAnimationFrame(render); + return; + } + + if (!gl || !program) return; + + timeRef.current += 0.016; + + gl.useProgram(program); + gl.clearColor(0, 0, 0, 1); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + + // Set up matrices with aspect ratio correction + const aspect = canvas.width / canvas.height; + + // Rotate around vertical Y axis through time + const rotationY = timeRef.current * 0.15; + const cosY = Math.cos(rotationY); + const sinY = Math.sin(rotationY); + + // Rotation matrix around Y axis (vertical) + const modelMatrix = new Float32Array([ + cosY, + 0, + sinY, + 0, + 0, + 1, + 0, + 0, + -sinY, + 0, + cosY, + 0, + 0, + 0, + 0, + 1, + ]); + + // Recalculate normal matrix for the rotated model + const m00 = modelMatrix[0], + m01 = modelMatrix[1], + m02 = modelMatrix[2]; + const m10 = modelMatrix[4], + m11 = modelMatrix[5], + m12 = modelMatrix[6]; + const m20 = modelMatrix[8], + m21 = modelMatrix[9], + m22 = modelMatrix[10]; + const normalMatrix = new Float32Array([ + m00, + m01, + m02, + m10, + m11, + m12, + m20, + m21, + m22, + ]); + + const viewMatrix = createLookAtMatrix(0, 0, 2, 0, 0, 0, 0, 1, 0); + + // Use perspective projection + const fov = Math.PI / 4; + const near = 0.1; + const far = 10; + const f = 1.0 / Math.tan(fov / 2); + const range = 1.0 / (near - far); + + const projectionMatrix = new Float32Array([ + f / aspect, + 0, + 0, + 0, + 0, + f, + 0, + 0, + 0, + 0, + (near + far) * range, + -1, + 0, + 0, + near * far * range * 2, + 0, + ]); + + // Set uniforms + if (timeLocation) gl.uniform1f(timeLocation, timeRef.current); + if (modelMatrixLocation) + gl.uniformMatrix4fv(modelMatrixLocation, false, modelMatrix); + if (viewMatrixLocation) + gl.uniformMatrix4fv(viewMatrixLocation, false, viewMatrix); + if (projectionMatrixLocation) + gl.uniformMatrix4fv(projectionMatrixLocation, false, projectionMatrix); + if (normalMatrixLocation) + gl.uniformMatrix3fv(normalMatrixLocation, false, normalMatrix); + + // Set up attributes + gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); + gl.enableVertexAttribArray(positionLocation); + gl.vertexAttribPointer(positionLocation, 3, gl.FLOAT, false, 0, 0); + + gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer); + gl.enableVertexAttribArray(normalLocation); + gl.vertexAttribPointer(normalLocation, 3, gl.FLOAT, false, 0, 0); + + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer); + gl.drawElements( + gl.TRIANGLES, + sphere.indices.length, + gl.UNSIGNED_SHORT, + 0 + ); + + animationFrameRef.current = requestAnimationFrame(render); + }; + + render(); + + return () => { + window.removeEventListener("resize", resizeCanvas); + document.removeEventListener("visibilitychange", handleVisibilityChange); + window.removeEventListener("blur", handleWindowBlur); + window.removeEventListener("focus", handleWindowFocus); + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + if (program) { + gl.deleteProgram(program); + } + if (vertexShader) { + gl.deleteShader(vertexShader); + } + if (fragmentShader) { + gl.deleteShader(fragmentShader); + } + }; + }, [showSun, isDark]); + + if (!showSun) return null; + + return ( + + ); +} diff --git a/src/components/ThemeToggle.tsx b/src/components/ThemeToggle.tsx new file mode 100644 index 0000000..ac755cc --- /dev/null +++ b/src/components/ThemeToggle.tsx @@ -0,0 +1,112 @@ +import { useEffect, useState } from "react"; + +type ThemeMode = "light" | "dark" | "auto"; + +export default function ThemeToggle() { + const [theme, setTheme] = useState("auto"); + const [isMounted, setIsMounted] = useState(false); + + useEffect(() => { + setIsMounted(true); + const savedTheme = (localStorage.getItem("theme") || "auto") as ThemeMode; + setTheme(savedTheme); + applyTheme(savedTheme); + }, []); + + const applyTheme = (mode: ThemeMode) => { + let isDark: boolean; + + if (mode === "auto") { + isDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + } else { + isDark = mode === "dark"; + } + + if (isDark) { + document.documentElement.classList.add("dark"); + } else { + document.documentElement.classList.remove("dark"); + } + }; + + const cycleTheme = () => { + const themes: ThemeMode[] = ["light", "dark", "auto"]; + const currentIndex = themes.indexOf(theme); + const newTheme = themes[(currentIndex + 1) % themes.length]; + setTheme(newTheme); + localStorage.setItem("theme", newTheme); + applyTheme(newTheme); + }; + + if (!isMounted) return null; + + return ( + + ); +} diff --git a/src/components/VelvetSilkBackground.tsx b/src/components/VelvetSilkBackground.tsx new file mode 100644 index 0000000..2f7895f --- /dev/null +++ b/src/components/VelvetSilkBackground.tsx @@ -0,0 +1,374 @@ +import { useEffect, useRef, useState } from "react"; + +export default function VelvetSilkBackground() { + const canvasRef = useRef(null); + const glRef = useRef(null); + const programRef = useRef(null); + const animationFrameRef = useRef(); + const timeRef = useRef(0); + const isVisibleRef = useRef(true); + const [showSilk, setShowSilk] = useState(false); + const [isDark, setIsDark] = useState(false); + const [hue, setHue] = useState(350); + const [saturation, setSaturation] = useState(1.0); + const [brightness, setBrightness] = useState(8.0); + const [speed, setSpeed] = useState(0.5); + + useEffect(() => { + if (typeof document === "undefined") return; + + const checkTheme = () => { + const theme = document.documentElement.getAttribute("data-color-theme"); + setShowSilk(theme === "velvet"); + setIsDark(document.documentElement.classList.contains("dark")); + }; + + // Check initial theme + checkTheme(); + + // Watch for theme changes + const observer = new MutationObserver(checkTheme); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ["data-color-theme", "class"], + }); + + // Also check localStorage changes + const handleStorageChange = () => { + checkTheme(); + }; + window.addEventListener("storage", handleStorageChange); + + // Poll for changes (fallback) + const interval = setInterval(checkTheme, 100); + + return () => { + observer.disconnect(); + window.removeEventListener("storage", handleStorageChange); + clearInterval(interval); + }; + }, []); + + useEffect(() => { + if (!showSilk) return; + + const canvas = canvasRef.current; + if (!canvas) return; + + const gl = canvas.getContext("webgl"); + if (!gl) { + console.error("WebGL not supported or context creation failed"); + return; + } + + glRef.current = gl; + console.log( + "WebGL context created, canvas size:", + canvas.width, + "x", + canvas.height + ); + + // Vertex shader source + const vertexShaderSource = ` + attribute vec2 a_position; + varying vec2 v_uv; + void main() { + gl_Position = vec4(a_position, 0.0, 1.0); + v_uv = (a_position + 1.0) * 0.5; + v_uv.y = 1.0 - v_uv.y; // Flip Y + } + `; + + // Fragment shader source - exact from ShaderToy example + const fragmentShaderSource = ` + precision highp float; + uniform float u_time; + uniform vec2 u_resolution; + uniform float u_hue; + uniform float u_saturation; + uniform float u_brightness; + uniform float u_speed; + varying vec2 v_uv; + + float noise(vec2 p) { + return 0.1*smoothstep(-0.5, 0.9, sin((p.x - p.y) * 555.0) * sin(p.y * 1444.0)) - 0.4; + } + + float fabric(vec2 p) { + const mat2 m = mat2(1.6, 1.2, -1.2, 1.6); + float f = 0.4 * noise(p); + f += 0.3 * noise(p = m * p); + f += 0.2 * noise(p = m * p); + return f + 0.1 * noise(m * p); + } + + float silk(vec2 uv, float t) { + float s = sin(5.0 * (uv.x + uv.y + cos(2.0 * uv.x + 5.0 * uv.y)) + sin(12.0 * (uv.x + uv.y)) - t); + s = 0.7 + 0.3 * (s * s * 0.5 + s); + s *= 0.9 + 0.6 * fabric(uv * min(u_resolution.x, u_resolution.y) * 0.0006); + return s * 0.9 + 0.1; + } + + float silkd(vec2 uv, float t) { + float xy = uv.x + uv.y; + float d = (5.0 * (1.0 - 2.0 * sin(2.0 * uv.x + 5.0 * uv.y)) + 12.0 * cos(12.0 * xy)) * cos(5.0 * (cos(2.0 * uv.x + 5.0 * uv.y) + xy) + sin(12.0 * xy) - t); + return 0.005 * d * (sign(d) + 3.0); + } + + vec3 hsv2rgb(vec3 c) { + vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + + void main() { + float mr = min(u_resolution.x, u_resolution.y); + vec2 uv = v_uv * u_resolution / mr; + + float t = u_time * u_speed; + uv.y += 0.03 * sin(8.0 * uv.x - t); + + float s = sqrt(silk(uv, t)); + float d = silkd(uv, t); + + vec3 c = vec3(s); + c += 0.7 * vec3(1.0, 0.83, 0.6) * d; + c *= 1.0 - max(0.0, 0.8 * d); + + // INVERT is 1, so use inverted path + c = 0.5+pow(c, vec3(0.3) / vec3(0.52, 0.5, 0.4))/2.0; + c = 1.0 - c; + + // Apply HSV color adjustment + vec3 hsv = vec3(u_hue / 360.0, u_saturation, u_brightness); + vec3 targetColor = hsv2rgb(hsv); + c = mix(c, c * targetColor, 0.5); + + gl_FragColor = vec4(c, 1.0); + } + `; + + // Compile shader + function createShader( + gl: WebGLRenderingContext, + type: number, + source: string + ): WebGLShader | null { + const shader = gl.createShader(type); + if (!shader) return null; + gl.shaderSource(shader, source); + gl.compileShader(shader); + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + console.error("Shader compile error:", gl.getShaderInfoLog(shader)); + gl.deleteShader(shader); + return null; + } + return shader; + } + + // Create program + function createProgram( + gl: WebGLRenderingContext, + vertexShader: WebGLShader, + fragmentShader: WebGLShader + ): WebGLProgram | null { + const program = gl.createProgram(); + if (!program) return null; + gl.attachShader(program, vertexShader); + gl.attachShader(program, fragmentShader); + gl.linkProgram(program); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + console.error("Program link error:", gl.getProgramInfoLog(program)); + gl.deleteProgram(program); + return null; + } + return program; + } + + const vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource); + const fragmentShader = createShader( + gl, + gl.FRAGMENT_SHADER, + fragmentShaderSource + ); + if (!vertexShader || !fragmentShader) { + console.error("Failed to create shaders"); + return; + } + + const program = createProgram(gl, vertexShader, fragmentShader); + if (!program) { + console.error("Failed to create program"); + return; + } + + console.log("Shader program created successfully"); + + programRef.current = program; + + // Setup geometry (full screen quad) + const positionBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); + const positions = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]); + gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW); + + const positionLocation = gl.getAttribLocation(program, "a_position"); + const timeLocation = gl.getUniformLocation(program, "u_time"); + const resolutionLocation = gl.getUniformLocation(program, "u_resolution"); + const hueLocation = gl.getUniformLocation(program, "u_hue"); + const saturationLocation = gl.getUniformLocation(program, "u_saturation"); + const brightnessLocation = gl.getUniformLocation(program, "u_brightness"); + const speedLocation = gl.getUniformLocation(program, "u_speed"); + + const resizeCanvas = () => { + const container = canvas.parentElement; + if (container) { + const rect = container.getBoundingClientRect(); + const width = Math.max(rect.width, window.innerWidth); + const height = Math.max(rect.height, window.innerHeight); + canvas.width = width; + canvas.height = height; + gl.viewport(0, 0, canvas.width, canvas.height); + console.log("Canvas resized to:", canvas.width, "x", canvas.height); + } else { + // Fallback to window size + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + gl.viewport(0, 0, canvas.width, canvas.height); + console.log( + "Canvas resized to window size:", + canvas.width, + "x", + canvas.height + ); + } + }; + + // Initial resize + resizeCanvas(); + + // Also resize after a short delay to ensure parent is sized + setTimeout(resizeCanvas, 100); + + window.addEventListener("resize", resizeCanvas); + + const handleVisibilityChange = () => { + isVisibleRef.current = !document.hidden; + }; + + const handleWindowBlur = () => { + isVisibleRef.current = false; + }; + + const handleWindowFocus = () => { + isVisibleRef.current = true; + }; + + document.addEventListener("visibilitychange", handleVisibilityChange); + window.addEventListener("blur", handleWindowBlur); + window.addEventListener("focus", handleWindowFocus); + isVisibleRef.current = !document.hidden && document.hasFocus(); + + const render = () => { + if (!isVisibleRef.current) { + animationFrameRef.current = requestAnimationFrame(render); + return; + } + + if (!gl || !program) return; + + timeRef.current += 0.016; // ~60fps + + gl.useProgram(program); + + // Clear with a test color first to verify rendering works + gl.clear(gl.COLOR_BUFFER_BIT); + + // Set attributes + gl.enableVertexAttribArray(positionLocation); + gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); + gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); + + // Set uniforms - using velvet theme colors + if (timeLocation) gl.uniform1f(timeLocation, timeRef.current); + if (resolutionLocation) + gl.uniform2f(resolutionLocation, canvas.width, canvas.height); + if (hueLocation) gl.uniform1f(hueLocation, hue); + if (saturationLocation) gl.uniform1f(saturationLocation, saturation); + if (brightnessLocation) gl.uniform1f(brightnessLocation, brightness); + if (speedLocation) gl.uniform1f(speedLocation, speed); + + // Check for WebGL errors + const error = gl.getError(); + if (error !== gl.NO_ERROR) { + console.error("WebGL error before draw:", error); + } + + // Draw + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + + // Check for errors after draw + const errorAfter = gl.getError(); + if (errorAfter !== gl.NO_ERROR) { + console.error("WebGL error after draw:", errorAfter); + } + + if (timeRef.current < 0.1) { + console.log( + "First frame rendered, time:", + timeRef.current, + "resolution:", + canvas.width, + "x", + canvas.height + ); + } + + animationFrameRef.current = requestAnimationFrame(render); + }; + + render(); + + return () => { + window.removeEventListener("resize", resizeCanvas); + document.removeEventListener("visibilitychange", handleVisibilityChange); + window.removeEventListener("blur", handleWindowBlur); + window.removeEventListener("focus", handleWindowFocus); + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + if (program) { + gl.deleteProgram(program); + } + if (vertexShader) { + gl.deleteShader(vertexShader); + } + if (fragmentShader) { + gl.deleteShader(fragmentShader); + } + }; + }, [showSilk, isDark]); + + if (!showSilk) { + if (typeof document !== "undefined") { + console.log( + "VelvetSilkBackground: showSilk is false, theme:", + document.documentElement.getAttribute("data-color-theme") + ); + } + return null; + } + + if (typeof document !== "undefined") { + console.log("VelvetSilkBackground: Rendering canvas, isDark:", isDark); + } + + return ( + + ); +} diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..9bc5cb4 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1 @@ +/// \ No newline at end of file diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro new file mode 100644 index 0000000..de40e2c --- /dev/null +++ b/src/layouts/BaseLayout.astro @@ -0,0 +1,40 @@ +--- +import '../styles/global.css'; +import ConditionalSnow from '../components/ConditionalSnow.tsx'; +import ConditionalChristmas from '../components/ConditionalChristmas.tsx'; +import ConditionalOcean from '../components/ConditionalOcean.tsx'; +import { baseUrl } from '../lib/utils'; + +interface Props { + title: string; + description?: string; +} + +const { title, description = 'IPython - Productive Interactive Computing' } = Astro.props; +--- + + + + + + + + + {title} | IPython + + + + + + + + + + + diff --git a/src/lib/themeUtils.ts b/src/lib/themeUtils.ts new file mode 100644 index 0000000..3333e7d --- /dev/null +++ b/src/lib/themeUtils.ts @@ -0,0 +1,609 @@ +export type Theme = { + id: string; + name: string; + colors: { + primary: string; + secondary: string; + accent: string; + }; + dotGradient: string; +}; + +export const themes: Theme[] = [ + { + id: "default", + name: "Default", + colors: { + primary: "#0D5C63", // ipython-blue + secondary: "#008B95", // ipython-cyan + accent: "#059669", // ipython-green + }, + dotGradient: "linear-gradient(to bottom right, #0D5C63, #008B95, #059669)", + }, + { + id: "ipython-default", + name: "Teal", + colors: { + primary: "#0D5C63", // ipython-blue + secondary: "#008B95", // ipython-cyan + accent: "#059669", // ipython-green + }, + dotGradient: "linear-gradient(to bottom right, #0D5C63, #008B95, #059669)", + }, + { + id: "rainbow", + name: "Rainbow Pride", + colors: { + primary: "#E40303", // Red + secondary: "#FF8C00", // Orange + accent: "#FFED00", // Yellow + }, + dotGradient: + "linear-gradient(to bottom right, #E40303 0%, #E40303 16.67%, #FF8C00 16.67%, #FF8C00 33.33%, #FFED00 33.33%, #FFED00 50%, #008026 50%, #008026 66.67%, #004CFF 66.67%, #004CFF 83.33%, #732982 83.33%, #732982 100%)", + }, + { + id: "gay", + name: "Gay Pride", + colors: { + primary: "#078D70", // Green + secondary: "#26CEAA", // Light green/teal + accent: "#98E8C1", // Pale green/mint + }, + dotGradient: + "linear-gradient(to bottom right, #078D70 0%, #078D70 14.28%, #26CEAA 14.28%, #26CEAA 28.56%, #98E8C1 28.56%, #98E8C1 42.84%, #FFFFFF 42.84%, #FFFFFF 57.12%, #7BADE2 57.12%, #7BADE2 71.4%, #5049CC 71.4%, #5049CC 85.68%, #3D1A78 85.68%, #3D1A78 100%)", + }, + { + id: "lesbian", + name: "Lesbian Pride", + colors: { + primary: "#D52D00", // Dark orange/red + secondary: "#EF7627", // Orange + accent: "#FF9A56", // Light orange/peach + }, + dotGradient: + "linear-gradient(to bottom right, #D52D00 0%, #D52D00 14.28%, #EF7627 14.28%, #EF7627 28.56%, #FF9A56 28.56%, #FF9A56 42.84%, #FFFFFF 42.84%, #FFFFFF 57.12%, #D162A4 57.12%, #D162A4 71.4%, #B55690 71.4%, #B55690 85.68%, #A30262 85.68%, #A30262 100%)", + }, + { + id: "trans", + name: "Trans Pride", + colors: { + primary: "#5BCEFA", // Light blue + secondary: "#F5A9B8", // Pink + accent: "#FFFFFF", // White + }, + dotGradient: + "linear-gradient(to bottom right, #5BCEFA, #F5A9B8, #FFFFFF, #F5A9B8, #5BCEFA)", + }, + { + id: "purple", + name: "Purple", + colors: { + primary: "#7C3AED", // Purple + secondary: "#A78BFA", // Light purple + accent: "#C4B5FD", // Lighter purple + }, + dotGradient: "linear-gradient(to bottom right, #7C3AED, #A78BFA, #C4B5FD)", + }, + { + id: "pink", + name: "Pink", + colors: { + primary: "#EC4899", // Pink + secondary: "#F472B6", // Light pink + accent: "#FBCFE8", // Lighter pink + }, + dotGradient: "linear-gradient(to bottom right, #EC4899, #F472B6, #FBCFE8)", + }, + { + id: "orange", + name: "Orange", + colors: { + primary: "#F97316", // Orange + secondary: "#FB923C", // Light orange + accent: "#FDBA74", // Lighter orange + }, + dotGradient: "linear-gradient(to bottom right, #F97316, #FB923C, #FDBA74)", + }, + { + id: "indigo", + name: "Indigo", + colors: { + primary: "#4F46E5", // Indigo + secondary: "#6366F1", // Light indigo + accent: "#818CF8", // Lighter indigo + }, + dotGradient: "linear-gradient(to bottom right, #4F46E5, #6366F1, #818CF8)", + }, + { + id: "emerald", + name: "Emerald", + colors: { + primary: "#10B981", // Emerald + secondary: "#34D399", // Light emerald + accent: "#6EE7B7", // Lighter emerald + }, + dotGradient: "linear-gradient(to bottom right, #10B981, #34D399, #6EE7B7)", + }, + { + id: "winter", + name: "Winter", + colors: { + primary: "#0EA5E9", // Sky blue + secondary: "#38BDF8", // Light sky blue + accent: "#BAE6FD", // Lighter sky blue + }, + dotGradient: "linear-gradient(to bottom right, #0EA5E9, #38BDF8, #BAE6FD)", + }, + { + id: "christmas", + name: "Christmas", + colors: { + primary: "#c8102e", // Deep Christmas Red + secondary: "#006b3c", // Forest Green + accent: "#ffffff", // White/Snow + }, + dotGradient: + "linear-gradient(to bottom right, #c8102e 0%, #c8102e 40%, #006b3c 40%, #006b3c 80%, #ffffff 80%, #ffffff 100%)", + }, + { + id: "ocean", + name: "Ocean", + colors: { + primary: "#0a2540", // Deep ocean blue + secondary: "#006994", // Ocean blue + accent: "#00d4ff", // Bright cyan + }, + dotGradient: + "linear-gradient(to bottom right, #0a2540 0%, #0a2540 40%, #006994 40%, #006994 70%, #00d4ff 70%, #00d4ff 100%)", + }, + { + id: "velvet", + name: "Red Velvet", + colors: { + primary: "#6b0f2a", // Deep velvet red + secondary: "#8b1538", // Rich carmine + accent: "#a91d3d", // Warm velvet + }, + dotGradient: + "linear-gradient(to bottom right, #6b0f2a 0%, #6b0f2a 40%, #8b1538 40%, #8b1538 70%, #a91d3d 70%, #a91d3d 100%)", + }, + { + id: "sun", + name: "Sun", + colors: { + primary: "#f59e0b", // Bright amber/yellow + secondary: "#fbbf24", // Golden yellow + accent: "#fcd34d", // Light yellow + }, + dotGradient: + "linear-gradient(to bottom right, #f59e0b 0%, #f59e0b 40%, #fbbf24 40%, #fbbf24 70%, #fcd34d 70%, #fcd34d 100%)", + }, + { + id: "random", + name: "Random", + colors: { + primary: "#9333ea", // Purple + secondary: "#ec4899", // Pink + accent: "#f59e0b", // Amber + }, + dotGradient: + "linear-gradient(to bottom right, #9333ea, #ec4899, #f59e0b, #10b981, #3b82f6)", + }, +]; + +/** + * Get all available theme IDs excluding 'random' + */ +export function getAvailableThemes(): string[] { + return themes.filter((t) => t.id !== "random").map((t) => t.id); +} + +/** + * Get a random theme ID (excluding 'random') + */ +export function getRandomTheme(): string { + const availableThemes = getAvailableThemes(); + return availableThemes[Math.floor(Math.random() * availableThemes.length)]; +} + +/** + * Theme storage format + */ +interface ThemeStorage { + themeId: string; + date: string; // YYYY-MM-DD format +} + +/** + * Apply a theme to the document + * If themeId is 'random', it will pick a random theme + * @param themeId - The theme ID to apply + * @param storePreference - Whether to store the preference in localStorage (default: true) + */ +export function applyTheme( + themeId: string, + storePreference: boolean = true +): void { + let actualThemeId = themeId; + + // If random is selected, pick a random theme + if (themeId === "random") { + actualThemeId = getRandomTheme(); + } + console.log("Applying them", themeId); + + const theme = themes.find((t) => t.id === actualThemeId) || themes[0]; + const root = document.documentElement; + + // Set CSS custom properties + root.style.setProperty("--theme-primary", theme.colors.primary); + root.style.setProperty("--theme-secondary", theme.colors.secondary); + root.style.setProperty("--theme-accent", theme.colors.accent); + + // Update Tailwind colors via data attribute (use actual theme, not 'random') + root.setAttribute("data-color-theme", actualThemeId); + + // Store preference with date (store 'random' if that's what was selected) + // Don't store if theme is 'default' (non-persistent default theme) + if (storePreference && themeId !== "default") { + const today = new Date(); + const dateString = `${today.getFullYear()}-${String( + today.getMonth() + 1 + ).padStart(2, "0")}-${String(today.getDate()).padStart(2, "0")}`; + const storage: ThemeStorage = { + themeId: themeId, + date: dateString, + }; + localStorage.setItem("colorTheme", JSON.stringify(storage)); + } else if (themeId === "default" && typeof localStorage !== "undefined") { + // Remove any stored theme when switching to default + localStorage.removeItem("colorTheme"); + } +} + +/** + * Get the current theme from localStorage or data attribute + */ +export function getCurrentTheme(): string { + if (typeof document === "undefined") return "default"; + return ( + document.documentElement.getAttribute("data-color-theme") || + localStorage.getItem("colorTheme") || + "default" + ); +} + +/** + * Check if we should auto-apply winter theme + * Returns true if current month is December or January, + * and the last theme change was NOT in December or January + */ +function shouldAutoApplyWinterTheme(): boolean { + if (typeof localStorage === "undefined") { + return true; + } + + const now = new Date(); + const currentMonth = now.getMonth(); // 0 = January, 11 = December + const isDecOrJan = currentMonth === 11 || currentMonth === 0; + + if (!isDecOrJan) { + console.info("Nothing specific using default theme"); + return false; + } + + const stored = localStorage.getItem("colorTheme"); + if (!stored) return true; // No stored theme, apply winter + + try { + const parsed = JSON.parse(stored); + let storedDate: Date | null = null; + + if (typeof parsed === "object" && parsed.date) { + // Parse YYYY-MM-DD format + storedDate = new Date(parsed.date + "T00:00:00"); + } else if (typeof parsed === "object" && parsed.timestamp) { + // Old format with timestamp + storedDate = new Date(parsed.timestamp); + } + + if (storedDate) { + const storedMonth = storedDate.getMonth(); + const storedIsDecOrJan = storedMonth === 11 || storedMonth === 0; + // If stored date is NOT in Dec/Jan, auto-apply winter + return !storedIsDecOrJan; + } + } catch { + console.log("Something wrong in local storage"); + + // If parsing fails, assume old format - apply winter + return true; + } + + return false; +} + +/** + * Get the stored theme preference (what user selected, not the actual applied theme) + */ +export function getStoredTheme(): string { + if (typeof localStorage === "undefined") return "default"; + const stored = localStorage.getItem("colorTheme"); + if (!stored) return "default"; + + // Handle both old format (string) and new format (object with timestamp) + try { + const parsed = JSON.parse(stored); + if (typeof parsed === "object" && parsed.themeId) { + return parsed.themeId; + } + } catch { + // If parsing fails, assume it's the old string format + return stored; + } + + return "default"; +} + +/** + * Get the stored theme preference with date + * @returns Object with themeId and date, or null if not found + */ +export function getStoredThemeWithDate(): ThemeStorage | null { + if (typeof localStorage === "undefined") return null; + const stored = localStorage.getItem("colorTheme"); + if (!stored) return null; + + try { + const parsed = JSON.parse(stored); + if (typeof parsed === "object" && parsed.themeId) { + // Handle both old format (with timestamp) and new format (with date) + if (parsed.date) { + return parsed as ThemeStorage; + } else if (parsed.timestamp) { + // Convert old timestamp to date string + const date = new Date(parsed.timestamp); + const dateString = `${date.getFullYear()}-${String( + date.getMonth() + 1 + ).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")}`; + return { + themeId: parsed.themeId, + date: dateString, + }; + } + } + // Handle old format (just a string) + if (typeof parsed === "string") { + const today = new Date(); + const dateString = `${today.getFullYear()}-${String( + today.getMonth() + 1 + ).padStart(2, "0")}-${String(today.getDate()).padStart(2, "0")}`; + return { + themeId: parsed, + date: dateString, // Use current date as fallback + }; + } + } catch { + // If parsing fails, assume it's the old string format + const today = new Date(); + const dateString = `${today.getFullYear()}-${String( + today.getMonth() + 1 + ).padStart(2, "0")}-${String(today.getDate()).padStart(2, "0")}`; + return { + themeId: stored, + date: dateString, // Use current date as fallback + }; + } + + return null; +} + +// Theme change callbacks +type ThemeChangeCallback = (themeId: string) => void; +const themeChangeCallbacks = new Set(); + +/** + * Subscribe to theme changes + * @param callback - Function to call when theme changes + * @returns Unsubscribe function + */ +export function subscribeToThemeChanges( + callback: ThemeChangeCallback +): () => void { + themeChangeCallbacks.add(callback); + // Immediately call with current theme + callback(getStoredTheme()); + + return () => { + themeChangeCallbacks.delete(callback); + }; +} + +/** + * Notify all subscribers of theme change + */ +function notifyThemeChange(themeId: string): void { + themeChangeCallbacks.forEach((callback) => callback(themeId)); +} + +// Theme watcher state +let themeWatcherInitialized = false; +let themeWatcherCleanup: (() => void) | null = null; +let randomRotationCleanup: (() => void) | null = null; + +/** + * Initialize theme watcher - watches for changes from localStorage, data attributes, etc. + * Should be called once when the app starts. Safe to call multiple times. + */ +export function initializeThemeWatcher(): () => void { + if (themeWatcherInitialized || typeof document === "undefined") { + // Return existing cleanup or no-op + return themeWatcherCleanup || (() => {}); + } + + themeWatcherInitialized = true; + + const checkTheme = () => { + // Check if we should auto-apply winter theme first + if (shouldAutoApplyWinterTheme()) { + const currentApplied = getCurrentTheme(); + // Only apply winter if it's not already applied + if (currentApplied !== "winter") { + applyTheme("winter", false); // Apply winter but don't store it + notifyThemeChange(getStoredTheme()); // Notify with stored theme, not 'winter' + } + return; // Don't check stored theme when winter is auto-applied + } + + const storedTheme = getStoredTheme(); + const currentApplied = getCurrentTheme(); + + // If stored theme is 'random', handle rotation + if (storedTheme === "random") { + // Random rotation is handled separately + return; + } + + // If stored theme doesn't match applied theme, apply it + if (storedTheme !== currentApplied && storedTheme !== "random") { + applyTheme(storedTheme, false); // Don't store again, just apply + } + }; + + // Watch for data attribute changes + const observer = new MutationObserver(checkTheme); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ["data-color-theme"], + }); + + // Watch for localStorage changes (from other tabs/windows) + const handleStorageChange = (e: StorageEvent) => { + if (e.key === "colorTheme") { + let newTheme = "default"; + if (e.newValue) { + try { + const parsed = JSON.parse(e.newValue); + if (typeof parsed === "object" && parsed.themeId) { + newTheme = parsed.themeId; + } else if (typeof parsed === "string") { + newTheme = parsed; + } + } catch { + // If parsing fails, assume it's the old string format + newTheme = e.newValue; + } + } + applyTheme(newTheme, false); // Don't store, it's already stored + notifyThemeChange(newTheme); + + // Handle random theme rotation + if (newTheme === "random") { + startRandomThemeRotation(); + } else { + stopRandomThemeRotation(); + } + } + }; + window.addEventListener("storage", handleStorageChange); + + // Poll for changes (fallback) + const interval = setInterval(checkTheme, 10000); + + // Check for theme URL parameter and apply it + const urlParams = new URLSearchParams(window.location.search); + const themeParam = urlParams.get("theme"); + let themeParamApplied = false; + + if (themeParam) { + // Validate theme exists + const themeExists = themes.some((t) => t.id === themeParam); + if (themeExists) { + changeTheme(themeParam); + themeParamApplied = true; + } + // Remove theme parameter from URL without page reload + urlParams.delete("theme"); + const newUrl = + urlParams.toString() === "" + ? window.location.pathname + : `${window.location.pathname}?${urlParams.toString()}`; + window.history.replaceState({}, "", newUrl); + } + + // Apply initial theme (only if no valid theme parameter was provided) + if (!themeParamApplied) { + // Check if we should auto-apply winter theme + if (shouldAutoApplyWinterTheme()) { + console.log("will apply winter"); + applyTheme("winter", false); // Apply winter but don't store it + notifyThemeChange("winter"); // Notify with the stored theme, not 'winter' + } else { + const initialTheme = getStoredTheme(); + applyTheme(initialTheme); + if (initialTheme === "random") { + startRandomThemeRotation(); + } + } + } + + // Cleanup function + themeWatcherCleanup = () => { + observer.disconnect(); + window.removeEventListener("storage", handleStorageChange); + clearInterval(interval); + stopRandomThemeRotation(); + themeWatcherInitialized = false; + themeWatcherCleanup = null; + }; + + return themeWatcherCleanup; +} + +/** + * Start random theme rotation + */ +function startRandomThemeRotation(): void { + if (randomRotationCleanup) return; // Already running + + // Apply random theme immediately + applyTheme("random", false); + notifyThemeChange("random"); + + // Change theme every minute (60000ms) + const randomInterval = setInterval(() => { + applyTheme("random", false); + notifyThemeChange("random"); + }, 60000); + + randomRotationCleanup = () => { + clearInterval(randomInterval); + randomRotationCleanup = null; + }; +} + +/** + * Stop random theme rotation + */ +function stopRandomThemeRotation(): void { + if (randomRotationCleanup) { + randomRotationCleanup(); + randomRotationCleanup = null; + } +} + +/** + * Change theme (public API for components) + * This is the main way components should change themes + */ +export function changeTheme(themeId: string): void { + applyTheme(themeId, true); // Store preference + notifyThemeChange(themeId); + + // Handle random theme rotation + if (themeId === "random") { + startRandomThemeRotation(); + } else { + stopRandomThemeRotation(); + } +} diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..05cf145 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,21 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +export type ObjectValues = T[keyof T]; + +/** + * Join a path with the base URL, ensuring proper slashes + * Handles cases where BASE_URL may or may not end with / + */ +export function baseUrl(path: string): string { + const base = import.meta.env.BASE_URL; + // Remove leading slash from path if present + const cleanPath = path.startsWith('/') ? path.slice(1) : path; + // Ensure base ends with /, then concatenate + const baseWithSlash = base.endsWith('/') ? base : `${base}/`; + return `${baseWithSlash}${cleanPath}`; +} diff --git a/src/pages/about.astro b/src/pages/about.astro new file mode 100644 index 0000000..ca147a0 --- /dev/null +++ b/src/pages/about.astro @@ -0,0 +1,623 @@ +--- +import BaseLayout from '../layouts/BaseLayout.astro'; +import Navigation from '../components/Navigation.astro'; +import Footer from '../components/Footer.astro'; +import PageHeader from '../components/PageHeader.astro'; +import GitHubContributors from '../components/GitHubContributors'; +import fs from 'fs'; +import path from 'path'; + +// Types +type Contributor = { + login: string; + avatar_url: string; + html_url: string; + contributions: number; + name?: string; +}; + +type Maintainer = { + login: string; + avatar_url: string; + html_url: string; + name?: string; + bio?: string; + contributions?: number; +}; + +type CacheData = { + contributors: Contributor[]; + maintainer: Maintainer | null; + carreauContributions: number | undefined; + timestamp: number; +}; + +// Define isDev first before using it +const isDev = import.meta.env.DEV; + +// GitHub token from environment variable +// In Astro, use import.meta.env for environment variables +// Set GITHUB_TOKEN in .env file or as environment variable +// Try both import.meta.env and process.env as fallback +// Trim whitespace and newlines in case .env file has extra characters +let GITHUB_TOKEN = import.meta.env.GITHUB_TOKEN || (typeof process !== 'undefined' && process.env ? process.env.GITHUB_TOKEN : undefined); +if (GITHUB_TOKEN) { + // Aggressively clean the token: + // 1. Remove quotes if present (some .env files have quotes) + // 2. Trim all whitespace from start and end + // 3. Remove all newlines, carriage returns, and tabs + let cleaned = GITHUB_TOKEN.toString(); + // Remove surrounding quotes + if ((cleaned.startsWith('"') && cleaned.endsWith('"')) || + (cleaned.startsWith("'") && cleaned.endsWith("'"))) { + cleaned = cleaned.slice(1, -1); + } + // Remove all whitespace and control characters + cleaned = cleaned.replace(/^\s+|\s+$/g, '').replace(/[\r\n\t\s]/g, ''); + GITHUB_TOKEN = cleaned; +} +const CACHE_DIR = path.join(process.cwd(), 'node_modules', '.cache'); +const CACHE_FILE = path.join(CACHE_DIR, 'github-cache.json'); +const CACHE_DURATION = 60 * 60 * 1000; // 1 hour in milliseconds + +// Log GitHub token status +if (isDev) { + console.log('\n[GitHub API]', GITHUB_TOKEN ? '✓ Using GitHub token (5000 req/hour)' : '⚠ No GitHub token (60 req/hour limit)'); +} + +// Helper function to create fetch headers +function getFetchHeaders() { + const headers: HeadersInit = { + 'Accept': 'application/vnd.github.v3+json', + }; + if (GITHUB_TOKEN) { + headers['Authorization'] = `Bearer ${GITHUB_TOKEN.trim()}`; + } + return headers; +} + +// Check GitHub API rate limits at build start +async function checkRateLimit() { + try { + const response = await fetch('https://api.github.com/rate_limit', { + headers: getFetchHeaders(), + }); + if (response.ok) { + const data = await response.json(); + const core = data.resources?.core || {}; + const remaining = core.remaining ?? 0; + const limit = core.limit ?? 0; + const resetTime = core.reset ? new Date(core.reset * 1000).toLocaleString() : 'unknown'; + console.log(`[GitHub API] Rate limit: ${remaining}/${limit} requests remaining (resets at ${resetTime})`); + if (remaining === 0) { + console.error('[GitHub API] ⚠ WARNING: No API requests remaining! Build may fail.'); + } + return { remaining, limit, resetTime }; + } else { + const errorText = await response.text(); + console.error(`[GitHub API] ✗ Failed to check rate limit: ${response.status} ${response.statusText}`); + console.error(`[GitHub API] Response: ${errorText}`); + } + } catch (error) { + console.error('[GitHub API] ✗ Error checking rate limit:', error); + if (error instanceof Error) { + console.error('[GitHub API] Error details:', error.message); + } + } + return null; +} + +// Check rate limits at build start +await checkRateLimit(); + +// Helper function to load cache +function loadCache(): CacheData | null { + if (!isDev || !fs.existsSync(CACHE_FILE)) { + if (isDev && !fs.existsSync(CACHE_FILE)) { + console.log('[Cache] No cache file found, will fetch from API'); + } + return null; + } + + try { + const cacheContent = fs.readFileSync(CACHE_FILE, 'utf-8'); + const cache: CacheData = JSON.parse(cacheContent); + const now = Date.now(); + const age = now - cache.timestamp; + const ageMinutes = Math.floor(age / 60000); + + // Validate cache data structure + if (!cache.contributors || !Array.isArray(cache.contributors)) { + console.log(`[Cache] ⚠ Cache data is invalid (missing contributors array), fetching fresh data`); + return null; + } + + const hasValidContributors = cache.contributors.length > 0; + const hasValidMaintainer = cache.maintainer !== null && + cache.maintainer !== undefined && + typeof cache.maintainer === 'object' && + cache.maintainer.login !== undefined; + + // Check if cache is still valid (less than 1 hour old) + if (age < CACHE_DURATION) { + if (hasValidContributors || hasValidMaintainer) { + console.log(`[Cache] ✓ Using cached data (${ageMinutes} minutes old)`); + if (isDev) { + console.log(`[Cache] - Contributors: ${cache.contributors.length}`); + console.log(`[Cache] - Maintainer: ${hasValidMaintainer ? 'Yes' : 'No'}`); + } + return cache; + } else { + console.log(`[Cache] ⚠ Cache data is invalid (empty contributors and no maintainer), fetching fresh data`); + // Delete invalid cache + try { + fs.unlinkSync(CACHE_FILE); + console.log(`[Cache] Deleted invalid cache file`); + } catch (error) { + // Ignore deletion errors + } + return null; + } + } else { + console.log(`[Cache] ⚠ Cache expired (${ageMinutes} minutes old), fetching fresh data`); + } + } catch (error) { + console.error('[Cache] Failed to load cache:', error); + } + + return null; +} + +// Helper function to save cache +function saveCache(data: CacheData) { + if (!isDev) { + return; + } + + try { + // Ensure cache directory exists + if (!fs.existsSync(CACHE_DIR)) { + fs.mkdirSync(CACHE_DIR, { recursive: true }); + } + + fs.writeFileSync(CACHE_FILE, JSON.stringify(data, null, 2), 'utf-8'); + console.log('[Cache] ✓ Saved data to cache'); + } catch (error) { + console.error('[Cache] Failed to save cache:', error); + } +} + +// Try to load from cache first (dev mode only) +let cachedData = loadCache(); +let contributors: Contributor[] = []; +let carreauContributions: number | undefined = undefined; +let contributorsError = false; +let maintainer: Maintainer | null = null; +let maintainerError = false; + +if (cachedData) { + // Use cached data (already validated in loadCache) + contributors = cachedData.contributors || []; + maintainer = cachedData.maintainer || null; + carreauContributions = cachedData.carreauContributions; + + if (isDev) { + console.log('[Static Data] 📦 Using static contributor/maintainer data from last build (cached)'); + } else { + console.log('[Static Data] 📦 Using static contributor/maintainer data from last build'); + } + + // Double-check we have valid data + if (contributors.length === 0 && !maintainer) { + if (isDev) { + console.log('[Cache] ⚠ Cached data is empty, fetching fresh data'); + } + cachedData = null; // Force fresh fetch + } +} + +if (!cachedData) { + // Fetch fresh data + if (isDev) { + console.log('[GitHub API] 🔄 Fetching live contributor data from GitHub API...'); + } else { + console.log('[GitHub API] 🔄 Fetching live contributor data from GitHub API (build time)...'); + } + + try { + const response = await fetch('https://api.github.com/repos/ipython/ipython/contributors?per_page=30', { + headers: getFetchHeaders(), + }); + + // Check rate limit headers + if (isDev) { + const remaining = response.headers.get('x-ratelimit-remaining'); + const limit = response.headers.get('x-ratelimit-limit'); + const resetTime = response.headers.get('x-ratelimit-reset'); + if (remaining && limit) { + const resetDate = resetTime ? new Date(parseInt(resetTime) * 1000).toLocaleTimeString() : 'unknown'; + console.log(`[GitHub API] Rate limit: ${remaining}/${limit} remaining (resets at ${resetDate})`); + } + } + + if (response.ok) { + const contributorsData = await response.json(); + + // Check if response is empty or invalid + if (!Array.isArray(contributorsData) || contributorsData.length === 0) { + const errorMsg = '[GitHub API] ✗ Contributors response is empty or invalid'; + console.error(errorMsg); + console.error('[GitHub API] Response data:', JSON.stringify(contributorsData, null, 2)); + contributorsError = true; + if (!isDev) { + throw new Error(errorMsg); + } + } else { + // Find Carreau's contribution count + const carreauData = contributorsData.find((c: Contributor) => c.login === 'Carreau'); + if (carreauData) { + carreauContributions = carreauData.contributions; + } + + // Fetch user details for each contributor to get their names + // Limit to first 20 to avoid too many API calls + if (isDev) { + console.log(`[GitHub API] Fetching user details for ${Math.min(contributorsData.length, 20)} contributors...`); + } + + const contributorsWithNames = await Promise.all( + contributorsData.slice(0, 20).map(async (contributor: Contributor) => { + try { + const userResponse = await fetch(`https://api.github.com/users/${contributor.login}`, { + headers: getFetchHeaders(), + }); + if (userResponse.ok) { + const userData = await userResponse.json(); + return { + ...contributor, + name: userData.name || contributor.login, + }; + } else { + const errorText = await userResponse.text(); + console.error(`[GitHub API] Failed to fetch user ${contributor.login}: ${userResponse.status} ${userResponse.statusText}`); + console.error(`[GitHub API] Response: ${errorText}`); + } + } catch (error) { + console.error(`[GitHub API] Failed to fetch user ${contributor.login}:`, error); + if (error instanceof Error) { + console.error(`[GitHub API] Error details: ${error.message}`); + } + } + return { + ...contributor, + name: contributor.login, + }; + }) + ); + + contributors = contributorsWithNames; + if (isDev) { + console.log(`[GitHub API] ✓ Live data: Fetched ${contributors.length} contributors`); + } else { + console.log(`[GitHub API] ✓ Live data (build time): Fetched ${contributors.length} contributors`); + } + } + } else { + const errorText = await response.text(); + let errorMessage = `Failed to fetch contributors: ${response.status} ${response.statusText}`; + try { + const errorJson = JSON.parse(errorText); + errorMessage = errorJson.message || errorMessage; + if (errorJson.documentation_url) { + errorMessage += `\n Documentation: ${errorJson.documentation_url}`; + } + } catch (e) { + // Not JSON, use raw text + } + + contributorsError = true; + console.error(`[GitHub API] ✗ ${errorMessage}`); + console.error(`[GitHub API] Response: ${errorText}`); + + if (response.status === 403) { + const retryAfter = response.headers.get('retry-after'); + if (retryAfter) { + console.error(`[GitHub API] Retry after ${retryAfter} seconds`); + } + const xRateLimitRemaining = response.headers.get('x-ratelimit-remaining'); + if (xRateLimitRemaining === '0') { + console.error('[GitHub API] Rate limit exhausted!'); + } + } else if (response.status === 401) { + console.error(`[GitHub API] Check if token is valid and has correct permissions`); + } + + if (!isDev) { + throw new Error(errorMessage); + } + } + } catch (error) { + contributorsError = true; + console.error('[GitHub API] ✗ Failed to fetch contributors:', error); + if (error instanceof Error) { + console.error('[GitHub API] Error details:', error.message); + console.error('[GitHub API] Stack:', error.stack); + } + if (!isDev) { + throw error; + } + } + + // Fetch maintainer (Carreau) + if (isDev) { + console.log('[GitHub API] Fetching maintainer (Carreau)...'); + } + + try { + if (isDev) { + console.log('[GitHub API] 🔄 Fetching live maintainer data from GitHub API...'); + } else { + console.log('[GitHub API] 🔄 Fetching live maintainer data from GitHub API (build time)...'); + } + const maintainerResponse = await fetch('https://api.github.com/users/Carreau', { + headers: getFetchHeaders(), + }); + + if (maintainerResponse.ok) { + const maintainerData = await maintainerResponse.json(); + + if (!maintainerData || !maintainerData.login) { + const errorMsg = '[GitHub API] ✗ Maintainer response is empty or invalid'; + console.error(errorMsg); + console.error('[GitHub API] Response data:', JSON.stringify(maintainerData, null, 2)); + maintainerError = true; + if (!isDev) { + throw new Error(errorMsg); + } + } else { + maintainer = { + login: maintainerData.login, + avatar_url: maintainerData.avatar_url, + html_url: maintainerData.html_url, + name: maintainerData.name || maintainerData.login, + bio: maintainerData.bio, + contributions: carreauContributions, + }; + if (isDev) { + console.log('[GitHub API] ✓ Live data: Fetched maintainer info'); + } else { + console.log('[GitHub API] ✓ Live data (build time): Fetched maintainer info'); + } + } + } else { + const errorText = await maintainerResponse.text(); + let errorMessage = `Failed to fetch maintainer: ${maintainerResponse.status} ${maintainerResponse.statusText}`; + try { + const errorJson = JSON.parse(errorText); + errorMessage = errorJson.message || errorMessage; + if (errorJson.documentation_url) { + errorMessage += `\n Documentation: ${errorJson.documentation_url}`; + } + } catch (e) { + // Not JSON, use raw text + } + + maintainerError = true; + console.error(`[GitHub API] ✗ ${errorMessage}`); + console.error(`[GitHub API] Response: ${errorText}`); + + if (maintainerResponse.status === 403) { + const retryAfter = maintainerResponse.headers.get('retry-after'); + if (retryAfter) { + console.error(`[GitHub API] Retry after ${retryAfter} seconds`); + } + } else if (maintainerResponse.status === 401) { + console.error(`[GitHub API] Check if token is valid and has correct permissions`); + } + + if (!isDev) { + throw new Error(errorMessage); + } + } + } catch (error) { + maintainerError = true; + console.error('[GitHub API] ✗ Failed to fetch maintainer:', error); + if (error instanceof Error) { + console.error('[GitHub API] Error details:', error.message); + console.error('[GitHub API] Stack:', error.stack); + } + if (!isDev) { + throw error; + } + } + + // Save to cache (dev mode only) - only if we have valid data + if (isDev && !contributorsError && !maintainerError) { + if (contributors.length > 0 || maintainer) { + saveCache({ + contributors, + maintainer, + carreauContributions, + timestamp: Date.now(), + }); + } else { + console.log('[Cache] ⚠ Not saving cache - no valid data to cache'); + } + } else if (isDev && (contributorsError || maintainerError)) { + console.log('[Cache] ⚠ Not saving cache due to API errors'); + // Delete invalid cache if it exists + if (fs.existsSync(CACHE_FILE)) { + try { + fs.unlinkSync(CACHE_FILE); + console.log('[Cache] Deleted invalid cache file'); + } catch (error) { + console.error('[Cache] Failed to delete invalid cache:', error); + } + } + } + + if (isDev) { + console.log(''); // Empty line for readability + } + + // Save build-time data to static JSON file in /public/ + // Only save if we have valid data (not empty and no errors) + if (!contributorsError && !maintainerError && (contributors.length > 0 || maintainer)) { + try { + const publicDir = path.join(process.cwd(), 'public'); + if (!fs.existsSync(publicDir)) { + fs.mkdirSync(publicDir, { recursive: true }); + } + + const contributorsDataFile = path.join(publicDir, 'build-data-contributors.json'); + fs.writeFileSync( + contributorsDataFile, + JSON.stringify( + { + contributors: contributors || [], + maintainer: maintainer || null, + carreauContributions, + timestamp: Date.now(), + }, + null, + 2 + ) + ); + if (isDev) { + console.log( + `[Build Data] ✓ Saved contributors/maintainer data to ${contributorsDataFile} (${contributors.length} contributors, maintainer: ${maintainer ? 'Yes' : 'No'})` + ); + } else { + console.log( + `[Build Data] ✓ Saved contributors/maintainer data (${contributors.length} contributors, maintainer: ${maintainer ? 'Yes' : 'No'})` + ); + } + } catch (error) { + console.error('[Build Data] ✗ Failed to save build-time data:', error); + } + } else { + if (isDev) { + console.log('[Build Data] ⚠ Not saving contributors/maintainer data - no valid data or API errors occurred'); + if (contributorsError) { + console.log('[Build Data] - Contributors fetch failed'); + } + if (maintainerError) { + console.log('[Build Data] - Maintainer fetch failed'); + } + if (contributors.length === 0 && !maintainer) { + console.log('[Build Data] - No data available'); + } + } else { + console.error('[Build Data] ✗ Cannot save contributors/maintainer data - GitHub API errors or no data available'); + } + } +} +--- + + + + +
        + + + +
        +
        + +
        +

        Project History

        +

        + IPython (Interactive Python) was created by Fernando Pérez in 2001 as a more powerful interactive shell for Python. It evolved from Mathematica's notebook interface and was designed to improve the interactive computing experience. +

        +

        + Over the years, IPython became the foundation for Jupyter notebooks and the broader Project Jupyter ecosystem, revolutionizing how scientists, data analysts, and educators work with code. +

        +
        + + +
        +

        IPython and Project Jupyter

        +

        + Since IPython 4.0 (released in 2015), the language-agnostic components were separated into Project Jupyter. IPython now focuses specifically on interactive Python computing as a Jupyter kernel and terminal interface. +

        +

        + Today, IPython is a core component of the Jupyter ecosystem, providing the powerful interactive Python backend for notebooks, JupyterLab, and other tools. +

        +
        + + +
        +

        Modern Architecture

        +

        + IPython is organized into several key components: +

        +
        +
        +

        Terminal IPython

        +

        A powerful command-line interface for interactive Python.

        +
        +
        +

        IPython Kernel

        +

        Backend for Jupyter notebooks and JupyterLab.

        +
        +
        +

        Traitlets

        +

        Configuration and type system used by IPython and Jupyter.

        +
        +
        +

        Display System

        +

        Rich output rendering for notebooks and terminals.

        +
        +
        +
        + + +
        +

        Governance

        +

        + IPython is part of Project Jupyter and operates under a community-driven governance model. The project is guided by the Jupyter Governance Council and maintained by volunteers from the open-source community. +

        +

        + Development decisions are made transparently through GitHub discussions, pull requests, and community meetings. Anyone can contribute to IPython regardless of their background or experience level. +

        +
        + + + + + + +
        +

        License

        +

        + IPython is released under the BSD 3-Clause License, which allows free use in both commercial and non-commercial projects. +

        +
        + + +
        +

        Learn More

        + +
        +
        +
        +
        + +