Repository: jupyter/notebook Branch: main Commit: 84d06f1b9dce Files: 270 Total size: 1.6 MB Directory structure: gitextract_d_lj9zim/ ├── .devcontainer/ │ ├── Dockerfile │ └── devcontainer.json ├── .git-blame-ignore-revs ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ └── feature_request.md │ ├── actions/ │ │ └── build-dist/ │ │ └── action.yml │ ├── answered.yml │ ├── dependabot.yml │ ├── jupyterlab-probot.yml │ ├── pull_request_template.md │ └── workflows/ │ ├── auto_author_assign.yml │ ├── binder.yml │ ├── build.yml │ ├── buildutils.yml │ ├── check-release.yml │ ├── enforce-label.yml │ ├── lock.yml │ ├── playwright-update.yml │ ├── prep-release.yml │ ├── publish-changelog.yml │ ├── publish-release.yml │ ├── ui-tests.yml │ └── upgrade-jupyterlab-dependencies.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .prettierignore ├── .prettierrc ├── .readthedocs.yaml ├── .yarnrc.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── RELEASE.md ├── app/ │ ├── index.template.js │ ├── package.json │ ├── publicpath.js │ ├── rspack.config.js │ ├── rspack.config.watch.js │ ├── rspack.prod.config.js │ ├── style.js │ └── templates/ │ ├── consoles_template.html │ ├── edit_template.html │ ├── error_template.html │ ├── notebooks_template.html │ ├── terminals_template.html │ └── tree_template.html ├── binder/ │ ├── environment.yml │ ├── example.ipynb │ └── postBuild ├── buildutils/ │ ├── package.json │ ├── src/ │ │ ├── develop.ts │ │ ├── ensure-repo.ts │ │ ├── get-latest-lab-version.ts │ │ ├── release-bump.ts │ │ ├── release-patch.ts │ │ ├── upgrade-lab-dependencies.ts │ │ └── utils.ts │ └── tsconfig.json ├── docs/ │ ├── Makefile │ ├── jsdoc_config.json │ ├── jsdoc_plugin.js │ ├── make.bat │ ├── resources/ │ │ ├── Info.plist.example │ │ ├── generate_icons.sh │ │ └── ipynb.icns │ └── source/ │ ├── _static/ │ │ └── .gitkeep │ ├── conf.py │ ├── configuration.md │ ├── configuring/ │ │ ├── config_overview.md │ │ ├── interface_customization.md │ │ └── plugins.md │ ├── contributor.md │ ├── custom_css.md │ ├── development_faq.md │ ├── examples/ │ │ ├── Notebook/ │ │ │ ├── Connecting with the Qt Console.ipynb │ │ │ ├── Custom Keyboard Shortcuts.ipynb │ │ │ ├── Importing Notebooks.ipynb │ │ │ ├── Notebook Basics.ipynb │ │ │ ├── Running Code.ipynb │ │ │ ├── Typesetting Equations.ipynb │ │ │ ├── What is the Jupyter Notebook.ipynb │ │ │ ├── Working With Markdown Cells.ipynb │ │ │ ├── examples_index.rst │ │ │ └── nbpackage/ │ │ │ ├── __init__.py │ │ │ ├── mynotebook.ipynb │ │ │ └── nbs/ │ │ │ ├── __init__.py │ │ │ └── other.ipynb │ │ ├── images/ │ │ │ ├── FrontendKernel.graffle/ │ │ │ │ └── data.plist │ │ │ └── animation.m4v │ │ └── utils/ │ │ ├── list_pyfiles.ipy │ │ └── list_subdirs.ipy │ ├── extending/ │ │ ├── frontend_extensions.md │ │ └── index.md │ ├── index.md │ ├── ipython_security.asc │ ├── links.txt │ ├── migrate_to_notebook7.md │ ├── migrating/ │ │ ├── custom-themes.md │ │ ├── frontend-extensions.md │ │ ├── multiple-interfaces.md │ │ ├── server-extensions.md │ │ └── server-imports.md │ ├── notebook.md │ ├── notebook_7_features.md │ ├── spelling_wordlist.txt │ ├── template.tpl │ ├── troubleshooting.md │ ├── ui_components.md │ └── user-documentation.md ├── eslint.config.mjs ├── jupyter-config/ │ └── jupyter_server_config.d/ │ └── notebook.json ├── jupyter-notebook.desktop ├── jupyter_config.json ├── lerna.json ├── notebook/ │ ├── __init__.py │ ├── __main__.py │ ├── _version.py │ ├── app.py │ └── custom/ │ └── custom.css ├── nx.json ├── package.json ├── packages/ │ ├── _metapackage/ │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ └── tsconfig.json │ ├── application/ │ │ ├── babel.config.js │ │ ├── jest.config.js │ │ ├── package.json │ │ ├── src/ │ │ │ ├── app.ts │ │ │ ├── index.ts │ │ │ ├── panelhandler.ts │ │ │ ├── pathopener.ts │ │ │ ├── shell.ts │ │ │ └── tokens.ts │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ └── sidepanel.css │ │ ├── test/ │ │ │ └── shell.spec.ts │ │ ├── tsconfig.json │ │ └── tsconfig.test.json │ ├── application-extension/ │ │ ├── package.json │ │ ├── schema/ │ │ │ ├── menus.json │ │ │ ├── pages.json │ │ │ ├── shell.json │ │ │ ├── shortcuts.json │ │ │ ├── title.json │ │ │ ├── top.json │ │ │ └── zen.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ └── index.js │ │ └── tsconfig.json │ ├── console-extension/ │ │ ├── package.json │ │ ├── schema/ │ │ │ └── scratchpad-console.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ └── index.js │ │ └── tsconfig.json │ ├── docmanager-extension/ │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ └── index.js │ │ └── tsconfig.json │ ├── documentsearch-extension/ │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ └── index.js │ │ └── tsconfig.json │ ├── help-extension/ │ │ ├── package.json │ │ ├── schema/ │ │ │ └── open.json │ │ ├── src/ │ │ │ └── index.tsx │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ └── index.js │ │ └── tsconfig.json │ ├── lab-extension/ │ │ ├── package.json │ │ ├── schema/ │ │ │ ├── interface-switcher.json │ │ │ └── launch-tree.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ └── index.js │ │ └── tsconfig.json │ ├── notebook-extension/ │ │ ├── package.json │ │ ├── schema/ │ │ │ ├── checkpoints.json │ │ │ ├── edit-notebook-metadata.json │ │ │ ├── full-width-notebook.json │ │ │ ├── kernel-logo.json │ │ │ ├── menu-override.json │ │ │ └── scroll-output.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ └── trusted.tsx │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ └── variables.css │ │ └── tsconfig.json │ ├── terminal-extension/ │ │ ├── package.json │ │ ├── src/ │ │ │ └── index.ts │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ └── index.js │ │ └── tsconfig.json │ ├── tree/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── index.ts │ │ │ ├── notebook-tree.ts │ │ │ └── token.ts │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ └── index.js │ │ └── tsconfig.json │ ├── tree-extension/ │ │ ├── package.json │ │ ├── schema/ │ │ │ ├── file-actions.json │ │ │ └── widget.json │ │ ├── src/ │ │ │ ├── fileactions.tsx │ │ │ └── index.ts │ │ ├── style/ │ │ │ ├── base.css │ │ │ ├── index.css │ │ │ └── index.js │ │ └── tsconfig.json │ └── ui-components/ │ ├── babel.config.js │ ├── jest.config.js │ ├── package.json │ ├── src/ │ │ ├── icon/ │ │ │ ├── iconimports.ts │ │ │ └── index.ts │ │ ├── index.ts │ │ └── svg.d.ts │ ├── style/ │ │ ├── base.css │ │ ├── index.css │ │ └── index.js │ ├── test/ │ │ └── foo.spec.ts │ ├── tsconfig.json │ └── tsconfig.test.json ├── pyproject.toml ├── setup.py ├── tests/ │ ├── conftest.py │ └── test_app.py ├── tsconfig.eslint.json ├── tsconfigbase.json ├── tsconfigbase.test.json └── ui-tests/ ├── package.json ├── playwright.config.ts ├── test/ │ ├── console.spec.ts │ ├── editor.spec.ts │ ├── filebrowser.spec.ts │ ├── fixtures.ts │ ├── general.spec.ts │ ├── jupyter_server_config.py │ ├── layout.spec.ts │ ├── links.spec.ts │ ├── menus.spec.ts │ ├── mobile.spec.ts │ ├── notebook.spec.ts │ ├── notebooks/ │ │ ├── autoscroll.ipynb │ │ ├── empty.ipynb │ │ ├── local_links.ipynb │ │ ├── simple.ipynb │ │ └── simple_toc.ipynb │ ├── settings.spec.ts │ ├── smoke.spec.ts │ ├── tree.spec.ts │ └── utils.ts └── tsconfig.test.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .devcontainer/Dockerfile ================================================ FROM mcr.microsoft.com/devcontainers/base:jammy ARG PIXI_VERSION=v0.42.1 RUN curl -L -o /usr/local/bin/pixi -fsSL --compressed "https://github.com/prefix-dev/pixi/releases/download/${PIXI_VERSION}/pixi-$(uname -m)-unknown-linux-musl" \ && chmod +x /usr/local/bin/pixi \ && pixi info # set some user and workdir settings to work nicely with vscode USER vscode WORKDIR /home/vscode RUN echo 'eval "$(pixi completion -s bash)"' >> /home/vscode/.bashrc ================================================ FILE: .devcontainer/devcontainer.json ================================================ { "name": "Jupyter Notebook", "build": { "dockerfile": "Dockerfile", "context": ".." }, "forwardPorts": [8888], "customizations": { "vscode": { "settings": {}, "extensions": ["ms-python.python", "charliermarsh.ruff", "GitHub.copilot"] } }, "features": { "ghcr.io/devcontainers/features/docker-in-docker:2": {} }, "mounts": [ "source=${localWorkspaceFolderBasename}-pixi,target=${containerWorkspaceFolder}/.pixi,type=volume" ], "postCreateCommand": "sudo chown vscode .pixi && pixi install && pixi run develop && pixi run pre-commit install -f" } ================================================ FILE: .git-blame-ignore-revs ================================================ # Run auto-formatters: https://github.com/jupyter/notebook/pull/6335 a7717d90f128368296fe3434deba5acd6031edab ================================================ FILE: .gitattributes ================================================ # SCM syntax highlighting & preventing 3-way merges pixi.lock merge=binary linguist-language=YAML linguist-generated=true ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: "\U0001F41B Bug report" about: Create a report to help us repair something that is currently broken labels: bug, status:Needs Triage --- ## Description ## Reproduce 1. Go to '...' 2. Click on '...' 3. Scroll down to '...' 4. See error '...' ## Expected behavior ## Context - Operating System and version: - Browser and version: - Jupyter Notebook version:
Troubleshoot Output
Paste the output from running `jupyter troubleshoot` from the command line here.
You may want to sanitize the paths in the output.
Command Line Output
Paste the output from your command line running `jupyter notebook` here, use `--debug` if possible.
Browser Output
Paste the output from your browser Javascript console here, if applicable.

================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: Is this a common issue? See our Docs. url: https://jupyter-notebook.readthedocs.io/en/latest/troubleshooting.html#what-to-do-when-things-go-wrong about: Before opening an issue, make sure your issue hasn't already been addressed in the documentation. - name: 🤔 Support and all other questions, including if you're not sure what to do. url: https://discourse.jupyter.org/c/notebook/31 about: If you have a question or you're having issues installing Jupyter Notebook, try posting on Discourse. - name: 💬 Chat with the devs url: https://jupyter.zulipchat.com/ about: Ask short questions about using Jupyter Notebook - name: 📝 Do you have a feature request that may be applied upstream? See JupyterLab. url: https://github.com/jupyterlab/jupyterlab about: We recommend that you cross-reference JupyterLab for information when requesting new features and support for Notebook 7. We won't likely accept new features for Jupyter Notebook 6.x. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: "\U0001F680 Feature Request" about: Suggest a new feature or a change labels: enhancement, status:Needs Triage --- ### Problem ### Proposed Solution ### Additional context ================================================ FILE: .github/actions/build-dist/action.yml ================================================ name: 'Build Jupyter Notebook' description: 'Build Jupyter Notebook from source' runs: using: 'composite' steps: - name: Base Setup uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Install dependencies shell: bash run: | python -m pip install hatch - name: Build pypi distributions shell: bash run: | hatch build - name: Build npm distributions shell: bash run: | mkdir pkgs hatch run npm_pack cp packages/*/*.tgz pkgs - name: Build checksum file shell: bash run: | cd dist sha256sum * | tee SHA256SUMS cd ../pkgs sha256sum * | tee SHA256SUMS - name: Upload distributions uses: actions/upload-artifact@v4 with: name: notebook-dist-${{ github.run_number }} path: ./dist - name: Upload distributions uses: actions/upload-artifact@v4 with: name: notebook-pkgs-${{ github.run_number }} path: ./pkgs ================================================ FILE: .github/answered.yml ================================================ # This action automatically schedules issues to be closed that have been # labeled as answered if there is no activity on them for 30 days. This takes # care of the common usecase of an issue being answered to the best of our # ability and no other follow-up from the submitter. name: 'Close answered issues' on: schedule: - cron: '30 1 * * *' jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v3 with: skip-stale-issue-message: true days-before-stale: 30 days-before-close: 7 stale-issue-label: 'status:Closing as Answered' only-issue-labels: 'status:Answered' ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: 'github-actions' directory: '/' schedule: interval: 'weekly' groups: actions: patterns: - "*" - package-ecosystem: 'pip' directory: '/' schedule: interval: 'weekly' ================================================ FILE: .github/jupyterlab-probot.yml ================================================ addBinderLink: false triageLabel: 'status:Needs Triage' ================================================ FILE: .github/pull_request_template.md ================================================ ## References ## Code changes ## User-facing changes ## Backwards-incompatible changes ================================================ FILE: .github/workflows/auto_author_assign.yml ================================================ # https://github.com/marketplace/actions/auto-author-assign name: 'Auto Author Assign' on: pull_request_target: types: [opened, reopened] permissions: contents: read jobs: assign-author: runs-on: ubuntu-latest permissions: pull-requests: write steps: - uses: toshimaru/auto-author-assign@v3.0.1 ================================================ FILE: .github/workflows/binder.yml ================================================ name: Binder Badge on: pull_request_target: types: [opened] permissions: contents: read jobs: binder: runs-on: ubuntu-latest permissions: pull-requests: write steps: - uses: jupyterlab/maintainer-tools/.github/actions/binder-link@v1 with: github_token: ${{ secrets.github_token }} url_path: tree ================================================ FILE: .github/workflows/build.yml ================================================ name: Build on: push: branches: ['main'] pull_request: schedule: - cron: '0 0 * * *' permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true env: PIP_DISABLE_PIP_VERSION_CHECK: 1 defaults: run: shell: bash -eux {0} jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - name: Build uses: ./.github/actions/build-dist test: runs-on: ubuntu-latest timeout-minutes: 20 strategy: fail-fast: false matrix: # used by the jupyterlab/maintainer-tools base-setup action python-version: ['3.10', '3.11', '3.12', '3.13', '3.14'] steps: - name: Checkout uses: actions/checkout@v6 - name: Base Setup uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Test the package run: hatch run cov:test - name: JavaScript tests run: | hatch run js_test - name: Integration Tests run: | pip install . cd jupyter labextension list 2>&1 | grep -ie "@jupyter-notebook/lab-extension.*enabled.*ok" - jupyter server extension list 2>&1 | grep -ie "notebook.*enabled" - python -m jupyterlab.browser_check - uses: jupyterlab/maintainer-tools/.github/actions/upload-coverage@v1 coverage: runs-on: ubuntu-latest needs: - test steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/report-coverage@v1 with: fail_under: 78 test_docs: name: Test Docs runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - run: | sudo apt-get update sudo apt install enchant-2 # for spelling # pandoc is not up to date in the ubuntu repos, so we install directly wget https://github.com/jgm/pandoc/releases/download/2.14.2/pandoc-2.14.2-1-amd64.deb && sudo dpkg -i pandoc-2.14.2-1-amd64.deb - run: hatch run docs:build test_minimum_versions: name: Test Minimum Versions timeout-minutes: 20 runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 with: dependency_type: minimum python_version: '3.10' - name: Run the unit tests run: | hatch run test:nowarn || hatch run test:nowarn --lf test_prereleases: name: Test Prereleases runs-on: ubuntu-latest timeout-minutes: 20 steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 with: dependency_type: pre # TODO: Remove this pin once rpds-py supports Python 3.15. # Upstream: https://github.com/crate-py/rpds/issues/210 python_version: '3.14' - name: Run the tests run: | hatch run test:nowarn || hatch run test:nowarn --lf install: needs: [build] runs-on: ${{ matrix.os }} timeout-minutes: 15 strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] python: ['3.10', '3.12', '3.14'] include: - python: '3.10' dist: 'notebook*.tar.gz' - python: '3.12' dist: 'notebook*.whl' - python: '3.14' dist: 'notebook*.whl' - os: windows-latest py_cmd: python - os: macos-latest py_cmd: python3 - os: ubuntu-latest py_cmd: python steps: - name: Install Python uses: actions/setup-python@v6 with: python-version: ${{ matrix.python }} allow-prereleases: true - uses: actions/download-artifact@v8 with: name: notebook-dist-${{ github.run_number }} path: ./dist - name: Install the prerequisites run: | ${{ matrix.py_cmd }} -m pip install -U pip wheel - name: Install the package run: | cd dist ${{ matrix.py_cmd }} -m pip install -vv ${{ matrix.dist }} - name: Validate environment run: | ${{ matrix.py_cmd }} -m pip freeze ${{ matrix.py_cmd }} -m pip check - name: Validate the install run: | jupyter labextension list jupyter labextension list 2>&1 | grep -ie "@jupyter-notebook/lab-extension.*enabled.*ok" - jupyter server extension list jupyter server extension list 2>&1 | grep -ie "notebook.*enabled" - jupyter notebook --version jupyter notebook --help check_links: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - uses: jupyterlab/maintainer-tools/.github/actions/check-links@v1 with: ignore_links: 'https://playwright.dev/docs/test-cli/ https://blog.jupyter.org/.* https://mybinder.org/v2/gh/jupyter/notebook/main https://nbviewer.jupyter.org https://stackoverflow.com https://github.com/[^/]+/?$' ignore_glob: 'ui-tests/test/notebooks/*' test_lint: name: Test Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Run Linters run: | hatch run typing:test hatch run lint:build pipx run interrogate -v . pipx run doc8 --max-line-length=200 docs/source *.md npm install -g yarn yarn yarn eslint:check yarn prettier:check yarn build:utils yarn integrity tests_check: # This job does nothing and is only used for the branch protection if: always() needs: - coverage - install - test_lint - test_docs - test_minimum_versions - test_prereleases - check_links runs-on: ubuntu-latest steps: - name: Decide whether the needed jobs succeeded or failed uses: re-actors/alls-green@release/v1 with: jobs: ${{ toJSON(needs) }} ================================================ FILE: .github/workflows/buildutils.yml ================================================ name: Build Utilities on: push: branches: ['main'] pull_request: defaults: run: shell: bash -l {0} concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true permissions: contents: read jobs: versioning: runs-on: ubuntu-latest timeout-minutes: 10 steps: - name: Checkout uses: actions/checkout@v6 - name: Base Setup uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Install dependencies run: | python -m pip install -U "jupyterlab>=4.6.0a0,<4.7" hatch jlpm jlpm run build - name: Configure git identity to commit run: | git config --global user.email "you@example.com" git config --global user.name "Your Name" - name: Reset version run: | hatch version 9.8.7 jlpm run lerna version 9.8.7 --no-push --force-publish --no-git-tag-version --yes git commit -am "Release 9.8.7" - name: Patch Release run: | jlpm release:patch --force - name: Minor Release run: | jlpm release:bump minor --force - name: Release Cycle run: | # beta jlpm release:bump release --force # rc jlpm release:bump release --force # final jlpm release:bump release --force - name: Major Release run: | jlpm release:bump major --force npm: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - name: Install Python uses: actions/setup-python@v6 with: python-version: '3.10' architecture: 'x64' - name: Install dependencies run: | python -m pip install -U "jupyterlab>=4.6.0a0,<4.7" pip jlpm jlpm run build ================================================ FILE: .github/workflows/check-release.yml ================================================ name: Check Release on: push: branches: ['main'] pull_request: permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true jobs: check_release: runs-on: ubuntu-latest timeout-minutes: 30 steps: - name: Checkout uses: actions/checkout@v6 - name: Base Setup uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Check Release uses: jupyter-server/jupyter_releaser/.github/actions/check-release@v2 with: token: ${{ secrets.GITHUB_TOKEN }} version_spec: next - name: Upload Distributions uses: actions/upload-artifact@v7 with: name: notebook-jupyter-releaser-dist-${{ github.run_number }} path: .jupyter_releaser_checkout/dist ================================================ FILE: .github/workflows/enforce-label.yml ================================================ name: Enforce PR label permissions: contents: read on: pull_request: types: [labeled, unlabeled, opened, edited, synchronize] jobs: enforce-label: runs-on: ubuntu-latest permissions: pull-requests: write steps: - name: enforce-triage-label uses: jupyterlab/maintainer-tools/.github/actions/enforce-label@v1 ================================================ FILE: .github/workflows/lock.yml ================================================ name: 'Lock Closed Threads' on: schedule: - cron: '0 0 * * *' permissions: contents: read jobs: lock: runs-on: ubuntu-latest permissions: issues: write pull-requests: write steps: - uses: dessant/lock-threads@v6 with: github-token: ${{ github.token }} issue-lock-inactive-days: '180' issue-lock-labels: 'status:resolved-locked' pr-lock-inactive-days: '180' pr-lock-labels: 'status:resolved-locked' ================================================ FILE: .github/workflows/playwright-update.yml ================================================ name: Update Playwright Snapshots on: issue_comment: types: [created, edited] permissions: contents: read jobs: update-snapshots: runs-on: ubuntu-latest permissions: # Required by actions/update-snapshots contents: write pull-requests: write strategy: fail-fast: false matrix: browser: [firefox, chromium] # Only run on issue comments if: github.event.issue.pull_request && contains(github.event.comment.body, 'please update snapshots') steps: - uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots-checkout@main with: github_token: ${{ secrets.GITHUB_TOKEN }} - name: Base Setup uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Build uses: ./.github/actions/build-dist - uses: actions/download-artifact@v8 with: name: notebook-dist-${{ github.run_number }} path: ./dist - name: Install the package run: | cd dist python -m pip install -vv notebook*.whl # disable git hooks git config core.hooksPath no-hooks - name: Install the test dependencies run: | cd ui-tests jlpm jlpm playwright install - name: Update snapshots uses: jupyterlab/maintainer-tools/.github/actions/update-snapshots@v1 with: github_token: ${{ secrets.GITHUB_TOKEN }} npm_client: jlpm test_folder: ui-tests start_server_script: 'null' update_script: test:update --browser ${{ matrix.browser }} env: DEBUG: pw:webserver ================================================ FILE: .github/workflows/prep-release.yml ================================================ name: "Step 1: Prep Release" on: workflow_dispatch: inputs: version_spec: description: "New Version Specifier" default: "next" required: false branch: description: "The branch to target" required: false post_version_spec: description: "Post Version Specifier" required: false silent: description: "Set a placeholder in the changelog and don't publish the release." required: false type: boolean since: description: "Use PRs with activity since this date or git reference" required: false since_last_stable: description: "Use PRs with activity since the last stable git tag" required: false type: boolean jobs: prep_release: runs-on: ubuntu-latest permissions: contents: write steps: - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Prep Release id: prep-release uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@v2 with: token: ${{ secrets.GITHUB_TOKEN }} version_spec: ${{ github.event.inputs.version_spec }} silent: ${{ github.event.inputs.silent }} post_version_spec: ${{ github.event.inputs.post_version_spec }} target: ${{ github.event.inputs.target }} branch: ${{ github.event.inputs.branch }} since: ${{ github.event.inputs.since }} since_last_stable: ${{ github.event.inputs.since_last_stable }} - name: "** Next Step **" run: | echo "Optional): Review Draft Release: ${{ steps.prep-release.outputs.release_url }}" ================================================ FILE: .github/workflows/publish-changelog.yml ================================================ name: "Publish Changelog" on: release: types: [published] workflow_dispatch: inputs: branch: description: "The branch to target" required: false jobs: publish_changelog: runs-on: ubuntu-latest environment: release steps: - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - uses: actions/create-github-app-token@v2 id: app-token with: app-id: ${{ vars.APP_ID }} private-key: ${{ secrets.APP_PRIVATE_KEY }} - name: Publish changelog id: publish-changelog uses: jupyter-server/jupyter_releaser/.github/actions/publish-changelog@v2 with: token: ${{ steps.app-token.outputs.token }} branch: ${{ github.event.inputs.branch }} - name: "** Next Step **" run: | echo "Merge the changelog update PR: ${{ steps.publish-changelog.outputs.pr_url }}" ================================================ FILE: .github/workflows/publish-release.yml ================================================ name: "Step 2: Publish Release" on: workflow_dispatch: inputs: branch: description: "The target branch" required: false release_url: description: "The URL of the draft GitHub release" required: false steps_to_skip: description: "Comma separated list of steps to skip" required: false jobs: publish_release: runs-on: ubuntu-latest environment: release permissions: id-token: write steps: - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - uses: actions/create-github-app-token@v2 id: app-token with: app-id: ${{ vars.APP_ID }} private-key: ${{ secrets.APP_PRIVATE_KEY }} - name: Populate Release id: populate-release uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2 with: token: ${{ steps.app-token.outputs.token }} branch: ${{ github.event.inputs.branch }} release_url: ${{ github.event.inputs.release_url }} steps_to_skip: ${{ github.event.inputs.steps_to_skip }} - name: Finalize Release id: finalize-release env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} uses: jupyter-server/jupyter_releaser/.github/actions/finalize-release@v2 with: token: ${{ steps.app-token.outputs.token }} release_url: ${{ steps.populate-release.outputs.release_url }} - name: "** Next Step **" if: ${{ success() }} run: | echo "Verify the final release" echo ${{ steps.finalize-release.outputs.release_url }} - name: "** Failure Message **" if: ${{ failure() }} run: | echo "Failed to Publish the Draft Release Url:" echo ${{ steps.populate-release.outputs.release_url }} ================================================ FILE: .github/workflows/ui-tests.yml ================================================ name: UI Tests on: push: branches: ['main'] pull_request: concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true permissions: contents: read jobs: build: name: Build runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - name: Build uses: ./.github/actions/build-dist ui-tests: needs: [build] runs-on: ubuntu-latest timeout-minutes: 20 strategy: fail-fast: false matrix: browser: [firefox, chromium] steps: - name: Checkout uses: actions/checkout@v6 - name: Base Setup uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - uses: actions/download-artifact@v8 with: name: notebook-dist-${{ github.run_number }} path: ./dist - name: Install the package run: | cd dist python -m pip install -vv notebook*.whl - name: Install the test dependencies run: | cd ui-tests jlpm jlpm playwright install - name: Test run: | cd ui-tests jlpm test --browser ${{ matrix.browser }} - name: Upload Playwright Test assets if: always() uses: actions/upload-artifact@v7 with: name: notebook-${{ matrix.browser }}-test-assets path: | ui-tests/test-results - name: Upload Playwright Test report if: always() uses: actions/upload-artifact@v7 with: name: notebook-${{ matrix.browser }}-test-report path: | ui-tests/playwright-report - name: Update snapshots if: failure() run: | cd ui-tests # remove previous snapshots from other browser jlpm rimraf "test/**/*-snapshots/*.png" # generate new snapshots jlpm run test:update --browser ${{ matrix.browser }} - name: Upload updated snapshots if: failure() uses: actions/upload-artifact@v7 with: name: notebook-${{ matrix.browser }}-updated-snapshots path: ui-tests/test ================================================ FILE: .github/workflows/upgrade-jupyterlab-dependencies.yml ================================================ name: Check for latest JupyterLab releases on: # schedule: # - cron: 30 17 * * * workflow_dispatch: inputs: version: description: 'JupyterLab version' default: latest required: true type: string branch: description: 'The branch to target' default: main required: false type: string target_repo: description: 'Target repository' required: false default: jupyter/notebook type: string env: version_tag: 'latest' permissions: actions: write contents: write pull-requests: write jobs: check_for_lab_updates: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v6 with: ref: ${{ inputs.branch || 'main' }} - name: Set up Python uses: actions/setup-python@v6 with: python-version: '3.11' - name: Install Node uses: actions/setup-node@v6 with: node-version: '20.x' - name: Install npm dependencies and build buildutils run: | python -m pip install -e ".[dev]" jlpm jlpm run build:utils - name: Check for new releases and update shell: bash run: | set -eux for version in ${{ inputs.version || env.version_tag }} do if [[ "${version}" == "latest" ]]; then export LATEST=$(jlpm run get:lab:version --set-version ${version}) else export LATEST=${version} fi done echo "latest=${LATEST}" >> $GITHUB_ENV jlpm upgrade:lab:dependencies --set-version ${LATEST} if [[ ! -z "$(git status --porcelain package.json)" ]]; then jlpm jlpm deduplicate cd ui-tests jlpm jlpm deduplicate fi - uses: prefix-dev/setup-pixi@v0.9.4 with: pixi-version: v0.41.4 manifest-path: pyproject.toml locked: false - name: Update pixi.lock run: pixi install - name: Create a PR env: GH_TOKEN: ${{ secrets.PERSONAL_GITHUB_TOKEN || secrets.GITHUB_TOKEN }} run: | set -eux export LATEST=${{ env.latest }} export BRANCH_NAME=update-to-v${LATEST} # if resulted in any change: if [[ ! -z "$(git status --porcelain package.json)" ]]; then # if branch already exists. if git ls-remote --heads origin | grep "refs/heads/${BRANCH_NAME}$" > /dev/null; then echo "Branch '${BRANCH_NAME}' exists." else # new branch is created git checkout -b "${BRANCH_NAME}" git config user.name "github-actions[bot]" git config user.email 'github-actions[bot]@users.noreply.github.com' git commit . -m "Update to JupyterLab v${LATEST}" git push --set-upstream origin "${BRANCH_NAME}" PR_ARGS=( --base "${{ inputs.branch || 'main' }}" --title "Update to JupyterLab v${LATEST}" --body "New JupyterLab release [v${LATEST}](https://github.com/jupyterlab/jupyterlab/releases/tag/v${LATEST}) is available. Please review the lock file carefully." ) # Add --repo flag only if target_repo is specified if [[ -n "${{ inputs.target_repo }}" ]]; then PR_ARGS+=(--repo "${{ inputs.target_repo }}") fi gh pr create "${PR_ARGS[@]}" fi fi ================================================ FILE: .gitignore ================================================ *.bundle.* lib/ node_modules/ *.egg-info/ .ipynb_checkpoints *.tsbuildinfo # Created by https://www.gitignore.io/api/python # Edit at https://www.gitignore.io/?templates=python ### Python ### # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # Mr Developer .mr.developer.cfg .project .pydevproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # OS X stuff *.DS_Store # End of https://www.gitignore.io/api/python _temp_extension junit.xml [uU]ntitled* notebook/static/* !notebook/static/favicons notebook/labextension notebook/schemas docs/source/changelog.md docs/source/contributing.md # playwright ui-tests/test-results ui-tests/playwright-report # VSCode .vscode # RTC .jupyter_ystore.db # yarn >=2.x local files .yarn/* .pnp.* ui-tests/.yarn/* ui-tests/.pnp.* # keep potential upstream patches !.yarn/patches # generated html notebook/templates/*.html # pixi environments .pixi *.egg-info # Temporary files used for testing tmp/ ================================================ FILE: .pre-commit-config.yaml ================================================ ci: autoupdate_schedule: monthly autoupdate_commit_msg: 'chore: update pre-commit hooks' repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - id: check-case-conflict - id: check-ast - id: check-docstring-first - id: check-executables-have-shebangs - id: check-added-large-files - id: check-case-conflict - id: check-merge-conflict - id: check-json - id: check-toml - id: check-yaml - id: debug-statements - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema rev: 0.30.0 hooks: - id: check-github-workflows - repo: https://github.com/codespell-project/codespell rev: 'v2.3.0' hooks: - id: codespell args: ['-L', 'hart,noteable', '--skip', "*.spec.ts"] exclude: | (?x)^( yarn.lock| pixi.lock| binder/example.ipynb| docs/source/examples/images/FrontendKernel.graffle/data.plist| )$ - repo: https://github.com/pre-commit/mirrors-mypy rev: "v1.14.1" hooks: - id: mypy files: "^notebook" stages: [manual] args: ["--install-types", "--non-interactive"] additional_dependencies: ["traitlets>=5.13", "tornado", "jupyter_server>=2.10", "jupyterlab_server>=2.25", "jupyterlab>=4.6.0a4,<4.7"] - repo: https://github.com/pre-commit/pygrep-hooks rev: 'v1.10.0' hooks: - id: rst-backticks - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.8.6 hooks: - id: ruff types_or: [ python, jupyter ] exclude: '^docs/source/examples/Notebook/Importing Notebooks.ipynb' args: ['--fix', '--show-fixes'] - id: ruff-format types_or: [ python, jupyter ] exclude: '^docs/source/examples/Notebook/Importing Notebooks.ipynb' - repo: https://github.com/scientific-python/cookie rev: '2024.08.19' hooks: - id: sp-repo-review additional_dependencies: ['repo-review[cli]'] - repo: local hooks: - id: prettier name: prettier entry: 'npm run prettier:files' language: node types_or: [json, ts, tsx, javascript, jsx, css, markdown] stages: [manual] - id: integrity name: integrity entry: 'npm run integrity --force' language: node stages: [pre-push] ================================================ FILE: .prettierignore ================================================ node_modules .mypy_cache .ruff_cache **/node_modules **/lib **/package.json **/static **/labextension build CHANGELOG.md app/index.template.js .pixi ================================================ FILE: .prettierrc ================================================ { "singleQuote": true } ================================================ FILE: .readthedocs.yaml ================================================ version: 2 sphinx: configuration: docs/source/conf.py build: os: ubuntu-22.04 tools: python: '3.10' nodejs: '16' python: install: # install notebook itself - method: pip path: '.[docs]' ================================================ FILE: .yarnrc.yml ================================================ enableImmutableInstalls: false enableInlineBuilds: false enableTelemetry: false httpTimeout: 60000 nodeLinker: node-modules ================================================ FILE: CHANGELOG.md ================================================ # Changelog A summary of changes in the Jupyter notebook. For more detailed information, see [GitHub](https://github.com/jupyter/notebook). Use `pip install notebook --upgrade` or `conda upgrade notebook` to upgrade to the latest release. We strongly recommend that you upgrade pip to version 9+ of pip before upgrading `notebook`. Use `pip install pip --upgrade` to upgrade pip. Check pip version with `pip --version`. ## 7.5 Jupyter Notebook 7.5 is based on JupyterLab 4.5, and includes a number of new features, bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0. Extension authors are recommended to consult the [Extension Migration Guide](https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-4-to-4-5) which lists deprecations and changes to the public API. Below are a few highlights for this new release. Most of the new features and improvements come from the update to JupyterLab 4.5, although they may not all be supported in Notebook 7.5. For reference you may have a look at the [JupyterLab 4.5 changelog](https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-5) to learn more. ### Notebook improvements The default windowing mode is now `contentVisibility` which improves cell rendering and alleviates previously reported issues. The minimap can be enabled for all windowing modes and all notebooks via the `Settings` menu, or by toggling the minimap per notebook with the `View` -> `Show Minimap` option. Additional fixes improve layout containment and scrollbar behavior when working with long cells. ### Debugger and console enhancements The debugger's evaluate dialog has been replaced with an interactive console featuring syntax highlighting and code completion. The variables panel now preserves state when switching editors. Visual improvements include highlighted selected breakpoints, improved empty line handling, and a paused indicator. Debugger panels now reference cell execution counts. Debugger panels with reference to execution counts and paused indicator as well as console evaluation Log Console users can configure default log levels and customize toolbars. ### Terminal enhancements The terminal now includes search functionality, with search highlights that adapt to theme changes. ### Media and content support Built-in audio and video viewers allow direct file playback within Jupyter Notebook. Video file opened in a Jupyter Notebook tab ### File browser enhancements - There is a new `allowFileUploads` setting to control upload permissions. - Menu options for creating Python, R, or Julia files are now available from the New menu. - The "Select All" command is now available with the Ctrl + A (or Cmd + A on macOS) keyboard shortcut in the file browser. - Breadcrumbs are now configurable through `breadcrumbsLeftItems` and `breadcrumbsRightItems` settings. ### Settings editor improvements The `addExtraLineOnCellMerge` setting removes extra lines when merging cells, matching classic notebook behavior. ### Cell toolbar settings The cell toolbar settings are now exposed in the Settings Editor, making it easier to customize the cell toolbar appearance and behavior. ### Keyboard shortcuts The `O` key has been defined as the keyboard shortcut to toggle cell outputs, restoring this familiar functionality from the classic notebook. ### User interface and accessibility Automatic theme switching between light and dark modes is now available when system synchronization is enabled. Dialog components display buttons and checkboxes on separate lines for improved readability. Terminal selections show better visibility under high-contrast themes. Keyboard navigation and status bar tab ordering have been improved. ### Breaking changes Python 3.8 support has been dropped in this release. ## 7.6.0a4 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.6.0-alpha.3...fc791fcb0af893e3ffe7563a4140ec6af8c9dbe2)) ### Bugs fixed - Prevent scratchpad console title to update [#7843](https://github.com/jupyter/notebook/pull/7843) ([@brichet](https://github.com/brichet), [@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update to JupyterLab v4.6.0a4 [#7859](https://github.com/jupyter/notebook/pull/7859) ([@jtpio](https://github.com/jtpio)) - Fix check links [#7857](https://github.com/jupyter/notebook/pull/7857) ([@jtpio](https://github.com/jtpio)) - TypeScript 5.9 [#7855](https://github.com/jupyter/notebook/pull/7855) ([@jtpio](https://github.com/jtpio)) - Bump the actions group with 2 updates [#7846](https://github.com/jupyter/notebook/pull/7846) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release The following people contributed discussions, new ideas, code and documentation contributions, and review. See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports). ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2026-02-24&to=2026-03-12&type=c)) @brichet ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2026-02-24..2026-03-12&type=Issues)) | @jtpio ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2026-02-24..2026-03-12&type=Issues)) ## 7.6.0a3 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.6.0-alpha.2...767a30d1ec90e9baf4975023c7019c95d9fe8614)) ### Enhancements made - Update to JupyterLab v4.6.0a3 [#7839](https://github.com/jupyter/notebook/pull/7839) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Fix PyO3 CI failure with Python 3.15 [#7836](https://github.com/jupyter/notebook/pull/7836) ([@jtpio](https://github.com/jtpio)) - Update to ESLint 9, update other dependencies [#7821](https://github.com/jupyter/notebook/pull/7821) ([@jtpio](https://github.com/jtpio)) - Bump prefix-dev/setup-pixi from 0.9.3 to 0.9.4 in the actions group [#7819](https://github.com/jupyter/notebook/pull/7819) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - docs: Fix broken links in troubleshooting and migration docs [#7824](https://github.com/jupyter/notebook/pull/7824) ([@RamiNoodle733](https://github.com/RamiNoodle733), [@jtpio](https://github.com/jtpio)) - Fix grammar: join sentences in CONTRIBUTING.md [#7813](https://github.com/jupyter/notebook/pull/7813) ([@bodhisilberling](https://github.com/bodhisilberling), [@krassowski](https://github.com/krassowski)) ### Contributors to this release The following people contributed discussions, new ideas, code and documentation contributions, and review. See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports). ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2026-01-23&to=2026-02-24&type=c)) @bodhisilberling ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abodhisilberling+updated%3A2026-01-23..2026-02-24&type=Issues)) | @jtpio ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2026-01-23..2026-02-24&type=Issues)) | @krassowski ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2026-01-23..2026-02-24&type=Issues)) | @RamiNoodle733 ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARamiNoodle733+updated%3A2026-01-23..2026-02-24&type=Issues)) ## 7.6.0a2 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.6.0-alpha.1...209c7da02e8245ec96bf121a641802096ff8cbb3)) ### Enhancements made - Add a scratch-pad console to the notebook [#7790](https://github.com/jupyter/notebook/pull/7790) ([@brichet](https://github.com/brichet), [@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update to JupyterLab v4.6.0a2 [#7814](https://github.com/jupyter/notebook/pull/7814) ([@jtpio](https://github.com/jtpio)) - Bump the actions group with 4 updates [#7811](https://github.com/jupyter/notebook/pull/7811) ([@jtpio](https://github.com/jtpio)) - Bump tar from 6.1.13 to 6.2.1 in /ui-tests [#7810](https://github.com/jupyter/notebook/pull/7810) ([@jtpio](https://github.com/jtpio)) - Update snapshots bot checkout and permission check [#7806](https://github.com/jupyter/notebook/pull/7806) ([@martinRenou](https://github.com/martinRenou), [@krassowski](https://github.com/krassowski)) - Rename the token env variable [#7802](https://github.com/jupyter/notebook/pull/7802) ([@brichet](https://github.com/brichet), [@jtpio](https://github.com/jtpio)) ### Contributors to this release The following people contributed discussions, new ideas, code and documentation contributions, and review. See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports). ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2026-01-12&to=2026-01-23&type=c)) @brichet ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2026-01-12..2026-01-23&type=Issues)) | @jtpio ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2026-01-12..2026-01-23&type=Issues)) | @krassowski ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2026-01-12..2026-01-23&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AmartinRenou+updated%3A2026-01-12..2026-01-23&type=Issues)) ## 7.6.0a1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.6.0-alpha.0...aa605fa66c6885d85a37c7ab3ba6e7f7a837a810)) ### Enhancements made - Add PR template [#7792](https://github.com/jupyter/notebook/pull/7792) ([@KH-Coder865](https://github.com/KH-Coder865), [@andrii-i](https://github.com/andrii-i)) ### Bugs fixed - Fix toggling the side panels from menu [#7799](https://github.com/jupyter/notebook/pull/7799) ([@brichet](https://github.com/brichet), [@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Clean up node 24 install [#7803](https://github.com/jupyter/notebook/pull/7803) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.6.0a1 [#7801](https://github.com/jupyter/notebook/pull/7801) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Fix grammar in notebook documentation [#7794](https://github.com/jupyter/notebook/pull/7794) ([@xlumzee](https://github.com/xlumzee), [@krassowski](https://github.com/krassowski)) ### Contributors to this release The following people contributed discussions, new ideas, code and documentation contributions, and review. See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/#how-does-this-tool-define-contributions-in-the-reports). ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-12-17&to=2026-01-12&type=c)) @andrii-i ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandrii-i+updated%3A2025-12-17..2026-01-12&type=Issues)) | @brichet ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2025-12-17..2026-01-12&type=Issues)) | @jtpio ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-12-17..2026-01-12&type=Issues)) | @KH-Coder865 ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AKH-Coder865+updated%3A2025-12-17..2026-01-12&type=Issues)) | @krassowski ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2025-12-17..2026-01-12&type=Issues)) | @xlumzee ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Axlumzee+updated%3A2025-12-17..2026-01-12&type=Issues)) ## 7.6.0a0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.1...e7f5e5d50ea18b0b17fe8a9df674025fcc6ab5d1)) ### Maintenance and upkeep improvements - Bump systeminformation from 5.23.14 to 5.27.14 in /ui-tests [#7788](https://github.com/jupyter/notebook/pull/7788) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab `4.6.0a0` [#7787](https://github.com/jupyter/notebook/pull/7787) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release The following people contributed discussions, new ideas, code and documentation contributions, and review. See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/#how-does-this-tool-define-contributions-in-the-reports). ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-12-16&to=2025-12-17&type=c)) @jtpio ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-12-16..2025-12-17&type=Issues)) ## 7.5.1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.0...fccf56801be0a27a3de76c00d2710a941f255b10)) ### Bugs fixed - Fix selector for the `O` keyboard shortcut [#7782](https://github.com/jupyter/notebook/pull/7782) ([@jtpio](https://github.com/jtpio), [@krassowski](https://github.com/krassowski)) - Fix missing debugger display provider in Notebook [#7774](https://github.com/jupyter/notebook/pull/7774) ([@arjxn-py](https://github.com/arjxn-py), [@jtpio](https://github.com/jtpio), [@martinRenou](https://github.com/martinRenou)) ### Maintenance and upkeep improvements - Update to JupyterLab v4.5.1 [#7785](https://github.com/jupyter/notebook/pull/7785) ([@jtpio](https://github.com/jtpio)) - Fix link to the IPython install page [#7783](https://github.com/jupyter/notebook/pull/7783) ([@jtpio](https://github.com/jtpio)) - Fix `hatch build`, ignore links to `blog.jupyter.org` [#7780](https://github.com/jupyter/notebook/pull/7780) ([@jtpio](https://github.com/jtpio)) - Bump the actions group with 4 updates [#7773](https://github.com/jupyter/notebook/pull/7773) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release The following people contributed discussions, new ideas, code and documentation contributions, and review. See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/#how-does-this-tool-define-contributions-in-the-reports). ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-11-19&to=2025-12-16&type=c)) @arjxn-py ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aarjxn-py+updated%3A2025-11-19..2025-12-16&type=Issues)) | @jtpio ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-11-19..2025-12-16&type=Issues)) | @krassowski ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2025-11-19..2025-12-16&type=Issues)) | @martinRenou ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AmartinRenou+updated%3A2025-11-19..2025-12-16&type=Issues)) ## 7.5.0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0...be53ec8bc96cdbcb64b6f1c5ec39c123c087a348)) ### Enhancements made - Update to JupyterLab v4.5.0b1 [#7746](https://github.com/jupyter/notebook/pull/7746) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.5.0b0 [#7739](https://github.com/jupyter/notebook/pull/7739) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.5.0a4 [#7728](https://github.com/jupyter/notebook/pull/7728) ([@jtpio](https://github.com/jtpio)) - Increase the checkpoint polling interval to 30s [#7711](https://github.com/jupyter/notebook/pull/7711) ([@jtpio](https://github.com/jtpio)) - Define `O` as the keyboard shortcut to toggle cell outputs [#7709](https://github.com/jupyter/notebook/pull/7709) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.5.0a3 [#7703](https://github.com/jupyter/notebook/pull/7703) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Expose the cell toolbar settings [#7766](https://github.com/jupyter/notebook/pull/7766) ([@jtpio](https://github.com/jtpio)) - Handle file rename errors [#7710](https://github.com/jupyter/notebook/pull/7710) ([@jtpio](https://github.com/jtpio)) - Fix open file with “#” in the filename [#7698](https://github.com/jupyter/notebook/pull/7698) ([@itsmevichu](https://github.com/itsmevichu)) ### Maintenance and upkeep improvements - Update to JupyterLab v4.5.0 [#7768](https://github.com/jupyter/notebook/pull/7768) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.5.0rc1 [#7764](https://github.com/jupyter/notebook/pull/7764) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.5.0rc0 [#7755](https://github.com/jupyter/notebook/pull/7755) ([@jtpio](https://github.com/jtpio)) - Bump the actions group across 1 directory with 3 updates [#7751](https://github.com/jupyter/notebook/pull/7751) ([@dependabot](https://github.com/dependabot)) - Use Node.js 24 / npm 11 to publish releases [#7749](https://github.com/jupyter/notebook/pull/7749) ([@jtpio](https://github.com/jtpio)) - Revert "Pin `click<8.3`" [#7733](https://github.com/jupyter/notebook/pull/7733) ([@jtpio](https://github.com/jtpio)) - Remove link to `npmjs.com` [#7730](https://github.com/jupyter/notebook/pull/7730) ([@jtpio](https://github.com/jtpio)) - Pin `click<8.3` [#7729](https://github.com/jupyter/notebook/pull/7729) ([@jtpio](https://github.com/jtpio)) - Bump the actions group across 1 directory with 3 updates [#7704](https://github.com/jupyter/notebook/pull/7704) ([@dependabot](https://github.com/dependabot)) - Update to JupyterLab v4.5.0a2 [#7694](https://github.com/jupyter/notebook/pull/7694) ([@jtpio](https://github.com/jtpio)) - Pin `httpx` [#7691](https://github.com/jupyter/notebook/pull/7691) ([@jtpio](https://github.com/jtpio)) - Bump prefix-dev/setup-pixi from 0.8.10 to 0.8.11 in the actions group [#7675](https://github.com/jupyter/notebook/pull/7675) ([@dependabot](https://github.com/dependabot)) - Bump prefix-dev/setup-pixi from 0.8.8 to 0.8.10 in the actions group [#7665](https://github.com/jupyter/notebook/pull/7665) ([@dependabot](https://github.com/dependabot)) - Bump brace-expansion from 1.1.11 to 1.1.12 in /ui-tests [#7664](https://github.com/jupyter/notebook/pull/7664) ([@dependabot](https://github.com/dependabot)) - Revert "CI: pin to `jupyter-core<5.8.0` on Windows" [#7657](https://github.com/jupyter/notebook/pull/7657) ([@minrk](https://github.com/minrk)) - Update to JupyterLab v4.5.0a1 [#7656](https://github.com/jupyter/notebook/pull/7656) ([@jtpio](https://github.com/jtpio)) - CI: pin to `jupyter-core<5.8.0` on Windows [#7655](https://github.com/jupyter/notebook/pull/7655) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.5.0a0 [#7650](https://github.com/jupyter/notebook/pull/7650) ([@jtpio](https://github.com/jtpio)) - Run UI tests on `ubuntu-latest` [#7639](https://github.com/jupyter/notebook/pull/7639) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.4.1 [#7638](https://github.com/jupyter/notebook/pull/7638) ([@jtpio](https://github.com/jtpio)) - Bump prefix-dev/setup-pixi from 0.8.5 to 0.8.8 in the actions group [#7637](https://github.com/jupyter/notebook/pull/7637) ([@dependabot](https://github.com/dependabot)) - chore: Fix UP006 [#7633](https://github.com/jupyter/notebook/pull/7633) ([@honnix](https://github.com/honnix)) - Bump prefix-dev/setup-pixi from 0.8.4 to 0.8.5 in the actions group [#7632](https://github.com/jupyter/notebook/pull/7632) ([@dependabot](https://github.com/dependabot)) - Drop support for Python 3.8 [#7628](https://github.com/jupyter/notebook/pull/7628) ([@honnix](https://github.com/honnix)) ### Documentation improvements - User facing changelog for 7.5 [#7770](https://github.com/jupyter/notebook/pull/7770) ([@jtpio](https://github.com/jtpio)) - Clean up references to Gitpod [#7767](https://github.com/jupyter/notebook/pull/7767) ([@jtpio](https://github.com/jtpio)) - Fix link to Code of Conduct in CONTRIBUTING.md [#7758](https://github.com/jupyter/notebook/pull/7758) ([@jtpio](https://github.com/jtpio)) - Remove JupyterCon 2025 announcement banner [#7757](https://github.com/jupyter/notebook/pull/7757) ([@jasongrout](https://github.com/jasongrout)) - Update JupyterCon 2025 announcement links [#7744](https://github.com/jupyter/notebook/pull/7744) ([@krassowski](https://github.com/krassowski)) - Add JupyterCon banner and add Jupyter colors [#7727](https://github.com/jupyter/notebook/pull/7727) ([@choldgraf](https://github.com/choldgraf)) - Fix grammatical issues in Contributing.md [#7669](https://github.com/jupyter/notebook/pull/7669) ([@sangampaudel530](https://github.com/sangampaudel530)) - Fixed grammar and typos in CONTRIBUTING.md [#7645](https://github.com/jupyter/notebook/pull/7645) ([@jchen1223](https://github.com/jchen1223)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-04-09&to=2025-11-19&type=c)) [@afshin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aafshin+updated%3A2025-04-09..2025-11-19&type=Issues) | [@choldgraf](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Acholdgraf+updated%3A2025-04-09..2025-11-19&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2025-04-09..2025-11-19&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-04-09..2025-11-19&type=Issues) | [@honnix](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ahonnix+updated%3A2025-04-09..2025-11-19&type=Issues) | [@itsmevichu](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aitsmevichu+updated%3A2025-04-09..2025-11-19&type=Issues) | [@jasongrout](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajasongrout+updated%3A2025-04-09..2025-11-19&type=Issues) | [@jchen1223](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajchen1223+updated%3A2025-04-09..2025-11-19&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-04-09..2025-11-19&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2025-04-09..2025-11-19&type=Issues) | [@lumberbot-app](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Alumberbot-app+updated%3A2025-04-09..2025-11-19&type=Issues) | [@minrk](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aminrk+updated%3A2025-04-09..2025-11-19&type=Issues) | [@nkn2022](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ankn2022+updated%3A2025-04-09..2025-11-19&type=Issues) | [@sangampaudel530](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Asangampaudel530+updated%3A2025-04-09..2025-11-19&type=Issues) ## 7.5.0rc1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.0-rc.0...7533ccab5e4adc765e57a35b1791850daf952044)) ### Maintenance and upkeep improvements - Update to JupyterLab v4.5.0rc1 [#7764](https://github.com/jupyter/notebook/pull/7764) ([@jtpio](https://github.com/jtpio)) - Bump the actions group across 1 directory with 3 updates [#7751](https://github.com/jupyter/notebook/pull/7751) ([@dependabot](https://github.com/dependabot)) ### Documentation improvements - Fix link to Code of Conduct in CONTRIBUTING.md [#7758](https://github.com/jupyter/notebook/pull/7758) ([@jtpio](https://github.com/jtpio)) - Remove JupyterCon 2025 announcement banner [#7757](https://github.com/jupyter/notebook/pull/7757) ([@jasongrout](https://github.com/jasongrout)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-11-03&to=2025-11-14&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2025-11-03..2025-11-14&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-11-03..2025-11-14&type=Issues) | [@jasongrout](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajasongrout+updated%3A2025-11-03..2025-11-14&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-11-03..2025-11-14&type=Issues) ## 7.5.0rc0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.0-beta.1...18ba796a58402999044b7e8c4401319b76fed0ce)) ### Maintenance and upkeep improvements - Update to JupyterLab v4.5.0rc0 [#7755](https://github.com/jupyter/notebook/pull/7755) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-10-20&to=2025-11-03&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2025-10-20..2025-11-03&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-10-20..2025-11-03&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-10-20..2025-11-03&type=Issues) ## 7.5.0b1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.0-beta.0...7f84b95ed6550508f9de03d27cd8c2cb84777648)) ### Enhancements made - Update to JupyterLab v4.5.0b1 [#7746](https://github.com/jupyter/notebook/pull/7746) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Use Node.js 24 / npm 11 to publish releases [#7749](https://github.com/jupyter/notebook/pull/7749) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Update JupyterCon 2025 announcement links [#7744](https://github.com/jupyter/notebook/pull/7744) ([@krassowski](https://github.com/krassowski)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-09-29&to=2025-10-20&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-09-29..2025-10-20&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-09-29..2025-10-20&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2025-09-29..2025-10-20&type=Issues) | [@nkn2022](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ankn2022+updated%3A2025-09-29..2025-10-20&type=Issues) ## 7.5.0b0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.0-alpha.3...828708ec26cc4d2ff9f8b725b00024481ae42d2d)) ### Enhancements made - Update to JupyterLab v4.5.0b0 [#7739](https://github.com/jupyter/notebook/pull/7739) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Add JupyterCon banner and add Jupyter colors [#7727](https://github.com/jupyter/notebook/pull/7727) ([@choldgraf](https://github.com/choldgraf)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-09-24&to=2025-09-29&type=c)) [@choldgraf](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Acholdgraf+updated%3A2025-09-24..2025-09-29&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-09-24..2025-09-29&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-09-24..2025-09-29&type=Issues) ## 7.5.0a3 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.0-alpha.2...254b06ca4b232a0a96ad2dddde560e41df371e57)) ### Enhancements made - Update to JupyterLab v4.5.0a4 [#7728](https://github.com/jupyter/notebook/pull/7728) ([@jtpio](https://github.com/jtpio)) - Increase the checkpoint polling interval to 30s [#7711](https://github.com/jupyter/notebook/pull/7711) ([@jtpio](https://github.com/jtpio)) - Define `O` as the keyboard shortcut to toggle cell outputs [#7709](https://github.com/jupyter/notebook/pull/7709) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Handle file rename errors [#7710](https://github.com/jupyter/notebook/pull/7710) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Revert "Pin `click<8.3`" [#7733](https://github.com/jupyter/notebook/pull/7733) ([@jtpio](https://github.com/jtpio)) - Remove link to `npmjs.com` [#7730](https://github.com/jupyter/notebook/pull/7730) ([@jtpio](https://github.com/jtpio)) - Pin `click<8.3` [#7729](https://github.com/jupyter/notebook/pull/7729) ([@jtpio](https://github.com/jtpio)) - Bump the actions group across 1 directory with 3 updates [#7704](https://github.com/jupyter/notebook/pull/7704) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-08-18&to=2025-09-24&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2025-08-18..2025-09-24&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-08-18..2025-09-24&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-08-18..2025-09-24&type=Issues) | [@nkn2022](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ankn2022+updated%3A2025-08-18..2025-09-24&type=Issues) ## 7.5.0a2 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.0-alpha.1...3100d879bfe09c629b4add998bd2ac408ffa2af8)) ### Enhancements made - Update to JupyterLab v4.5.0a3 [#7703](https://github.com/jupyter/notebook/pull/7703) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fix open file with “#” in the filename [#7698](https://github.com/jupyter/notebook/pull/7698) ([@itsmevichu](https://github.com/itsmevichu)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-08-11&to=2025-08-18&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-08-11..2025-08-18&type=Issues) | [@itsmevichu](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aitsmevichu+updated%3A2025-08-11..2025-08-18&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-08-11..2025-08-18&type=Issues) ## 7.5.0a1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.5.0-alpha.0...f56a27c17bfd85f37a27dea9512c675120571e63)) ### Maintenance and upkeep improvements - Update to JupyterLab v4.5.0a2 [#7694](https://github.com/jupyter/notebook/pull/7694) ([@jtpio](https://github.com/jtpio)) - Pin `httpx` [#7691](https://github.com/jupyter/notebook/pull/7691) ([@jtpio](https://github.com/jtpio)) - Bump prefix-dev/setup-pixi from 0.8.10 to 0.8.11 in the actions group [#7675](https://github.com/jupyter/notebook/pull/7675) ([@dependabot](https://github.com/dependabot)) - Bump prefix-dev/setup-pixi from 0.8.8 to 0.8.10 in the actions group [#7665](https://github.com/jupyter/notebook/pull/7665) ([@dependabot](https://github.com/dependabot)) - Bump brace-expansion from 1.1.11 to 1.1.12 in /ui-tests [#7664](https://github.com/jupyter/notebook/pull/7664) ([@dependabot](https://github.com/dependabot)) - Revert "CI: pin to `jupyter-core<5.8.0` on Windows" [#7657](https://github.com/jupyter/notebook/pull/7657) ([@minrk](https://github.com/minrk)) - Update to JupyterLab v4.5.0a1 [#7656](https://github.com/jupyter/notebook/pull/7656) ([@jtpio](https://github.com/jtpio)) - CI: pin to `jupyter-core<5.8.0` on Windows [#7655](https://github.com/jupyter/notebook/pull/7655) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Fix grammatical issues in Contributing.md [#7669](https://github.com/jupyter/notebook/pull/7669) ([@sangampaudel530](https://github.com/sangampaudel530)) - Fixed grammar and typos in CONTRIBUTING.md [#7645](https://github.com/jupyter/notebook/pull/7645) ([@jchen1223](https://github.com/jchen1223)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-05-07&to=2025-08-11&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2025-05-07..2025-08-11&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-05-07..2025-08-11&type=Issues) | [@jchen1223](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajchen1223+updated%3A2025-05-07..2025-08-11&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-05-07..2025-08-11&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2025-05-07..2025-08-11&type=Issues) | [@minrk](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aminrk+updated%3A2025-05-07..2025-08-11&type=Issues) | [@sangampaudel530](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Asangampaudel530+updated%3A2025-05-07..2025-08-11&type=Issues) ## 7.5.0a0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0...22e29fc41901ef8116670bc8a04eeb833858ff51)) ### Maintenance and upkeep improvements - Update to JupyterLab v4.5.0a0 [#7650](https://github.com/jupyter/notebook/pull/7650) ([@jtpio](https://github.com/jtpio)) - Run UI tests on `ubuntu-latest` [#7639](https://github.com/jupyter/notebook/pull/7639) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.4.1 [#7638](https://github.com/jupyter/notebook/pull/7638) ([@jtpio](https://github.com/jtpio)) - Bump prefix-dev/setup-pixi from 0.8.5 to 0.8.8 in the actions group [#7637](https://github.com/jupyter/notebook/pull/7637) ([@dependabot](https://github.com/dependabot)) - chore: Fix UP006 [#7633](https://github.com/jupyter/notebook/pull/7633) ([@honnix](https://github.com/honnix)) - Bump prefix-dev/setup-pixi from 0.8.4 to 0.8.5 in the actions group [#7632](https://github.com/jupyter/notebook/pull/7632) ([@dependabot](https://github.com/dependabot)) - Drop support for Python 3.8 [#7628](https://github.com/jupyter/notebook/pull/7628) ([@honnix](https://github.com/honnix)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-04-09&to=2025-05-07&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2025-04-09..2025-05-07&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-04-09..2025-05-07&type=Issues) | [@honnix](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ahonnix+updated%3A2025-04-09..2025-05-07&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-04-09..2025-05-07&type=Issues) ## 7.4 Jupyter Notebook 7.4 is based on JupyterLab 4.4, and includes a number of new features, bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0. Extension authors are recommended to consult the [Extension Migration Guide](https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-3-to-4-4) which lists deprecations and changes to the public API. Below are a few highlights for this new release. Most of the new features and improvements come from the update to JupyterLab 4.4, although they may not all be supported in Notebook 7.4. For reference you may have a look at the [JupyterLab 4.4 changelog](https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-4) to learn more. ### Code console improvements The code console prompt can now be positioned on the top, left, or right side of the console, in addition to the default bottom placement. The placement is persisted in the Prompt Cell Position setting. The console toolbar now includes buttons to: - Execute code - Restart the kernel - Clear the cells - Switch the kernel The option to change console prompt position is available under the three dots button in the console toolbar, which is the last toolbar button Additional settings for console behavior have been added: - Clear Code Content on Execute (enabled by default) – When disabled, the code submitted for execution remains in the code editor, allowing for further edits. - Hide Code Input – When enabled, only the execution output is shown in the console. - Clear Cells on Execute – When enabled, only the last cell is displayed. Toggling all the three new settings transforms the console into an interactive editor resembling an ephemeral notebook with a single cell. Toggling all the three new settings transforms the console into a single cell ### Settings import and export Settings can now be exported to `overrides.json` from the Settings Editor, which can be used to pre-configure defaults in deployments or to restore settings. The Import and Export buttons in the Settings Editor are the first two items in the toolbar panel ### Support for collaboration without `RTC:` drive Real time collaboration in previous versions of JupyterLab and Jupyter Notebook (which can be enabled by installing jupyter-collaboration package) was implemented by swapping the default JupyterLab file system drive to a collaborative drive with the `RTC:` prefix. This approach was incompatible with multiple extensions. JupyterLab 4.4 introduces the Content Providers API, which allows the next version of `jupyter-collaboration` to work without changing the drive prefix. This improves compatibility with extensions that do not support arbitrary drives. ### Context menu opt-out The context menu, available under right mouse click in browsers, can now be disabled globally by toggling the `Enable Context Menu` option available in the Command Palette, or via the JSON Settings Editor in the Application Context Menu. ## 7.4.0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.3.2...fbfe36574e04b16ed7ba9303c5e819330f402f87)) ### Highlights ✨ To learn more about the highlights of the 7.4.0 release: https://jupyter-notebook.readthedocs.io/en/latest/changelog.html ### Enhancements made - Update to JupyterLab v4.4.0rc1 [#7622](https://github.com/jupyter/notebook/pull/7622) ([@jtpio](https://github.com/jtpio)) - Add support for a `down` area [#7619](https://github.com/jupyter/notebook/pull/7619) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.4.0rc0 [#7618](https://github.com/jupyter/notebook/pull/7618) ([@jtpio](https://github.com/jtpio)) - Support `ServiceManagerPlugin` [#7616](https://github.com/jupyter/notebook/pull/7616) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab `v4.4.0b1` [#7607](https://github.com/jupyter/notebook/pull/7607) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.4.0b0 [#7591](https://github.com/jupyter/notebook/pull/7591) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.4.0a3 [#7577](https://github.com/jupyter/notebook/pull/7577) ([@jtpio](https://github.com/jtpio)) - Add active cell border padding, remove double cell padding [#7570](https://github.com/jupyter/notebook/pull/7570) ([@andrii-i](https://github.com/andrii-i)) ### Bugs fixed - Fix undefined error when checkpoints is empty [#7567](https://github.com/jupyter/notebook/pull/7567) ([@jdavid](https://github.com/jdavid)) ### Maintenance and upkeep improvements - Bump the actions group with 2 updates [#7626](https://github.com/jupyter/notebook/pull/7626) ([@dependabot](https://github.com/dependabot)) - Update to JupyterLab v4.4.0b2 [#7614](https://github.com/jupyter/notebook/pull/7614) ([@jtpio](https://github.com/jtpio)) - Add pixi step to the update workflow [#7608](https://github.com/jupyter/notebook/pull/7608) ([@jtpio](https://github.com/jtpio)) - Update `@babel` dependencies [#7605](https://github.com/jupyter/notebook/pull/7605) ([@jtpio](https://github.com/jtpio)) - Add devcontainer support, backed by pixi [#7602](https://github.com/jupyter/notebook/pull/7602) ([@jtpio](https://github.com/jtpio)) - Manual dependabot bumps [#7599](https://github.com/jupyter/notebook/pull/7599) ([@jtpio](https://github.com/jtpio)) - Bump vega-selections from 5.4.1 to 5.5.0 in /ui-tests [#7592](https://github.com/jupyter/notebook/pull/7592) ([@dependabot](https://github.com/dependabot)) - Improve handling of optional notebook tracker [#7581](https://github.com/jupyter/notebook/pull/7581) ([@jtpio](https://github.com/jtpio)) - Fix upgrade script [#7579](https://github.com/jupyter/notebook/pull/7579) ([@jtpio](https://github.com/jtpio)) - Allow owners/members/collab to trigger galata update on other's PR [#7572](https://github.com/jupyter/notebook/pull/7572) ([@krassowski](https://github.com/krassowski)) - Update `typescript` and `lerna` [#7562](https://github.com/jupyter/notebook/pull/7562) ([@jtpio](https://github.com/jtpio)) - Update pre-commit hooks [#7561](https://github.com/jupyter/notebook/pull/7561) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.4.0a2 [#7559](https://github.com/jupyter/notebook/pull/7559) ([@jtpio](https://github.com/jtpio)) - Bump the actions group across 1 directory with 2 updates [#7558](https://github.com/jupyter/notebook/pull/7558) ([@dependabot](https://github.com/dependabot)) - Improve update script [#7556](https://github.com/jupyter/notebook/pull/7556) ([@jtpio](https://github.com/jtpio)) - Disable cron scheduling for now [#7555](https://github.com/jupyter/notebook/pull/7555) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.4.0a1 [#7554](https://github.com/jupyter/notebook/pull/7554) ([@jtpio](https://github.com/jtpio)) - Update workflow improvements [#7552](https://github.com/jupyter/notebook/pull/7552) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - User facing changelog for 7.4 [#7612](https://github.com/jupyter/notebook/pull/7612) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-12-21&to=2025-04-09&type=c)) [@andrii-i](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandrii-i+updated%3A2024-12-21..2025-04-09&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2024-12-21..2025-04-09&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-12-21..2025-04-09&type=Issues) | [@jdavid](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajdavid+updated%3A2024-12-21..2025-04-09&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-12-21..2025-04-09&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-12-21..2025-04-09&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2024-12-21..2025-04-09&type=Issues) ## 7.4.0rc0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0-beta.3...7fa19999c9e01d713a684e0f25d8017dbc999528)) ### Enhancements made - Update to JupyterLab v4.4.0rc1 [#7622](https://github.com/jupyter/notebook/pull/7622) ([@jtpio](https://github.com/jtpio)) - Add support for a `down` area [#7619](https://github.com/jupyter/notebook/pull/7619) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-03-26&to=2025-04-03&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-03-26..2025-04-03&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-03-26..2025-04-03&type=Issues) ## 7.4.0b3 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0-beta.2...434221c0fe3de3df3b4b54ed1005712e07957352)) ### Enhancements made - Update to JupyterLab v4.4.0rc0 [#7618](https://github.com/jupyter/notebook/pull/7618) ([@jtpio](https://github.com/jtpio)) - Support `ServiceManagerPlugin` [#7616](https://github.com/jupyter/notebook/pull/7616) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-03-20&to=2025-03-26&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-03-20..2025-03-26&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-03-20..2025-03-26&type=Issues) ## 7.4.0b2 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0-beta.1...be2fd12f91a64796d9919ee8b8242f3093aac8a5)) ### Maintenance and upkeep improvements - Update to JupyterLab v4.4.0b2 [#7614](https://github.com/jupyter/notebook/pull/7614) ([@jtpio](https://github.com/jtpio)) - Add pixi step to the update workflow [#7608](https://github.com/jupyter/notebook/pull/7608) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - User facing changelog for 7.4 [#7612](https://github.com/jupyter/notebook/pull/7612) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-03-14&to=2025-03-20&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-03-14..2025-03-20&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-03-14..2025-03-20&type=Issues) ## 7.4.0b1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0-beta.0...6d06d97302bd1bb77e25864214ade2277f2e50d4)) ### Enhancements made - Update to JupyterLab `v4.4.0b1` [#7607](https://github.com/jupyter/notebook/pull/7607) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update `@babel` dependencies [#7605](https://github.com/jupyter/notebook/pull/7605) ([@jtpio](https://github.com/jtpio)) - Add devcontainer support, backed by pixi [#7602](https://github.com/jupyter/notebook/pull/7602) ([@jtpio](https://github.com/jtpio)) - Manual dependabot bumps [#7599](https://github.com/jupyter/notebook/pull/7599) ([@jtpio](https://github.com/jtpio)) - Bump vega-selections from 5.4.1 to 5.5.0 in /ui-tests [#7592](https://github.com/jupyter/notebook/pull/7592) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-02-20&to=2025-03-14&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2025-02-20..2025-03-14&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-02-20..2025-03-14&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-02-20..2025-03-14&type=Issues) ## 7.4.0b0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0-alpha.3...48243197bbd004555008cd7cfa14c907147aceca)) ### Enhancements made - Update to JupyterLab v4.4.0b0 [#7591](https://github.com/jupyter/notebook/pull/7591) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-02-05&to=2025-02-20&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-02-05..2025-02-20&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-02-05..2025-02-20&type=Issues) ## 7.4.0a3 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0-alpha.2...48e52c759ffec0cea47dfef59f48d8e9fa6112d3)) ### Enhancements made - Add active cell border padding, remove double cell padding [#7570](https://github.com/jupyter/notebook/pull/7570) ([@andrii-i](https://github.com/andrii-i)) ### Maintenance and upkeep improvements - Improve handling of optional notebook tracker [#7581](https://github.com/jupyter/notebook/pull/7581) ([@jtpio](https://github.com/jtpio)) - Fix upgrade script [#7579](https://github.com/jupyter/notebook/pull/7579) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-02-03&to=2025-02-05&type=c)) [@andrii-i](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandrii-i+updated%3A2025-02-03..2025-02-05&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-02-03..2025-02-05&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-02-03..2025-02-05&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2025-02-03..2025-02-05&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2025-02-03..2025-02-05&type=Issues) ## 7.4.0a2 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0-alpha.1...ef4f6346cd6b377ade271fcd61810b5d2a7d0f41)) ### Enhancements made - Update to JupyterLab v4.4.0a3 [#7577](https://github.com/jupyter/notebook/pull/7577) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fix undefined error when checkpoints is empty [#7567](https://github.com/jupyter/notebook/pull/7567) ([@jdavid](https://github.com/jdavid)) ### Maintenance and upkeep improvements - Allow owners/members/collab to trigger galata update on other's PR [#7572](https://github.com/jupyter/notebook/pull/7572) ([@krassowski](https://github.com/krassowski)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2025-01-07&to=2025-02-03&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2025-01-07..2025-02-03&type=Issues) | [@jdavid](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajdavid+updated%3A2025-01-07..2025-02-03&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2025-01-07..2025-02-03&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2025-01-07..2025-02-03&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2025-01-07..2025-02-03&type=Issues) ## 7.4.0a1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.4.0-alpha.0...18672b7e85ec5181e4c5c18d2e32c3e9eab7260c)) ### Maintenance and upkeep improvements - Update `typescript` and `lerna` [#7562](https://github.com/jupyter/notebook/pull/7562) ([@jtpio](https://github.com/jtpio)) - Update pre-commit hooks [#7561](https://github.com/jupyter/notebook/pull/7561) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.4.0a2 [#7559](https://github.com/jupyter/notebook/pull/7559) ([@jtpio](https://github.com/jtpio)) - Bump the actions group across 1 directory with 2 updates [#7558](https://github.com/jupyter/notebook/pull/7558) ([@dependabot](https://github.com/dependabot)) - Improve update script [#7556](https://github.com/jupyter/notebook/pull/7556) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-12-21&to=2025-01-07&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2024-12-21..2025-01-07&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-12-21..2025-01-07&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-12-21..2025-01-07&type=Issues) ## 7.4.0a0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.3.2...12efbe601858c317bf677dc835d314489357e20d)) ### Maintenance and upkeep improvements - Disable cron scheduling for now [#7555](https://github.com/jupyter/notebook/pull/7555) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab v4.4.0a1 [#7554](https://github.com/jupyter/notebook/pull/7554) ([@jtpio](https://github.com/jtpio)) - Update workflow improvements [#7552](https://github.com/jupyter/notebook/pull/7552) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-12-21&to=2024-12-21&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-12-21..2024-12-21&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-12-21..2024-12-21&type=Issues) ## 7.3 Jupyter Notebook 7.3 is based on JupyterLab 4.3, and includes a number of new features, bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0. Extension authors are recommended to consult the [Extension Migration Guide](https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-2-to-4-3) which lists deprecations and changes to the public API. Below are a few highlights for this new release. Most of the new features and improvements come from the update to JupyterLab 4.3, although they may not all be supported in Notebook 7.3. For reference you may have a look at the [JupyterLab 4.3 changelog](https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-3) to learn more. ### Minimap The virtual scrollbar now acts as a minimap and exposes information on whether a cell: - is running/scheduled (`[*]`), idle (`[ ]`) or was already run (e.g. `[1]`) - was modified since it was last executed (“dirty”) - orange background - has an output that contains an error - red background - is markdown/code (`[ ]`/`[*]`/`[1]` for code, nothing for markdown) - how much text/code it contains ![a screenshot showing the notebook minimap](https://raw.githubusercontent.com/jupyterlab/jupyterlab/main/docs/source/getting_started/changelog_assets/4.3-minimap.png) To enable the minimap, click on the hamburger icon (≡) which appears in the notebook’s toolbar. If you do not see the hamburger icon, go to `Settings → Notebook → Windowing mode` and choose “full”. ### File browser enhancements The file browser now: - supports resizing the columns and remembers the column sizes after reloading JupyterLab - supports uploading folders by drag-and-drop - supports navigation with a single click - adds a file filter collapsed by default (funnel icon) ![a screenshot showing that it's now possible to resize the file browser columns](https://github.com/user-attachments/assets/b0d9cd0a-2828-43f7-a922-e8b271e5f7fc) In Jupyter Notebook, the single click navigation is enabled by default. If you would like to disable it to get the same experience as in JupyterLab, go to `Settings → File Browser` and make sure "Navigate files and directories with single click" is unchecked. ### Improved kernel and server interactions The previous release enabled connecting to external kernels, such as those spawned by a third-party application like Blender. In this release the kernel selector dialog was improved to also show the external kernels. The previous release improved the awareness of the kernel/kernel specification distinction by providing both tree and list view in the kernels sidebar panel, but only the tree view featured the kernel identifiers. In this release both the list and tree view show the kernel identifier stub. A new toolbar button was added in the kernel allowing to shut down unused kernels (kernels with no widget attached). ![a screenshot showing the list view of the kernels in the sidebar](https://github.com/user-attachments/assets/c7f958c5-4054-4b09-8fad-4df6db8c9b58) ### Full Width Notebook It is now possible to configure the notebook to take up the full width of the page via: - a setting that can be defined by a user via the Settings Editor - the `View > Enable Full Width Notebook` menu entry - the command palette, searching for `Enable Full Width Notebook` ![a screenshot showing how to enable full width notebook via the menu](https://github.com/user-attachments/assets/148b227a-874a-4bb3-a4c6-c7350525ccc4) This is particularly useful on large displays, or for those who prefer working with a wider notebook. It is also possible to use the JupyterLab interface for a more fully-featured experience, which allows for full-width notebooks too, and offers a "Simple Interface" mode for only showing a single notebook at a time. You can open JupyterLab by clicking on `View > Open JupyterLab`. ## 7.3.2 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.3.1...7959ba0de553e9c541d2716d76108a8bc0bc2d6c)) ### Maintenance and upkeep improvements - Fix update script [#7550](https://github.com/jupyter/notebook/pull/7550) ([@jtpio](https://github.com/jtpio)) - Fix workflow to update the JupyterLab version [#7548](https://github.com/jupyter/notebook/pull/7548) ([@jtpio](https://github.com/jtpio)) - Bump nanoid from 3.3.7 to 3.3.8 in /ui-tests [#7547](https://github.com/jupyter/notebook/pull/7547) ([@dependabot](https://github.com/dependabot)) - Bump systeminformation from 5.21.8 to 5.23.14 in /ui-tests [#7546](https://github.com/jupyter/notebook/pull/7546) ([@dependabot](https://github.com/dependabot)) - Workflow to update JupyterLab dependencies automatically [#7281](https://github.com/jupyter/notebook/pull/7281) ([@itsmevichu](https://github.com/itsmevichu)) - Update to JupyterLab v4.3.4 [#7551](https://github.com/jupyter/notebook/pull/7551) ([@github-actions](https://github.com/apps/github-actions)) ### Documentation improvements - Update chat links to Zulip. [#7539](https://github.com/jupyter/notebook/pull/7539) ([@ericsnekbytes](https://github.com/ericsnekbytes)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-12-04&to=2024-12-21&type=c)) [@Carreau](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ACarreau+updated%3A2024-12-04..2024-12-21&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2024-12-04..2024-12-21&type=Issues) | [@ericsnekbytes](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aericsnekbytes+updated%3A2024-12-04..2024-12-21&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-12-04..2024-12-21&type=Issues) | [@itsmevichu](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aitsmevichu+updated%3A2024-12-04..2024-12-21&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-12-04..2024-12-21&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-12-04..2024-12-21&type=Issues) ## 7.3.1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.3.0...21d0306ecef93ea23bf063bc1d8a0580450cd4df)) ### Maintenance and upkeep improvements - Adds jupyter-ui-toolkit packages in shared scope [#7530](https://github.com/jupyter/notebook/pull/7530) ([@brichet](https://github.com/brichet)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-12-04&to=2024-12-04&type=c)) [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2024-12-04..2024-12-04&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-12-04..2024-12-04&type=Issues) ## 7.3.0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.2.0...b16eed26eff8e357eeccbef3f3434df77fb8ab48)) ### Enhancements made - Fix for auto scroll output option [#7511](https://github.com/jupyter/notebook/pull/7511) ([@gjmooney](https://github.com/gjmooney)) - Add a setting to enable the notebook to take up the full width [#7487](https://github.com/jupyter/notebook/pull/7487) ([@jtpio](https://github.com/jtpio)) - Add the file filter button to the file browser toolbar [#7479](https://github.com/jupyter/notebook/pull/7479) ([@jtpio](https://github.com/jtpio)) - Redirect paths from the notebooks route to the tree route if they are directories [#7446](https://github.com/jupyter/notebook/pull/7446) ([@andyscho](https://github.com/andyscho)) - Update to JupyterLab `4.3.0a1` [#7416](https://github.com/jupyter/notebook/pull/7416) ([@jtpio](https://github.com/jtpio)) - Support custom page_data_hook function [#7387](https://github.com/jupyter/notebook/pull/7387) ([@bluestealth](https://github.com/bluestealth)) - Add missing "Open..." file menu [#7385](https://github.com/jupyter/notebook/pull/7385) ([@martinRenou](https://github.com/martinRenou)) - Duplicate notebook menu option [#7374](https://github.com/jupyter/notebook/pull/7374) ([@JasonWeill](https://github.com/JasonWeill)) ### Bugs fixed - Move handling of the file browser settings to a separate plugin, enable file browser single click navigation [#7481](https://github.com/jupyter/notebook/pull/7481) ([@jtpio](https://github.com/jtpio)) - Remove pseudoelement obstructing the cell collapser [#7392](https://github.com/jupyter/notebook/pull/7392) ([@krassowski](https://github.com/krassowski)) - "Close and Shut Down Notebook" shuts down without the confirmation dialog [#7384](https://github.com/jupyter/notebook/pull/7384) ([@JasonWeill](https://github.com/JasonWeill)) - Adds message about building code before running 'develop' [#7382](https://github.com/jupyter/notebook/pull/7382) ([@JasonWeill](https://github.com/JasonWeill)) ### Maintenance and upkeep improvements - Bump Python version used on CI [#7528](https://github.com/jupyter/notebook/pull/7528) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.3.2 [#7527](https://github.com/jupyter/notebook/pull/7527) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.3.1 [#7521](https://github.com/jupyter/notebook/pull/7521) ([@jtpio](https://github.com/jtpio)) - Add webpack prod config [#7513](https://github.com/jupyter/notebook/pull/7513) ([@gjmooney](https://github.com/gjmooney)) - Update to JupyterLab 4.3 final [#7507](https://github.com/jupyter/notebook/pull/7507) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab `4.3.0rc1` [#7497](https://github.com/jupyter/notebook/pull/7497) ([@jtpio](https://github.com/jtpio)) - Remove the `StateDB` file browser trick [#7477](https://github.com/jupyter/notebook/pull/7477) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab `4.3.0rc0` [#7423](https://github.com/jupyter/notebook/pull/7423) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.3.0a0 [#7378](https://github.com/jupyter/notebook/pull/7378) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Fix link to the JupyterLab 4.3 changelog [#7529](https://github.com/jupyter/notebook/pull/7529) ([@jtpio](https://github.com/jtpio)) - Rename some header links to fit better [#7508](https://github.com/jupyter/notebook/pull/7508) ([@gjmooney](https://github.com/gjmooney)) - Add user facing changelog for `7.3.0` [#7494](https://github.com/jupyter/notebook/pull/7494) ([@jtpio](https://github.com/jtpio)) - Fix typos [#7472](https://github.com/jupyter/notebook/pull/7472) ([@algonell](https://github.com/algonell)) - Adds message about building code before running 'develop' [#7382](https://github.com/jupyter/notebook/pull/7382) ([@JasonWeill](https://github.com/JasonWeill)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-05-16&to=2024-12-04&type=c)) [@algonell](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aalgonell+updated%3A2024-05-16..2024-12-04&type=Issues) | [@andyscho](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandyscho+updated%3A2024-05-16..2024-12-04&type=Issues) | [@bluestealth](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abluestealth+updated%3A2024-05-16..2024-12-04&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-05-16..2024-12-04&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agjmooney+updated%3A2024-05-16..2024-12-04&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJasonWeill+updated%3A2024-05-16..2024-12-04&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-05-16..2024-12-04&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-05-16..2024-12-04&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AmartinRenou+updated%3A2024-05-16..2024-12-04&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2024-05-16..2024-12-04&type=Issues) ## 7.3.0rc0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.3.0-beta.2...b34449747a84fe0ba7951ae0fa8f2bb011444a60)) ### Maintenance and upkeep improvements - Update to JupyterLab 4.3.1 [#7521](https://github.com/jupyter/notebook/pull/7521) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-11-06&to=2024-11-18&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-11-06..2024-11-18&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-11-06..2024-11-18&type=Issues) ## 7.3.0b2 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.3.0-beta.1...110e728e4a239ffc7217bd07b9a50cf4eff0dff5)) ### Enhancements made - Fix for auto scroll output option [#7511](https://github.com/jupyter/notebook/pull/7511) ([@gjmooney](https://github.com/gjmooney)) ### Maintenance and upkeep improvements - Add webpack prod config [#7513](https://github.com/jupyter/notebook/pull/7513) ([@gjmooney](https://github.com/gjmooney)) - Update to JupyterLab 4.3 final [#7507](https://github.com/jupyter/notebook/pull/7507) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Rename some header links to fit better [#7508](https://github.com/jupyter/notebook/pull/7508) ([@gjmooney](https://github.com/gjmooney)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-10-24&to=2024-11-06&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-10-24..2024-11-06&type=Issues) | [@gjmooney](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agjmooney+updated%3A2024-10-24..2024-11-06&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-10-24..2024-11-06&type=Issues) ## 7.3.0b1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.3.0-beta.0...f614f7c6387cc7da82e0307b70e10593b2cd6bff)) ### Enhancements made - Add a setting to enable the notebook to take up the full width [#7487](https://github.com/jupyter/notebook/pull/7487) ([@jtpio](https://github.com/jtpio)) - Add the file filter button to the file browser toolbar [#7479](https://github.com/jupyter/notebook/pull/7479) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Move handling of the file browser settings to a separate plugin, enable file browser single click navigation [#7481](https://github.com/jupyter/notebook/pull/7481) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update to JupyterLab `4.3.0rc1` [#7497](https://github.com/jupyter/notebook/pull/7497) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Add user facing changelog for `7.3.0` [#7494](https://github.com/jupyter/notebook/pull/7494) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-10-15&to=2024-10-24&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-10-15..2024-10-24&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-10-15..2024-10-24&type=Issues) ## 7.3.0b0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.3.0-alpha.1...fec4431305b2fd857ff81b7b60c2894dd125bec2)) ### Enhancements made - Redirect paths from the notebooks route to the tree route if they are directories [#7446](https://github.com/jupyter/notebook/pull/7446) ([@andyscho](https://github.com/andyscho)) ### Maintenance and upkeep improvements - Remove the `StateDB` file browser trick [#7477](https://github.com/jupyter/notebook/pull/7477) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab `4.3.0rc0` [#7423](https://github.com/jupyter/notebook/pull/7423) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Fix typos [#7472](https://github.com/jupyter/notebook/pull/7472) ([@algonell](https://github.com/algonell)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-07-01&to=2024-10-15&type=c)) [@algonell](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aalgonell+updated%3A2024-07-01..2024-10-15&type=Issues) | [@andyscho](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandyscho+updated%3A2024-07-01..2024-10-15&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-07-01..2024-10-15&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-07-01..2024-10-15&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-07-01..2024-10-15&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2024-07-01..2024-10-15&type=Issues) ## 7.3.0a1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.3.0-alpha.0...ff2b822d066dc8d733a259f955177da4bd4d668c)) ### Enhancements made - Update to JupyterLab `4.3.0a1` [#7416](https://github.com/jupyter/notebook/pull/7416) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Remove pseudoelement obstructing the cell collapser [#7392](https://github.com/jupyter/notebook/pull/7392) ([@krassowski](https://github.com/krassowski)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-05-31&to=2024-07-01&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-05-31..2024-07-01&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-05-31..2024-07-01&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-05-31..2024-07-01&type=Issues) ## 7.3.0a0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.2.0...1a03b9d8e502f8177684e39d7b627bed1c772bb2)) ### Enhancements made - Support custom page_data_hook function [#7387](https://github.com/jupyter/notebook/pull/7387) ([@bluestealth](https://github.com/bluestealth)) - Add missing "Open..." file menu [#7385](https://github.com/jupyter/notebook/pull/7385) ([@martinRenou](https://github.com/martinRenou)) - Duplicate notebook menu option [#7374](https://github.com/jupyter/notebook/pull/7374) ([@JasonWeill](https://github.com/JasonWeill)) ### Bugs fixed - "Close and Shut Down Notebook" shuts down without the confirmation dialog [#7384](https://github.com/jupyter/notebook/pull/7384) ([@JasonWeill](https://github.com/JasonWeill)) - Adds message about building code before running 'develop' [#7382](https://github.com/jupyter/notebook/pull/7382) ([@JasonWeill](https://github.com/JasonWeill)) ### Maintenance and upkeep improvements - Update to JupyterLab 4.3.0a0 [#7378](https://github.com/jupyter/notebook/pull/7378) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Adds message about building code before running 'develop' [#7382](https://github.com/jupyter/notebook/pull/7382) ([@JasonWeill](https://github.com/JasonWeill)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-05-16&to=2024-05-31&type=c)) [@bluestealth](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abluestealth+updated%3A2024-05-16..2024-05-31&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-05-16..2024-05-31&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJasonWeill+updated%3A2024-05-16..2024-05-31&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-05-16..2024-05-31&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AmartinRenou+updated%3A2024-05-16..2024-05-31&type=Issues) ## 7.2 Jupyter Notebook 7.2 is based on JupyterLab 4.2, and includes a number of new features, bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0. Extension authors are recommended to consult the [Extension Migration Guide](https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-0-to-4-1) which lists deprecations and changes to the public API. Below are a few highlights for this new release. Most of the new features and improvements come from the update to JupyterLab 4.2, although they are not all supported in Notebook 7.2. For reference you may have a look at the JupyterLab 4.2 changelog to learn more: https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-2 ### Full notebook windowing mode by default Notebooks in the `full` windowing mode only render the visible cells, significantly improving the performance of the application. One limitation of `full` mode is that the search function in your browser may produce false negatives; using the search function is recommended. To revert to the behaviour from Notebook 7.2, go to Settings → Settings Editor → Notebook, scroll to “Windowing mode”, and choose `defer`. ### Improved Shortcuts Editor Among the numerous improvements and bug fixes for the keyboard shortcuts editor: - it is now possible to remove the default shortcuts, - shortcuts are correctly sorted when using a language pack, - shortcuts with different arguments are now correctly displayed as individual entries. A context menu opened over a keybinding in the Keyboard Shortcuts setting panel within the Settings widget ### Dark high contrast theme A new theme, JupyterLab Dark High Contrast, which is intended to benefit users with the need for higher contrast, following the WCAG AAA accessibility standard for color contrast. To select this theme, from the menu bar, choose Settings → Theme → JupyterLab Dark High Contrast. Please provide feedback and suggestions on further improvements to this theme. A dark high contrast theme ## 7.2.0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.1.2...31bf294e85175bbf39816a90dc8858dedaf73bde)) ### Enhancements made - Update to JupyterLab 4.2.0 [#7357](https://github.com/jupyter/notebook/pull/7357) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.2.0rc0 [#7333](https://github.com/jupyter/notebook/pull/7333) ([@jtpio](https://github.com/jtpio)) - Add `@jupyterlab/theme-dark-high-contrast-extension` [#7331](https://github.com/jupyter/notebook/pull/7331) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.2.0a2 [#7307](https://github.com/jupyter/notebook/pull/7307) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Add the `@jupyterlab/notebook-extension:copy-output` plugin [#7353](https://github.com/jupyter/notebook/pull/7353) ([@jtpio](https://github.com/jtpio)) - Fix CSS for `full` windowing mode [#7337](https://github.com/jupyter/notebook/pull/7337) ([@jtpio](https://github.com/jtpio)) - Force notebook windowing mode to `defer` [#7335](https://github.com/jupyter/notebook/pull/7335) ([@jtpio](https://github.com/jtpio)) - Fix scrollbar always showing up by default [#7327](https://github.com/jupyter/notebook/pull/7327) ([@jtpio](https://github.com/jtpio)) - Default to the `full` windowing mode [#7321](https://github.com/jupyter/notebook/pull/7321) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Fix emoji in create issue screen [#7363](https://github.com/jupyter/notebook/pull/7363) ([@JasonWeill](https://github.com/JasonWeill)) - Update `@jupyterlab/galata` [#7361](https://github.com/jupyter/notebook/pull/7361) ([@jtpio](https://github.com/jtpio)) - Pin on `macos-12` on CI for now [#7346](https://github.com/jupyter/notebook/pull/7346) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab `4.2.0b1` [#7319](https://github.com/jupyter/notebook/pull/7319) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.2.0b0 [#7312](https://github.com/jupyter/notebook/pull/7312) ([@jtpio](https://github.com/jtpio)) - Ignore links to GitHub user and organisation profiles [#7308](https://github.com/jupyter/notebook/pull/7308) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Add user facing changelog for 7.2 [#7372](https://github.com/jupyter/notebook/pull/7372) ([@jtpio](https://github.com/jtpio)) - Fix emoji in create issue screen [#7363](https://github.com/jupyter/notebook/pull/7363) ([@JasonWeill](https://github.com/JasonWeill)) - update RISE extension installation instructions [#7299](https://github.com/jupyter/notebook/pull/7299) ([@afeld](https://github.com/afeld)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-03-14&to=2024-05-16&type=c)) [@afeld](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aafeld+updated%3A2024-03-14..2024-05-16&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-03-14..2024-05-16&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJasonWeill+updated%3A2024-03-14..2024-05-16&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-03-14..2024-05-16&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-03-14..2024-05-16&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2024-03-14..2024-05-16&type=Issues) | [@takluyver](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atakluyver+updated%3A2024-03-14..2024-05-16&type=Issues) ## 7.2.0rc1 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.2.0rc0...f5d8aea3bdc3eea25213792f9d101738f2a1f627)) ### Enhancements made - Update to JupyterLab 4.2.0 [#7357](https://github.com/jupyter/notebook/pull/7357) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Add the `@jupyterlab/notebook-extension:copy-output` plugin [#7353](https://github.com/jupyter/notebook/pull/7353) ([@jtpio](https://github.com/jtpio)) - Default to the `full` windowing mode [#7321](https://github.com/jupyter/notebook/pull/7321) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - update RISE extension installation instructions [#7299](https://github.com/jupyter/notebook/pull/7299) ([@afeld](https://github.com/afeld)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-05-01&to=2024-05-13&type=c)) [@afeld](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aafeld+updated%3A2024-05-01..2024-05-13&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-05-01..2024-05-13&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-05-01..2024-05-13&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-05-01..2024-05-13&type=Issues) | [@takluyver](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atakluyver+updated%3A2024-05-01..2024-05-13&type=Issues) ## 7.2.0rc0 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.2.0b1...49ddd0fe1e4d4bfa24f74042f2232c5b91d1c36e)) ### Enhancements made - Update to JupyterLab 4.2.0rc0 [#7333](https://github.com/jupyter/notebook/pull/7333) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fix CSS for `full` windowing mode [#7337](https://github.com/jupyter/notebook/pull/7337) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Pin on `macos-12` on CI for now [#7346](https://github.com/jupyter/notebook/pull/7346) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-04-19&to=2024-05-01&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-04-19..2024-05-01&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-04-19..2024-05-01&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-04-19..2024-05-01&type=Issues) ## 7.2.0b1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.2.0-beta.0...b45d666d5ee1ee053b55ac9cb6e9aecde5d53945)) ### Enhancements made - Add `@jupyterlab/theme-dark-high-contrast-extension` [#7331](https://github.com/jupyter/notebook/pull/7331) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Force notebook windowing mode to `defer` [#7335](https://github.com/jupyter/notebook/pull/7335) ([@jtpio](https://github.com/jtpio)) - Fix scrollbar always showing up by default [#7327](https://github.com/jupyter/notebook/pull/7327) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-04-12&to=2024-04-19&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-04-12..2024-04-19&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-04-12..2024-04-19&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2024-04-12..2024-04-19&type=Issues) ## 7.2.0b0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.2.0-alpha.0...09bcd99e6dfffce92acc9a7f9d11a2a2122131c0)) ### Maintenance and upkeep improvements - Update to JupyterLab `4.2.0b1` [#7319](https://github.com/jupyter/notebook/pull/7319) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.2.0b0 [#7312](https://github.com/jupyter/notebook/pull/7312) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-03-29&to=2024-04-12&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-03-29..2024-04-12&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-03-29..2024-04-12&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2024-03-29..2024-04-12&type=Issues) ## 7.2.0a0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.1.2...80b582bce69e33e36e936af2ea981bcb22a4d285)) ### Enhancements made - Update to JupyterLab 4.2.0a2 [#7307](https://github.com/jupyter/notebook/pull/7307) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Ignore links to GitHub user and organisation profiles [#7308](https://github.com/jupyter/notebook/pull/7308) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-03-14&to=2024-03-29&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-03-14..2024-03-29&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-03-14..2024-03-29&type=Issues) ## v7.1 Jupyter Notebook 7.1 is based on JupyterLab 4.1, and includes a number of new features, bug fixes, and enhancements for extension developers. This release is compatible with extensions supporting JupyterLab 4.0. Extension authors are recommended to consult the [Extension Migration Guide](https://jupyterlab.readthedocs.io/en/latest/extension/extension_migration.html#jupyterlab-4-0-to-4-1) which lists deprecations and changes to the public API. Below are a few highlights for this new release. Most of the new features and improvements come from the update to JupyterLab 4.1, although they are not all supported in Notebook 7.1. For reference you may have a look at the JupyterLab 4.1 changelog to learn more: https://jupyterlab.readthedocs.io/en/latest/getting_started/changelog.html#v4-1 ### Diagrams in Markdown Matching GitHub-Flavoured Markdown, JupyterLab 4.1 now supports [Mermaid](https://github.com/mermaid-js/mermaid) diagrams. To create a mermaid diagram use the `mermaid` language specifier for a code block in a markdown cell or document, for example: ~~~ ```mermaid flowchart LR A[Hard] -->|Text| B(Round) B --> C{Decision} C -->|One| D[Result 1] C -->|Two| E[Result 2] ``` ~~~ which renders as: Rendered Mermaid diagram going from left to right with modern look; the diagram contains blueish square node with text Hard pointing to round square node with text Round; over the arrow connecting the two nodes there is a word Text; the second node further connects to a rhombus-shaped node with text Decision which then connects to two further nodes, Result 1 and Result 2. ### Inline completer JupyterLab now supports completion presented as ghost text in the cell and file editors, allowing generative AI models to provide multi-line completions. This can now also be leveraged in Jupyter Notebook. The suggestions are provided by plugins implementing the ``IInlineCompletionProvider`` API; by default a single provider which uses kernel history is available. In a code cell with `def fac` content a ghost text containing a suggestion representing further code of factorial function is shown; over the code cell there is a floating widget allowing to accept the suggestion and iterate between alternative suggestions The suggestions can be invoked as-you-type or manually using a configurable shortcut (by default Alt + \\). The default keyboard shortcuts are displayed in the small widget shown when hovering over the ghost suggestion: - Alt + End - accept suggestion - Alt + [ - previous suggestion - Alt + ] - next suggestion To enable the inline suggestions based on the kernel history, go to Settings → Inline Completer → History provider → check the "enabled" checkbox. In addition to the built-in history suggestions, the [`jupyter-ai`](https://github.com/jupyterlab/jupyter-ai) extension will provide suggestions from supported models. Note that the Jupyter AI extension is not yet compatible with Jupyter Notebook 7. ### Keyboard navigation improvements Numerous improvements to keyboard navigation with focus on accessibility and usability are included in this release: - the notebook cells now retain focus - the focus can now be moved beyond the active notebook - the toolbars can now be navigated using arrow keys For more details, see [this post on Jupyter Blog](https://blog.jupyter.org/recent-keyboard-navigation-improvements-in-jupyter-4df32f97628d). ### Execution history in notebook The code from previously executed cells can be used to populate empty cells, allowing to iterate on code from previous cells or even sessions (depending on how a specific kernel stores history). To cycle between history items press Alt + Arrow Up and Alt + Arrow Down. To enable execution history, go to Settings → Notebook → check the "Kernel history access" checkbox. This feature was already available in the console in previous releases; it only works with kernels supporting execution history requests. To clear the execution history consult the documentation of the kernel you are using (e.g., IPython/ipykernel). ### Error indicator in the table of contents When a cell fails during execution, an error indicator will be displayed by the corresponding heading, increasing awareness of the notebook state and enabling users to quickly navigate to the cell which requires attention. Error indicator in the shape of a triangle with exclamation sign (using ⚠ UTF character) shown next to one of the headings in the table of contents panel ### Search improvements - The search box will now grow automatically to accommodate longer text - Search in selection can now be toggled using Alt + L and automatic search in selection can be configured in settings - Tooltips with shortcuts were added to the buttons in the search box to improve discoverability of the shortcuts ### Miscellaneous - The current theme (dark/light) can now be synced with the browser/system preference (Settings menu → Theme → Synchronise with System Settings) - A blue "read-only" status indicator is now displayed in the toolbar of documents which cannot be saved because their model is read-only. - Native support for viewing jsonl/ndjson files was added - Collapsing of breadcrumbs in the File Browser can be disabled in File Browser settings ## 7.1.2 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.1.1...ca41222a9c8d75356c6d67d3bd36e34d71cce2d8)) ### Maintenance and upkeep improvements - Update Release Scripts [#7295](https://github.com/jupyter/notebook/pull/7295) ([@blink1073](https://github.com/blink1073)) - Fix jupyterlab install command in the releaser hook [#7294](https://github.com/jupyter/notebook/pull/7294) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.1.5 packages [#7291](https://github.com/jupyter/notebook/pull/7291) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Add a section to use local dependencies [#7292](https://github.com/jupyter/notebook/pull/7292) ([@brichet](https://github.com/brichet)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-02-26&to=2024-03-14&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2024-02-26..2024-03-14&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2024-02-26..2024-03-14&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-02-26..2024-03-14&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-02-26..2024-03-14&type=Issues) ## 7.1.1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.1.0...da7b8d400e96ceff0eec834badd891bc5d5f154d)) ### Bugs fixed - Grayout "Edit Notebook Metadata" for other file formats. [#7265](https://github.com/jupyter/notebook/pull/7265) ([@itsmevichu](https://github.com/itsmevichu)) ### Maintenance and upkeep improvements - Fix flaky mobile UI tests [#7278](https://github.com/jupyter/notebook/pull/7278) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.1.2 packages [#7277](https://github.com/jupyter/notebook/pull/7277) ([@jtpio](https://github.com/jtpio)) - Ignore stackoverflow link [#7274](https://github.com/jupyter/notebook/pull/7274) ([@jtpio](https://github.com/jtpio)) - Expose `version_info` [#7273](https://github.com/jupyter/notebook/pull/7273) ([@jtpio](https://github.com/jtpio)) - Bump ip from 2.0.0 to 2.0.1 in /ui-tests [#7268](https://github.com/jupyter/notebook/pull/7268) ([@dependabot](https://github.com/dependabot)) - Bump ip from 2.0.0 to 2.0.1 [#7267](https://github.com/jupyter/notebook/pull/7267) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-02-13&to=2024-02-26&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2024-02-13..2024-02-26&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-02-13..2024-02-26&type=Issues) | [@itsmevichu](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aitsmevichu+updated%3A2024-02-13..2024-02-26&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-02-13..2024-02-26&type=Issues) ## 7.1.0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.0.6...b8ec7e4a8eda70a8d7dca19799acd3e96e019160)) ### Enhancements made - Create a new notebook with a specific kernel from the new dropdown [#7255](https://github.com/jupyter/notebook/pull/7255) ([@jtpio](https://github.com/jtpio)) - Add the plugin manager [#7198](https://github.com/jupyter/notebook/pull/7198) ([@jtpio](https://github.com/jtpio)) - Fix toggle functionality for widgets. [#7178](https://github.com/jupyter/notebook/pull/7178) ([@haok1402](https://github.com/haok1402)) - Bump to JupyterLab 4.1.0a4 bis [#7172](https://github.com/jupyter/notebook/pull/7172) ([@brichet](https://github.com/brichet)) - Update to JupyterLab `4.1.0a3` [#7161](https://github.com/jupyter/notebook/pull/7161) ([@jtpio](https://github.com/jtpio)) - Added Lumino Plugin Description (#7008) [#7127](https://github.com/jupyter/notebook/pull/7127) ([@Dilip-Jain](https://github.com/Dilip-Jain)) - Added Edit Notebook Metadata Option (#6402) [#7099](https://github.com/jupyter/notebook/pull/7099) ([@Dilip-Jain](https://github.com/Dilip-Jain)) - Update to JupyterLab 4.1 [#7096](https://github.com/jupyter/notebook/pull/7096) ([@jtpio](https://github.com/jtpio)) - Add the JupyterLab resources plugin [#6968](https://github.com/jupyter/notebook/pull/6968) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fix spurious kernel selection dialog on notebook creation [#7258](https://github.com/jupyter/notebook/pull/7258) ([@jtpio](https://github.com/jtpio)) - Workaround for the file browser tracker focus issue [#7224](https://github.com/jupyter/notebook/pull/7224) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update to JupyterLab 4.1.1 [#7256](https://github.com/jupyter/notebook/pull/7256) ([@jtpio](https://github.com/jtpio)) - Follow JupyterLab minor versions [#7250](https://github.com/jupyter/notebook/pull/7250) ([@jtpio](https://github.com/jtpio)) - chore: update pre-commit hooks [#7237](https://github.com/jupyter/notebook/pull/7237) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Update to JupyterLab 4.1.0 final [#7234](https://github.com/jupyter/notebook/pull/7234) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.1.0rc1 [#7230](https://github.com/jupyter/notebook/pull/7230) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.1.0rc0 [#7227](https://github.com/jupyter/notebook/pull/7227) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.1.0b2 [#7222](https://github.com/jupyter/notebook/pull/7222) ([@jtpio](https://github.com/jtpio)) - Fix `check_links` on CI [#7219](https://github.com/jupyter/notebook/pull/7219) ([@jtpio](https://github.com/jtpio)) - Bump the actions group with 1 update [#7218](https://github.com/jupyter/notebook/pull/7218) ([@dependabot](https://github.com/dependabot)) - Bump the actions group with 2 updates [#7207](https://github.com/jupyter/notebook/pull/7207) ([@dependabot](https://github.com/dependabot)) - chore: update pre-commit hooks [#7206](https://github.com/jupyter/notebook/pull/7206) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Add nbviewer.jupyter.org to the ignore list [#7197](https://github.com/jupyter/notebook/pull/7197) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.1.0b0 [#7196](https://github.com/jupyter/notebook/pull/7196) ([@jtpio](https://github.com/jtpio)) - Update ruff config [#7190](https://github.com/jupyter/notebook/pull/7190) ([@blink1073](https://github.com/blink1073)) - Bump @babel/traverse from 7.23.0 to 7.23.6 [#7187](https://github.com/jupyter/notebook/pull/7187) ([@dependabot](https://github.com/dependabot)) - Bump actions/setup-python from 4 to 5 [#7180](https://github.com/jupyter/notebook/pull/7180) ([@dependabot](https://github.com/dependabot)) - Update publish-release workflow for PyPI trusted publisher [#7176](https://github.com/jupyter/notebook/pull/7176) ([@jtpio](https://github.com/jtpio)) - chore: update pre-commit hooks [#7174](https://github.com/jupyter/notebook/pull/7174) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Update `yarn.lock` [#7170](https://github.com/jupyter/notebook/pull/7170) ([@jtpio](https://github.com/jtpio)) - Bump axios from 1.5.1 to 1.6.2 [#7165](https://github.com/jupyter/notebook/pull/7165) ([@dependabot](https://github.com/dependabot)) - Bump dessant/lock-threads from 4 to 5 [#7159](https://github.com/jupyter/notebook/pull/7159) ([@dependabot](https://github.com/dependabot)) - Update ruff config and typing [#7145](https://github.com/jupyter/notebook/pull/7145) ([@blink1073](https://github.com/blink1073)) - chore: update pre-commit hooks [#7143](https://github.com/jupyter/notebook/pull/7143) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Clean up lint handling [#7142](https://github.com/jupyter/notebook/pull/7142) ([@blink1073](https://github.com/blink1073)) - Adopt ruff format [#7132](https://github.com/jupyter/notebook/pull/7132) ([@blink1073](https://github.com/blink1073)) - Fix python bumping to `minor` [#7131](https://github.com/jupyter/notebook/pull/7131) ([@jtpio](https://github.com/jtpio)) - Add Python 3.12 classifier [#7111](https://github.com/jupyter/notebook/pull/7111) ([@jtpio](https://github.com/jtpio)) - Remove viewport workaround in the UI tests [#6887](https://github.com/jupyter/notebook/pull/6887) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Add documentation for updating `notebook` imports [#7244](https://github.com/jupyter/notebook/pull/7244) ([@jtpio](https://github.com/jtpio)) - Fix link in `CONTRIBUTING.md` [#7235](https://github.com/jupyter/notebook/pull/7235) ([@jtpio](https://github.com/jtpio)) - Add user facing changelog for 7.1 [#7232](https://github.com/jupyter/notebook/pull/7232) ([@jtpio](https://github.com/jtpio)) - Clarify README about supported versions (post v7 release) [#7193](https://github.com/jupyter/notebook/pull/7193) ([@akx](https://github.com/akx)) - Set `navigation_with_keys` to `False` [#7129](https://github.com/jupyter/notebook/pull/7129) ([@jtpio](https://github.com/jtpio)) - Updated ui-tests Configuration in Contributing.md [#7124](https://github.com/jupyter/notebook/pull/7124) ([@jayeshsingh9767](https://github.com/jayeshsingh9767)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-10-17&to=2024-02-13&type=c)) [@akx](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aakx+updated%3A2023-10-17..2024-02-13&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-10-17..2024-02-13&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2023-10-17..2024-02-13&type=Issues) | [@d5423197](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ad5423197+updated%3A2023-10-17..2024-02-13&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-10-17..2024-02-13&type=Issues) | [@Dilip-Jain](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ADilip-Jain+updated%3A2023-10-17..2024-02-13&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-10-17..2024-02-13&type=Issues) | [@haok1402](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ahaok1402+updated%3A2023-10-17..2024-02-13&type=Issues) | [@jayeshsingh9767](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajayeshsingh9767+updated%3A2023-10-17..2024-02-13&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-10-17..2024-02-13&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2023-10-17..2024-02-13&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-10-17..2024-02-13&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2023-10-17..2024-02-13&type=Issues) ## 7.1.0rc1 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.1.0rc0...376a2f97c883e6e91f321d0a676e1ee9ff3b8d87)) ### Maintenance and upkeep improvements - Follow JupyterLab minor versions [#7250](https://github.com/jupyter/notebook/pull/7250) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Add documentation for updating `notebook` imports [#7244](https://github.com/jupyter/notebook/pull/7244) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-02-07&to=2024-02-09&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-02-07..2024-02-09&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-02-07..2024-02-09&type=Issues) ## 7.1.0rc0 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.1.0b0...2d717f5896a1d4310baa2499c7e6197d1914201d)) ### Enhancements made - Added Edit Notebook Metadata Option (#6402) [#7099](https://github.com/jupyter/notebook/pull/7099) ([@Dilip-Jain](https://github.com/Dilip-Jain)) ### Maintenance and upkeep improvements - chore: update pre-commit hooks [#7237](https://github.com/jupyter/notebook/pull/7237) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Update to JupyterLab 4.1.0 final [#7234](https://github.com/jupyter/notebook/pull/7234) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.1.0rc1 [#7230](https://github.com/jupyter/notebook/pull/7230) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.1.0rc0 [#7227](https://github.com/jupyter/notebook/pull/7227) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Fix link in `CONTRIBUTING.md` [#7235](https://github.com/jupyter/notebook/pull/7235) ([@jtpio](https://github.com/jtpio)) - Add user facing changelog for 7.1 [#7232](https://github.com/jupyter/notebook/pull/7232) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2024-01-26&to=2024-02-07&type=c)) [@Dilip-Jain](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ADilip-Jain+updated%3A2024-01-26..2024-02-07&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2024-01-26..2024-02-07&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2024-01-26..2024-02-07&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2024-01-26..2024-02-07&type=Issues) ## 7.1.0b0 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.1.0a2...5d265b90ed5f097af4ca22d283ecdc705229ff92)) ### Bugs fixed - Workaround for the file browser tracker focus issue [#7224](https://github.com/jupyter/notebook/pull/7224) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update to JupyterLab 4.1.0b2 [#7222](https://github.com/jupyter/notebook/pull/7222) ([@jtpio](https://github.com/jtpio)) - Fix `check_links` on CI [#7219](https://github.com/jupyter/notebook/pull/7219) ([@jtpio](https://github.com/jtpio)) - Bump the actions group with 1 update [#7218](https://github.com/jupyter/notebook/pull/7218) ([@dependabot](https://github.com/dependabot)) - Bump the actions group with 2 updates [#7207](https://github.com/jupyter/notebook/pull/7207) ([@dependabot](https://github.com/dependabot)) - chore: update pre-commit hooks [#7206](https://github.com/jupyter/notebook/pull/7206) ([@pre-commit-ci](https://github.com/pre-commit-ci)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-12-27&to=2024-01-26&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-12-27..2024-01-26&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-12-27..2024-01-26&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-12-27..2024-01-26&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-12-27..2024-01-26&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2023-12-27..2024-01-26&type=Issues) ## 7.1.0a2 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.1.0a1...251e0e360603b6e63b280b3bd04a5406f7da28da)) ### Enhancements made - Add the plugin manager [#7198](https://github.com/jupyter/notebook/pull/7198) ([@jtpio](https://github.com/jtpio)) - Fix toggle functionality for widgets. [#7178](https://github.com/jupyter/notebook/pull/7178) ([@haok1402](https://github.com/haok1402)) ### Maintenance and upkeep improvements - Add nbviewer.jupyter.org to the ignore list [#7197](https://github.com/jupyter/notebook/pull/7197) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.1.0b0 [#7196](https://github.com/jupyter/notebook/pull/7196) ([@jtpio](https://github.com/jtpio)) - Update ruff config [#7190](https://github.com/jupyter/notebook/pull/7190) ([@blink1073](https://github.com/blink1073)) - Bump @babel/traverse from 7.23.0 to 7.23.6 [#7187](https://github.com/jupyter/notebook/pull/7187) ([@dependabot](https://github.com/dependabot)) - Bump actions/setup-python from 4 to 5 [#7180](https://github.com/jupyter/notebook/pull/7180) ([@dependabot](https://github.com/dependabot)) - Update publish-release workflow for PyPI trusted publisher [#7176](https://github.com/jupyter/notebook/pull/7176) ([@jtpio](https://github.com/jtpio)) - chore: update pre-commit hooks [#7174](https://github.com/jupyter/notebook/pull/7174) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Remove viewport workaround in the UI tests [#6887](https://github.com/jupyter/notebook/pull/6887) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Clarify README about supported versions (post v7 release) [#7193](https://github.com/jupyter/notebook/pull/7193) ([@akx](https://github.com/akx)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-12-04&to=2023-12-27&type=c)) [@akx](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aakx+updated%3A2023-12-04..2023-12-27&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-12-04..2023-12-27&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-12-04..2023-12-27&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-12-04..2023-12-27&type=Issues) | [@haok1402](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ahaok1402+updated%3A2023-12-04..2023-12-27&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-12-04..2023-12-27&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-12-04..2023-12-27&type=Issues) ## 7.1.0a1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.1.0-alpha.0...a74cd91871fcc6037d384fe59af8986557e783e5)) ### Enhancements made - Bump to JupyterLab 4.1.0a4 bis [#7172](https://github.com/jupyter/notebook/pull/7172) ([@brichet](https://github.com/brichet)) - Update to JupyterLab `4.1.0a3` [#7161](https://github.com/jupyter/notebook/pull/7161) ([@jtpio](https://github.com/jtpio)) - Add the JupyterLab resources plugin [#6968](https://github.com/jupyter/notebook/pull/6968) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update `yarn.lock` [#7170](https://github.com/jupyter/notebook/pull/7170) ([@jtpio](https://github.com/jtpio)) - Bump axios from 1.5.1 to 1.6.2 [#7165](https://github.com/jupyter/notebook/pull/7165) ([@dependabot](https://github.com/dependabot)) - Bump dessant/lock-threads from 4 to 5 [#7159](https://github.com/jupyter/notebook/pull/7159) ([@dependabot](https://github.com/dependabot)) - Update ruff config and typing [#7145](https://github.com/jupyter/notebook/pull/7145) ([@blink1073](https://github.com/blink1073)) - chore: update pre-commit hooks [#7143](https://github.com/jupyter/notebook/pull/7143) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Clean up lint handling [#7142](https://github.com/jupyter/notebook/pull/7142) ([@blink1073](https://github.com/blink1073)) - Adopt ruff format [#7132](https://github.com/jupyter/notebook/pull/7132) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-10-27&to=2023-12-04&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-10-27..2023-12-04&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2023-10-27..2023-12-04&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-10-27..2023-12-04&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-10-27..2023-12-04&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-10-27..2023-12-04&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2023-10-27..2023-12-04&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-10-27..2023-12-04&type=Issues) ## 7.1.0a0 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/application-extension@7.0.6...0cd6104b926a398b419f2433538cef437592796f)) ### Enhancements made - Added Lumino Plugin Description (#7008) [#7127](https://github.com/jupyter/notebook/pull/7127) ([@Dilip-Jain](https://github.com/Dilip-Jain)) - Update to JupyterLab 4.1 [#7096](https://github.com/jupyter/notebook/pull/7096) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Fix python bumping to `minor` [#7131](https://github.com/jupyter/notebook/pull/7131) ([@jtpio](https://github.com/jtpio)) - Add Python 3.12 classifier [#7111](https://github.com/jupyter/notebook/pull/7111) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Set `navigation_with_keys` to `False` [#7129](https://github.com/jupyter/notebook/pull/7129) ([@jtpio](https://github.com/jtpio)) - Updated ui-tests Configuration in Contributing.md [#7124](https://github.com/jupyter/notebook/pull/7124) ([@jayeshsingh9767](https://github.com/jayeshsingh9767)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-10-17&to=2023-10-27&type=c)) [@Dilip-Jain](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ADilip-Jain+updated%3A2023-10-17..2023-10-27&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-10-17..2023-10-27&type=Issues) | [@jayeshsingh9767](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajayeshsingh9767+updated%3A2023-10-17..2023-10-27&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-10-17..2023-10-27&type=Issues) ## v7.0 ## 7.0.6 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/app@7.0.5...c62caffb02856737870cbc79a2cdb43b3e89c363)) ### Bugs fixed - Updated fav-icon Base URL from JupyterLab PageConfig. [#7109](https://github.com/jupyter/notebook/pull/7109) ([@jayeshsingh9767](https://github.com/jayeshsingh9767)) ### Maintenance and upkeep improvements - Fix typings [#7110](https://github.com/jupyter/notebook/pull/7110) ([@jtpio](https://github.com/jtpio)) - Bump postcss from 8.4.27 to 8.4.31 [#7089](https://github.com/jupyter/notebook/pull/7089) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-10-12&to=2023-10-17&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-10-12..2023-10-17&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-10-12..2023-10-17&type=Issues) | [@jayeshsingh9767](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajayeshsingh9767+updated%3A2023-10-12..2023-10-17&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-10-12..2023-10-17&type=Issues) ## 7.0.5 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/app@7.0.4...839193d07f0780ded6f559892517f061f3776b02)) ### Enhancements made - Update to JupyterLab 4.0.7 [#7103](https://github.com/jupyter/notebook/pull/7103) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update `permissions` in the galata snapshot workflow [#7105](https://github.com/jupyter/notebook/pull/7105) ([@jtpio](https://github.com/jtpio)) - Fix typings check on CI [#7104](https://github.com/jupyter/notebook/pull/7104) ([@jtpio](https://github.com/jtpio)) - Ignore yarn.lock for codespell [#7098](https://github.com/jupyter/notebook/pull/7098) ([@jtpio](https://github.com/jtpio)) - Remove link to the PDF documentation [#7094](https://github.com/jupyter/notebook/pull/7094) ([@jtpio](https://github.com/jtpio)) - Bump postcss from 8.4.23 to 8.4.31 in /ui-tests [#7088](https://github.com/jupyter/notebook/pull/7088) ([@dependabot](https://github.com/dependabot)) - React to the galata update comment [#7086](https://github.com/jupyter/notebook/pull/7086) ([@jtpio](https://github.com/jtpio)) - Switch from `hub` to `gh` in the Playwright snapshots update workflow [#7085](https://github.com/jupyter/notebook/pull/7085) ([@jtpio](https://github.com/jtpio)) - chore: update pre-commit hooks [#7084](https://github.com/jupyter/notebook/pull/7084) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Fix traitlets typing [#7082](https://github.com/jupyter/notebook/pull/7082) ([@jtpio](https://github.com/jtpio)) - Bump toshimaru/auto-author-assign from 2.0.0 to 2.0.1 [#7080](https://github.com/jupyter/notebook/pull/7080) ([@dependabot](https://github.com/dependabot)) - Bump toshimaru/auto-author-assign from 1.6.2 to 2.0.0 [#7072](https://github.com/jupyter/notebook/pull/7072) ([@dependabot](https://github.com/dependabot)) - ci: set minimal permissions to workflows [#7070](https://github.com/jupyter/notebook/pull/7070) ([@diogoteles08](https://github.com/diogoteles08)) - Bump systeminformation from 5.17.12 to 5.21.8 in /ui-tests [#7064](https://github.com/jupyter/notebook/pull/7064) ([@dependabot](https://github.com/dependabot)) ### Documentation improvements - Improve docs setup (SVG logos, repo links) [#7074](https://github.com/jupyter/notebook/pull/7074) ([@krassowski](https://github.com/krassowski)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-09-20&to=2023-10-12&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-09-20..2023-10-12&type=Issues) | [@diogoteles08](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adiogoteles08+updated%3A2023-09-20..2023-10-12&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-09-20..2023-10-12&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-09-20..2023-10-12&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2023-09-20..2023-10-12&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-09-20..2023-10-12&type=Issues) ## 7.0.4 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/app@7.0.3...0e62386fc71ed4bd424c989f9d5493ca346f1d9a)) ### Enhancements made - Update to JupyterLab 4.0.6 [#7049](https://github.com/jupyter/notebook/pull/7049) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fix `app_version` [#7061](https://github.com/jupyter/notebook/pull/7061) ([@jtpio](https://github.com/jtpio)) - fix trusted status indication [#7036](https://github.com/jupyter/notebook/pull/7036) ([@adigaboy](https://github.com/adigaboy)) ### Maintenance and upkeep improvements - Update Binder environment [#7059](https://github.com/jupyter/notebook/pull/7059) ([@jtpio](https://github.com/jtpio)) - Add `deduplicate` top-level script [#7058](https://github.com/jupyter/notebook/pull/7058) ([@jtpio](https://github.com/jtpio)) - Move opening path in new browser tabs to a separate plugin [#7056](https://github.com/jupyter/notebook/pull/7056) ([@jtpio](https://github.com/jtpio)) - Enable the Playwright trace [#7050](https://github.com/jupyter/notebook/pull/7050) ([@jtpio](https://github.com/jtpio)) - Bump actions/checkout from 3 to 4 [#7040](https://github.com/jupyter/notebook/pull/7040) ([@dependabot](https://github.com/dependabot)) - Adopt sp-repo-review [#7039](https://github.com/jupyter/notebook/pull/7039) ([@blink1073](https://github.com/blink1073)) - Add `datetime.datetime.utc()` to the filter list [#7037](https://github.com/jupyter/notebook/pull/7037) ([@jtpio](https://github.com/jtpio)) - Fix docs build on Gitpod [#7026](https://github.com/jupyter/notebook/pull/7026) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-08-30&to=2023-09-20&type=c)) [@adigaboy](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aadigaboy+updated%3A2023-08-30..2023-09-20&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-08-30..2023-09-20&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-08-30..2023-09-20&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-08-30..2023-09-20&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-08-30..2023-09-20&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-08-30..2023-09-20&type=Issues) ## 7.0.3 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/app@7.0.2...e2eb8f2a166ba7b339309b8bfbff40e6c9e0a9b9)) ### Bugs fixed - Require importlib_resources for testing on Python \< 3.10 [#7016](https://github.com/jupyter/notebook/pull/7016) ([@bnavigator](https://github.com/bnavigator)) - Fix Python 3.12 compatibility [#6965](https://github.com/jupyter/notebook/pull/6965) ([@frenzymadness](https://github.com/frenzymadness)) ### Maintenance and upkeep improvements - Update to JupyterLab 4.0.5 [#7013](https://github.com/jupyter/notebook/pull/7013) ([@jtpio](https://github.com/jtpio)) - Test against Python 3.12 [#6999](https://github.com/jupyter/notebook/pull/6999) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Mention the nx graph in the contributing guide [#7001](https://github.com/jupyter/notebook/pull/7001) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-08-04&to=2023-08-30&type=c)) [@bnavigator](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abnavigator+updated%3A2023-08-04..2023-08-30&type=Issues) | [@defjaf](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adefjaf+updated%3A2023-08-04..2023-08-30&type=Issues) | [@frenzymadness](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afrenzymadness+updated%3A2023-08-04..2023-08-30&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-08-04..2023-08-30&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-08-04..2023-08-30&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2023-08-04..2023-08-30&type=Issues) ## 7.0.2 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/app@7.0.1...af5edd42374cadba65feed2e6828b1ef96295daf)) ### Enhancements made - Update to JupyterLab 4.0.4 packages [#6998](https://github.com/jupyter/notebook/pull/6998) ([@jtpio](https://github.com/jtpio)) - Improve about dialog [#6996](https://github.com/jupyter/notebook/pull/6996) ([@yjrab](https://github.com/yjrab)) - Added documentation link in Help menu [#6993](https://github.com/jupyter/notebook/pull/6993) ([@Mikil03](https://github.com/Mikil03)) ### Bugs fixed - Remove `RedirectHandler` [#6997](https://github.com/jupyter/notebook/pull/6997) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-07-31&to=2023-08-04&type=c)) [@echarles](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aecharles+updated%3A2023-07-31..2023-08-04&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-07-31..2023-08-04&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-07-31..2023-08-04&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2023-07-31..2023-08-04&type=Issues) | [@Mikil03](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AMikil03+updated%3A2023-07-31..2023-08-04&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-07-31..2023-08-04&type=Issues) | [@shaneknapp](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ashaneknapp+updated%3A2023-07-31..2023-08-04&type=Issues) | [@yjrab](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ayjrab+updated%3A2023-07-31..2023-08-04&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2023-07-31..2023-08-04&type=Issues) ## 7.0.1 ([Full Changelog](https://github.com/jupyter/notebook/compare/@jupyter-notebook/app@7.0.0...ac3c882a246b46c15c1963ef4b65427a4257b132)) ### Enhancements made - Update accessibly compliance section in the docs [#6982](https://github.com/jupyter/notebook/pull/6982) ([@andrii-i](https://github.com/andrii-i)) - Update the browser tab favicon on kernel busy [#6980](https://github.com/jupyter/notebook/pull/6980) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Bump `word-wrap` and `semver` [#6979](https://github.com/jupyter/notebook/pull/6979) ([@jtpio](https://github.com/jtpio)) - Enable lerna caching for build scripts [#6767](https://github.com/jupyter/notebook/pull/6767) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Update accessibly compliance section in the docs [#6982](https://github.com/jupyter/notebook/pull/6982) ([@andrii-i](https://github.com/andrii-i)) - Fix link in `README.md` [#6973](https://github.com/jupyter/notebook/pull/6973) ([@jtpio](https://github.com/jtpio)) - The future is now [#6972](https://github.com/jupyter/notebook/pull/6972) ([@frenzymadness](https://github.com/frenzymadness)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-07-19&to=2023-07-31&type=c)) [@andrii-i](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandrii-i+updated%3A2023-07-19..2023-07-31&type=Issues) | [@echarles](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aecharles+updated%3A2023-07-19..2023-07-31&type=Issues) | [@frenzymadness](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afrenzymadness+updated%3A2023-07-19..2023-07-31&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-07-19..2023-07-31&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-07-19..2023-07-31&type=Issues) | [@prof-lupin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aprof-lupin+updated%3A2023-07-19..2023-07-31&type=Issues) ## 7.0.0 Jupyter Notebook 7 is released :tada: Check the changelog: https://jupyter-notebook.readthedocs.io/en/latest/changelog.html And the new features in Notebook 7: https://jupyter-notebook.readthedocs.io/en/latest/notebook_7_features.html Migration Guide: https://jupyter-notebook.readthedocs.io/en/latest/migrate_to_notebook7.html ______________________________________________________________________ For reference here is the changelog since the last `7.0.0rc2` release. ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0rc2...2be98e8f39af7f3ec2729006018f6baf0998f94b)) ### Bugs fixed - Update Jupytext Notebook url path [#6961](https://github.com/jupyter/notebook/pull/6961) ([@RRosio](https://github.com/RRosio)) ### Maintenance and upkeep improvements - Fix hatch version when going from rc [#6971](https://github.com/jupyter/notebook/pull/6971) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.0.3 [#6967](https://github.com/jupyter/notebook/pull/6967) ([@jtpio](https://github.com/jtpio)) - Bump semver from 7.5.0 to 7.5.3 in /ui-tests [#6950](https://github.com/jupyter/notebook/pull/6950) ([@dependabot](https://github.com/dependabot)) ### Documentation improvements - fix: update link to troubleshooting guidelines [#6964](https://github.com/jupyter/notebook/pull/6964) ([@emmanuel-ferdman](https://github.com/emmanuel-ferdman)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-06-26&to=2023-07-19&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-06-26..2023-07-19&type=Issues) | [@emmanuel-ferdman](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aemmanuel-ferdman+updated%3A2023-06-26..2023-07-19&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-06-26..2023-07-19&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-06-26..2023-07-19&type=Issues) | [@parmentelat](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aparmentelat+updated%3A2023-06-26..2023-07-19&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-06-26..2023-07-19&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2023-06-26..2023-07-19&type=Issues) ## 7.0.0rc2 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0rc1...27c00bc56afaa5b89713f760b0cc6eb88079224e)) ### Bugs fixed - Fix opening files from the CLI [#6946](https://github.com/jupyter/notebook/pull/6946) ([@jtpio](https://github.com/jtpio)) - Fix handling of the base url [#6943](https://github.com/jupyter/notebook/pull/6943) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-06-22&to=2023-06-26&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-06-22..2023-06-26&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-06-22..2023-06-26&type=Issues) | [@parmentelat](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aparmentelat+updated%3A2023-06-22..2023-06-26&type=Issues) ## 7.0.0rc1 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0rc0...8493e1ba21ebaca5c192d68bdc829ccc5b29a799)) ### Enhancements made - Close the browser tab when clicking on "Close and Shut Down Notebook" [#6937](https://github.com/jupyter/notebook/pull/6937) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fix the redirect handler [#6941](https://github.com/jupyter/notebook/pull/6941) ([@jtpio](https://github.com/jtpio)) - Make jupyter logo select properly (#6927) [#6938](https://github.com/jupyter/notebook/pull/6938) ([@Cheukting](https://github.com/Cheukting)) ### Documentation improvements - Update issue templates [#6939](https://github.com/jupyter/notebook/pull/6939) ([@RRosio](https://github.com/RRosio)) - Docs parity for find with JupyterLab. [#6917](https://github.com/jupyter/notebook/pull/6917) ([@ericsnekbytes](https://github.com/ericsnekbytes)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-06-19&to=2023-06-22&type=c)) [@andrii-i](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandrii-i+updated%3A2023-06-19..2023-06-22&type=Issues) | [@Cheukting](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ACheukting+updated%3A2023-06-19..2023-06-22&type=Issues) | [@ericsnekbytes](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aericsnekbytes+updated%3A2023-06-19..2023-06-22&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-06-19..2023-06-22&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-06-19..2023-06-22&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2023-06-19..2023-06-22&type=Issues) ## 7.0.0rc0 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0b4...d0692112a4b2db20c2178205d4b5630184acbf7b)) ### Enhancements made - Update JupyterLab, audit document viewers [#6922](https://github.com/jupyter/notebook/pull/6922) ([@jtpio](https://github.com/jtpio)) - Customize the shell layout with the settings [#6921](https://github.com/jupyter/notebook/pull/6921) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fix default viewers override [#6923](https://github.com/jupyter/notebook/pull/6923) ([@jtpio](https://github.com/jtpio)) - Align JupyterHub config with JupyterLab [#6918](https://github.com/jupyter/notebook/pull/6918) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Added example of custom css files [#6919](https://github.com/jupyter/notebook/pull/6919) ([@RRosio](https://github.com/RRosio)) ### API and Breaking Changes - Customize the shell layout with the settings [#6921](https://github.com/jupyter/notebook/pull/6921) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-06-12&to=2023-06-19&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-06-12..2023-06-19&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-06-12..2023-06-19&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2023-06-12..2023-06-19&type=Issues) ## 7.0.0b4 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0b3...ee3e1c221226d482ca1c9bec6362c8af36f1da56)) ### Enhancements made - Rename browser tab title to Home [#6913](https://github.com/jupyter/notebook/pull/6913) ([@Cheukting](https://github.com/Cheukting)) - Add the notification plugin [#6900](https://github.com/jupyter/notebook/pull/6900) ([@jtpio](https://github.com/jtpio)) - Configurable `default_url` for JupyterNotebookApp [#6899](https://github.com/jupyter/notebook/pull/6899) ([@paulgb](https://github.com/paulgb)) - Enhancement: Added drop shadows to markdown, text, and tree views [#6893](https://github.com/jupyter/notebook/pull/6893) ([@rielAsh24](https://github.com/rielAsh24)) - Update to JupyterLab 4.0.1 [#6892](https://github.com/jupyter/notebook/pull/6892) ([@jtpio](https://github.com/jtpio)) - Add file browser actions to the file browser toolbar [#6888](https://github.com/jupyter/notebook/pull/6888) ([@jtpio](https://github.com/jtpio)) - Add option to open a notebook in NbClassic if it is installed; show "Open in..." dropdown menu if there are multiple options, show single button otherwise [#6866](https://github.com/jupyter/notebook/pull/6866) ([@andrii-i](https://github.com/andrii-i)) - Load custom CSS [#6841](https://github.com/jupyter/notebook/pull/6841) ([@RRosio](https://github.com/RRosio)) ### Bugs fixed - Add an empty splash screen on notebook launch to avoid a flash of unstyled content [#6911](https://github.com/jupyter/notebook/pull/6911) ([@andrii-i](https://github.com/andrii-i)) - Fix for "find searches only part of the file" bug [#6905](https://github.com/jupyter/notebook/pull/6905) ([@ericsnekbytes](https://github.com/ericsnekbytes)) - Provide a custom rendermime plugin to handle local links [#6885](https://github.com/jupyter/notebook/pull/6885) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Fix check links on CI [#6910](https://github.com/jupyter/notebook/pull/6910) ([@jtpio](https://github.com/jtpio)) - Add `JSONLicenseWebpackPlugin` [#6896](https://github.com/jupyter/notebook/pull/6896) ([@jtpio](https://github.com/jtpio)) - Simplify Gitpod setup [#6894](https://github.com/jupyter/notebook/pull/6894) ([@jtpio](https://github.com/jtpio)) - Fix action name in update workflow [#6884](https://github.com/jupyter/notebook/pull/6884) ([@jtpio](https://github.com/jtpio)) - Fix playwright bot [#6880](https://github.com/jupyter/notebook/pull/6880) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Document how to manage plugins and extensions [#6909](https://github.com/jupyter/notebook/pull/6909) ([@jtpio](https://github.com/jtpio)) - Jupyter Notebook ecosystem docs improvements [#6877](https://github.com/jupyter/notebook/pull/6877) ([@ericsnekbytes](https://github.com/ericsnekbytes)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-05-25&to=2023-06-12&type=c)) [@andrii-i](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandrii-i+updated%3A2023-05-25..2023-06-12&type=Issues) | [@Cheukting](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ACheukting+updated%3A2023-05-25..2023-06-12&type=Issues) | [@echarles](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aecharles+updated%3A2023-05-25..2023-06-12&type=Issues) | [@ericsnekbytes](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aericsnekbytes+updated%3A2023-05-25..2023-06-12&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-05-25..2023-06-12&type=Issues) | [@henryiii](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ahenryiii+updated%3A2023-05-25..2023-06-12&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-05-25..2023-06-12&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2023-05-25..2023-06-12&type=Issues) | [@paulgb](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apaulgb+updated%3A2023-05-25..2023-06-12&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-05-25..2023-06-12&type=Issues) | [@rielAsh24](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ArielAsh24+updated%3A2023-05-25..2023-06-12&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2023-05-25..2023-06-12&type=Issues) | [@yuvipanda](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ayuvipanda+updated%3A2023-05-25..2023-06-12&type=Issues) ## 7.0.0b3 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0b2...93e4d5e1c6ed7a3a4875eed284255587ac293819)) ### Enhancements made - Copy edits for `migrate_to_notebook7` [#6879](https://github.com/jupyter/notebook/pull/6879) ([@JasonWeill](https://github.com/JasonWeill)) - Enable add a cell button [#6872](https://github.com/jupyter/notebook/pull/6872) ([@tuncbkose](https://github.com/tuncbkose)) - Update to JupyterLab 4 final [#6871](https://github.com/jupyter/notebook/pull/6871) ([@jtpio](https://github.com/jtpio)) - Remove "Close Tab" menu entry [#6843](https://github.com/jupyter/notebook/pull/6843) ([@timmerk3](https://github.com/timmerk3)) ### Bugs fixed - Fix handling of the default factory in the URL [#6873](https://github.com/jupyter/notebook/pull/6873) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update to Playwright 1.33 [#6874](https://github.com/jupyter/notebook/pull/6874) ([@jtpio](https://github.com/jtpio)) - Fix check links on CI [#6870](https://github.com/jupyter/notebook/pull/6870) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Copy edits for `migrate_to_notebook7` [#6879](https://github.com/jupyter/notebook/pull/6879) ([@JasonWeill](https://github.com/JasonWeill)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-05-09&to=2023-05-25&type=c)) [@andrii-i](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandrii-i+updated%3A2023-05-09..2023-05-25&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-05-09..2023-05-25&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJasonWeill+updated%3A2023-05-09..2023-05-25&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-05-09..2023-05-25&type=Issues) | [@timmerk3](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atimmerk3+updated%3A2023-05-09..2023-05-25&type=Issues) | [@tuncbkose](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atuncbkose+updated%3A2023-05-09..2023-05-25&type=Issues) ## 7.0.0b2 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0b1...c0071d796019c0221df4900313b51c0529438bcf)) ### Enhancements made - Update to JupyterLab 4.0.0rc1 [#6864](https://github.com/jupyter/notebook/pull/6864) ([@jtpio](https://github.com/jtpio)) - Change "Interface" menu to "Open in...", shorten names of menu items inside [#6847](https://github.com/jupyter/notebook/pull/6847) ([@andrii-i](https://github.com/andrii-i)) - Add Skip Link to Notebook [#6844](https://github.com/jupyter/notebook/pull/6844) ([@seirani](https://github.com/seirani)) ### Bugs fixed - Fix top bar visibility not picking up settings overrides (#6833) [#6836](https://github.com/jupyter/notebook/pull/6836) ([@yumyumqing](https://github.com/yumyumqing)) ### Maintenance and upkeep improvements - Update RTD image [#6861](https://github.com/jupyter/notebook/pull/6861) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-04-28&to=2023-05-09&type=c)) [@andrii-i](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aandrii-i+updated%3A2023-04-28..2023-05-09&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-04-28..2023-05-09&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-04-28..2023-05-09&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-04-28..2023-05-09&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-04-28..2023-05-09&type=Issues) | [@seirani](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aseirani+updated%3A2023-04-28..2023-05-09&type=Issues) | [@yumyumqing](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ayumyumqing+updated%3A2023-04-28..2023-05-09&type=Issues) ## 7.0.0b1 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0b0...4b6af274b24bcc20e43ad2330c9243c8d2c7d552)) ### Enhancements made - Update to JupyterLab 4.0.0rc0 [#6853](https://github.com/jupyter/notebook/pull/6853) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab `4.0.0b1` and `4.0.0b2` [#6838](https://github.com/jupyter/notebook/pull/6838) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fixes the notebooktools [#6834](https://github.com/jupyter/notebook/pull/6834) ([@brichet](https://github.com/brichet)) ### Maintenance and upkeep improvements - Use local coverage [#6839](https://github.com/jupyter/notebook/pull/6839) ([@blink1073](https://github.com/blink1073)) ### Documentation improvements - Added extra information and user-action summaries to 7 migration docs. [#6850](https://github.com/jupyter/notebook/pull/6850) ([@ericsnekbytes](https://github.com/ericsnekbytes)) - Rename migration file to `migrate_to_notebook7` [#6831](https://github.com/jupyter/notebook/pull/6831) ([@jtpio](https://github.com/jtpio)) - Use correct canonical URL while building docs [#6829](https://github.com/jupyter/notebook/pull/6829) ([@ashwinvis](https://github.com/ashwinvis)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-04-04&to=2023-04-28&type=c)) [@ashwinvis](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aashwinvis+updated%3A2023-04-04..2023-04-28&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-04-04..2023-04-28&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2023-04-04..2023-04-28&type=Issues) | [@ericsnekbytes](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aericsnekbytes+updated%3A2023-04-04..2023-04-28&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-04-04..2023-04-28&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-04-04..2023-04-28&type=Issues) ## 7.0.0b0 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a18...b99718f57a8beac7b4019901a57c94984781dd49)) ### Enhancements made - Update to JupyterLab `4.0.0b0` [#6803](https://github.com/jupyter/notebook/pull/6803) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - added white space to bottom of edit files [#6804](https://github.com/jupyter/notebook/pull/6804) ([@jesuscastillx](https://github.com/jesuscastillx)) - Hides 'micro' toolbars in notebook [#6791](https://github.com/jupyter/notebook/pull/6791) ([@JasonWeill](https://github.com/JasonWeill)) ### Maintenance and upkeep improvements - Add missing singleton packages for RTC [#6816](https://github.com/jupyter/notebook/pull/6816) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Improve the documentation for Notebook 7 [#6813](https://github.com/jupyter/notebook/pull/6813) ([@jtpio](https://github.com/jtpio)) - fix typo in the migration guide [#6812](https://github.com/jupyter/notebook/pull/6812) ([@Tiksagol](https://github.com/Tiksagol)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-03-24&to=2023-04-04&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-03-24..2023-04-04&type=Issues) | [@j-publius](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aj-publius+updated%3A2023-03-24..2023-04-04&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJasonWeill+updated%3A2023-03-24..2023-04-04&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-03-24..2023-04-04&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-03-24..2023-04-04&type=Issues) | [@Tiksagol](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ATiksagol+updated%3A2023-03-24..2023-04-04&type=Issues) ## 7.0.0a18 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a17...253efe279f8c8005f016f3dfe28c22233ee1d2dd)) ### Enhancements made - Add back the `csvviewer-extension` [#6799](https://github.com/jupyter/notebook/pull/6799) ([@jtpio](https://github.com/jtpio)) - Fix JSON setting editor not opening issue [#6795](https://github.com/jupyter/notebook/pull/6795) ([@yumyumqing](https://github.com/yumyumqing)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-03-20&to=2023-03-24&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-03-20..2023-03-24&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-03-20..2023-03-24&type=Issues) | [@yumyumqing](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ayumyumqing+updated%3A2023-03-20..2023-03-24&type=Issues) ## 7.0.0a17 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a16...7903de83e83a6ce342d71895dc1e8c2ec8128174)) ### Highlights This major change in this release is the update to the latest JupyterLab `4.0.0a37`. Check out the [JupyterLab `4.0.0a37` release notes](https://github.com/jupyterlab/jupyterlab/releases/tag/v4.0.0a37) for more details. ### Enhancements made - Update to JupyterLab 4.0.0a37 [#6777](https://github.com/jupyter/notebook/pull/6777) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Replace the use of `toArray` by `Array.from` [#6775](https://github.com/jupyter/notebook/pull/6775) (`@tarunsamanta2k20`) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-03-15&to=2023-03-20&type=c)) [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-03-15..2023-03-20&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-03-15..2023-03-20&type=Issues) | [@tarunsamanta2k20](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atarunsamanta2k20+updated%3A2023-03-15..2023-03-20&type=Issues) ## 7.0.0a16 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a15...0faa88c8b65e0302f1904e4ca9cd2e551525f352)) ### Enhancements made - Update to JupyterLab 4.0.0a36 [#6773](https://github.com/jupyter/notebook/pull/6773) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Clean up interface switcher plugin in preparation for release [#6766](https://github.com/jupyter/notebook/pull/6766) ([@afshin](https://github.com/afshin)) - Remove empty `py.test` file [#6764](https://github.com/jupyter/notebook/pull/6764) ([@frenzymadness](https://github.com/frenzymadness)) ### Documentation improvements - Add documentation for contributing to the docs [#6771](https://github.com/jupyter/notebook/pull/6771) ([@jtpio](https://github.com/jtpio)) - Convert docs to Markdown [#6770](https://github.com/jupyter/notebook/pull/6770) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-03-08&to=2023-03-15&type=c)) [@afshin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aafshin+updated%3A2023-03-08..2023-03-15&type=Issues) | [@frenzymadness](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afrenzymadness+updated%3A2023-03-08..2023-03-15&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-03-08..2023-03-15&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-03-08..2023-03-15&type=Issues) ## 7.0.0a15 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a14...1ccb8f15d6bf3557eed2405438a9df3c1d6cd040)) ### Enhancements made - Update to JupyterLab 4.0.0a35 [#6757](https://github.com/jupyter/notebook/pull/6757) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Bump vega from 5.22.1 to 5.23.0 in /ui-tests [#6756](https://github.com/jupyter/notebook/pull/6756) ([@dependabot](https://github.com/dependabot)) - Bump vega-functions from 5.13.0 to 5.13.1 in /ui-tests [#6754](https://github.com/jupyter/notebook/pull/6754) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-03-01&to=2023-03-08&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2023-03-01..2023-03-08&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-03-01..2023-03-08&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-03-01..2023-03-08&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-03-01..2023-03-08&type=Issues) ## 7.0.0a14 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a13...f9e427cf4e92dbaa5794fe0331ca92b41d45d52c)) ### Enhancements made - Fix loading of plugins [#6750](https://github.com/jupyter/notebook/pull/6750) ([@jtpio](https://github.com/jtpio)) - Add the extension manager [#6747](https://github.com/jupyter/notebook/pull/6747) ([@jtpio](https://github.com/jtpio)) - File browser CSS tweaks [#6738](https://github.com/jupyter/notebook/pull/6738) ([@jtpio](https://github.com/jtpio)) - Add trusted indicator [#6736](https://github.com/jupyter/notebook/pull/6736) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Clean up license [#6743](https://github.com/jupyter/notebook/pull/6743) ([@dcsaba89](https://github.com/dcsaba89)) - Update to TypeScript 5 [#6735](https://github.com/jupyter/notebook/pull/6735) ([@jtpio](https://github.com/jtpio)) - Enable `nx` [#6718](https://github.com/jupyter/notebook/pull/6718) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Corrected "Recomment" to "Recommend" [#6741](https://github.com/jupyter/notebook/pull/6741) ([@Tony-j77](https://github.com/Tony-j77)) - Docs: add migrate to notebook7 page [#6737](https://github.com/jupyter/notebook/pull/6737) ([@echarles](https://github.com/echarles)) - Add section about updating reference snapshots [#6733](https://github.com/jupyter/notebook/pull/6733) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-02-15&to=2023-03-01&type=c)) [@dcsaba89](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adcsaba89+updated%3A2023-02-15..2023-03-01&type=Issues) | [@echarles](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aecharles+updated%3A2023-02-15..2023-03-01&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-02-15..2023-03-01&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-02-15..2023-03-01&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2023-02-15..2023-03-01&type=Issues) | [@Tony-j77](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ATony-j77+updated%3A2023-02-15..2023-03-01&type=Issues) ## 7.0.0a13 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a12...ef67879306b27dfa78b8d639d9cc142b50f8c7ba)) ### Enhancements made - Update to JupyterLab 4.0.0a34 [#6732](https://github.com/jupyter/notebook/pull/6732) ([@jtpio](https://github.com/jtpio)) - Hide the debugger button on mobile [#6731](https://github.com/jupyter/notebook/pull/6731) ([@jtpio](https://github.com/jtpio)) - Adds translator to the NotebookShell [#6725](https://github.com/jupyter/notebook/pull/6725) ([@brichet](https://github.com/brichet)) - Resolving some accessibility issues [#6719](https://github.com/jupyter/notebook/pull/6719) ([@brichet](https://github.com/brichet)) ### Maintenance and upkeep improvements - Fix Playwright snapshot update workflow [#6724](https://github.com/jupyter/notebook/pull/6724) ([@jtpio](https://github.com/jtpio)) - Add workflow to update snapshots [#6723](https://github.com/jupyter/notebook/pull/6723) ([@jtpio](https://github.com/jtpio)) - Use Playwright `webServer` [#6720](https://github.com/jupyter/notebook/pull/6720) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-02-08&to=2023-02-15&type=c)) [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2023-02-08..2023-02-15&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-02-08..2023-02-15&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-02-08..2023-02-15&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2023-02-08..2023-02-15&type=Issues) ## 7.0.0a12 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a11...27c2bfbb80d42a3fd2541b13fae6143e2e91e4dd)) ### Enhancements made - Update to JupyterLab 4.0.0a33 [#6713](https://github.com/jupyter/notebook/pull/6713) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Add more lint checks [#6706](https://github.com/jupyter/notebook/pull/6706) ([@blink1073](https://github.com/blink1073)) - Reintroduce desktop file [#6705](https://github.com/jupyter/notebook/pull/6705) ([@frenzymadness](https://github.com/frenzymadness)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-01-19&to=2023-02-08&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-01-19..2023-02-08&type=Issues) | [@frenzymadness](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afrenzymadness+updated%3A2023-01-19..2023-02-08&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-01-19..2023-02-08&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-01-19..2023-02-08&type=Issues) ## 7.0.0a11 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a10...6d4eeed9d176e2523be7874ae4d9f46a99422d72)) ### Enhancements made - Tree view enhancement [#6588](https://github.com/jupyter/notebook/pull/6588) ([@brichet](https://github.com/brichet)) - Add the Settings Editor to the landing page [#6316](https://github.com/jupyter/notebook/pull/6316) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fix console error when adding a widget to a side panel [#6694](https://github.com/jupyter/notebook/pull/6694) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Help-extension split into multiple plugins [#6700](https://github.com/jupyter/notebook/pull/6700) ([@RRosio](https://github.com/RRosio)) - Add releaser workflows [#6698](https://github.com/jupyter/notebook/pull/6698) ([@blink1073](https://github.com/blink1073)) - Create `auto_author_assign.yml` workflow [#6696](https://github.com/jupyter/notebook/pull/6696) ([@jtpio](https://github.com/jtpio)) - Add back `# type:ignore` [#6695](https://github.com/jupyter/notebook/pull/6695) ([@jtpio](https://github.com/jtpio)) - Fix environment activation on Gitpod [#6693](https://github.com/jupyter/notebook/pull/6693) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2023-01-09&to=2023-01-19&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2023-01-09..2023-01-19&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2023-01-09..2023-01-19&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2023-01-09..2023-01-19&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2023-01-09..2023-01-19&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2023-01-09..2023-01-19&type=Issues) ## 7.0.0a10 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a9...6205bf376f783b7202af71e1074f44086ee7056c)) ### Enhancements made - Update to JupyterLab 4.0.0a32 [#6678](https://github.com/jupyter/notebook/pull/6678) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Bump json5 from 2.2.1 to 2.2.3 in /ui-tests [#6684](https://github.com/jupyter/notebook/pull/6684) ([@dependabot](https://github.com/dependabot)) - Bump json5 from 1.0.1 to 1.0.2 [#6681](https://github.com/jupyter/notebook/pull/6681) ([@dependabot](https://github.com/dependabot)) - Update the copyright date to 2023 in the about dialog [#6679](https://github.com/jupyter/notebook/pull/6679) ([@jtpio](https://github.com/jtpio)) - Fix `check_links` and `Test Lint` CI failures [#6675](https://github.com/jupyter/notebook/pull/6675) ([@jtpio](https://github.com/jtpio)) - Add spelling and docstring enforcement [#6669](https://github.com/jupyter/notebook/pull/6669) ([@blink1073](https://github.com/blink1073)) - CI Cleanup [#6667](https://github.com/jupyter/notebook/pull/6667) ([@blink1073](https://github.com/blink1073)) - Adopt ruff and typing [#6658](https://github.com/jupyter/notebook/pull/6658) ([@blink1073](https://github.com/blink1073)) - Bump decode-uri-component from 0.2.0 to 0.2.2 [#6651](https://github.com/jupyter/notebook/pull/6651) ([@dependabot](https://github.com/dependabot)) - Bump dessant/lock-threads from 3 to 4 [#6650](https://github.com/jupyter/notebook/pull/6650) ([@dependabot](https://github.com/dependabot)) - Update to TypeScript 4.9 [#6640](https://github.com/jupyter/notebook/pull/6640) ([@jtpio](https://github.com/jtpio)) - Add more Python tests [#6639](https://github.com/jupyter/notebook/pull/6639) ([@blink1073](https://github.com/blink1073)) - use main branch for config [#6638](https://github.com/jupyter/notebook/pull/6638) ([@blink1073](https://github.com/blink1073)) - Clean up workflows [#6635](https://github.com/jupyter/notebook/pull/6635) ([@blink1073](https://github.com/blink1073)) - CI Cleanup [#6631](https://github.com/jupyter/notebook/pull/6631) ([@blink1073](https://github.com/blink1073)) - Fix issue template formatting [#6626](https://github.com/jupyter/notebook/pull/6626) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Remove PDF link to Jupyter Notebook docs [#6648](https://github.com/jupyter/notebook/pull/6648) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-11-21&to=2023-01-09&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2022-11-21..2023-01-09&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2022-11-21..2023-01-09&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-11-21..2023-01-09&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-11-21..2023-01-09&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2022-11-21..2023-01-09&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2022-11-21..2023-01-09&type=Issues) | [@yacchin1205](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ayacchin1205+updated%3A2022-11-21..2023-01-09&type=Issues) ## 7.0.0a9 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a8...b4006ce47bf37b31a7049a77971d7e5db1070660)) ### Enhancements made - Update to JupyterLab 4.0.0a31 [#6627](https://github.com/jupyter/notebook/pull/6627) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Explicitly specify favicon for /tree view in Notebook [#6608](https://github.com/jupyter/notebook/pull/6608) ([@mcrutch](https://github.com/mcrutch)) ### Maintenance and upkeep improvements - Add run-p (npm-run-all) to dev dependencies [#6629](https://github.com/jupyter/notebook/pull/6629) ([@gabalafou](https://github.com/gabalafou)) - Moves panel related objects to a dedicated module file [#6625](https://github.com/jupyter/notebook/pull/6625) ([@brichet](https://github.com/brichet)) - Use pathlib instead of os.path.join in `tests/conftest.py` [#6624](https://github.com/jupyter/notebook/pull/6624) ([@kianelbo](https://github.com/kianelbo)) - Bump loader-utils from 1.4.1 to 1.4.2 [#6623](https://github.com/jupyter/notebook/pull/6623) ([@dependabot](https://github.com/dependabot)) - Bump to Python 3.11 on CI [#6600](https://github.com/jupyter/notebook/pull/6600) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-11-11&to=2022-11-21&type=c)) [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2022-11-11..2022-11-21&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2022-11-11..2022-11-21&type=Issues) | [@fcollonval](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afcollonval+updated%3A2022-11-11..2022-11-21&type=Issues) | [@gabalafou](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agabalafou+updated%3A2022-11-11..2022-11-21&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-11-11..2022-11-21&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-11-11..2022-11-21&type=Issues) | [@kianelbo](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akianelbo+updated%3A2022-11-11..2022-11-21&type=Issues) | [@mcrutch](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Amcrutch+updated%3A2022-11-11..2022-11-21&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2022-11-11..2022-11-21&type=Issues) ## 7.0.0a8 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a7...9141f3eabb6a10a5bf742b26713405f9768cb6d2)) ### Enhancements made - Restyle about dialog [#6592](https://github.com/jupyter/notebook/pull/6592) ([@kostyafarber](https://github.com/kostyafarber)) ### Bugs fixed - Fix async contents handling and add test [#6616](https://github.com/jupyter/notebook/pull/6616) ([@blink1073](https://github.com/blink1073)) - Fix PDF renderer [#6584](https://github.com/jupyter/notebook/pull/6584) ([@brichet](https://github.com/brichet)) - Fix HTML viewer [#6583](https://github.com/jupyter/notebook/pull/6583) ([@brichet](https://github.com/brichet)) ### Maintenance and upkeep improvements - Bump loader-utils from 1.4.0 to 1.4.1 [#6615](https://github.com/jupyter/notebook/pull/6615) ([@dependabot](https://github.com/dependabot)) - Bump dessant/lock-threads from 2 to 3 [#6587](https://github.com/jupyter/notebook/pull/6587) ([@dependabot](https://github.com/dependabot)) - Add dependabot config to update GitHub Actions [#6586](https://github.com/jupyter/notebook/pull/6586) ([@jtpio](https://github.com/jtpio)) - Update `actions/checkout` and `actions/download-artifact` [#6585](https://github.com/jupyter/notebook/pull/6585) ([@jtpio](https://github.com/jtpio)) - Maintenance cleanup [#6581](https://github.com/jupyter/notebook/pull/6581) ([@blink1073](https://github.com/blink1073)) - Update to lerna 6 [#6579](https://github.com/jupyter/notebook/pull/6579) ([@jtpio](https://github.com/jtpio)) - Remove the `nbclassic` explicit uninstall on Binder [#6548](https://github.com/jupyter/notebook/pull/6548) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-10-13&to=2022-11-11&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2022-10-13..2022-11-11&type=Issues) | [@bnavigator](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abnavigator+updated%3A2022-10-13..2022-11-11&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2022-10-13..2022-11-11&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2022-10-13..2022-11-11&type=Issues) | [@echarles](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aecharles+updated%3A2022-10-13..2022-11-11&type=Issues) | [@fcollonval](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afcollonval+updated%3A2022-10-13..2022-11-11&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-10-13..2022-11-11&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-10-13..2022-11-11&type=Issues) | [@kostyafarber](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akostyafarber+updated%3A2022-10-13..2022-11-11&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2022-10-13..2022-11-11&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2022-10-13..2022-11-11&type=Issues) | [@venkatasg](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Avenkatasg+updated%3A2022-10-13..2022-11-11&type=Issues) ## 7.0.0a7 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a6...caa0a11e36901c08ae80100fe2bbc5161c47dfee)) ### Enhancements made - Fixed user menu alignment [#6565](https://github.com/jupyter/notebook/pull/6565) ([@Mieju](https://github.com/Mieju)) - Support for Left and Right panels [#6487](https://github.com/jupyter/notebook/pull/6487) ([@brichet](https://github.com/brichet)) ### Maintenance and upkeep improvements - Update to JupyterLab 4.0.0a30 [#6566](https://github.com/jupyter/notebook/pull/6566) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - Fix typo in CHANGELOG.md [#6561](https://github.com/jupyter/notebook/pull/6561) ([@eltociear](https://github.com/eltociear)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-10-03&to=2022-10-13&type=c)) [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2022-10-03..2022-10-13&type=Issues) | [@eltociear](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aeltociear+updated%3A2022-10-03..2022-10-13&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-10-03..2022-10-13&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-10-03..2022-10-13&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2022-10-03..2022-10-13&type=Issues) | [@Mieju](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AMieju+updated%3A2022-10-03..2022-10-13&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2022-10-03..2022-10-13&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2022-10-03..2022-10-13&type=Issues) ## 7.0.0a6 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a5...acbec17feca2ae8a0f56c5ec04ba2475a42619ee)) ### Enhancements made - Add token on tree widget [#6496](https://github.com/jupyter/notebook/pull/6496) ([@brichet](https://github.com/brichet)) - Updates README to document maintained versions [#6480](https://github.com/jupyter/notebook/pull/6480) ([@JasonWeill](https://github.com/JasonWeill)) - Change the tab renderer to allow adding closable tab [#6477](https://github.com/jupyter/notebook/pull/6477) ([@brichet](https://github.com/brichet)) ### Bugs fixed - Fix: No mouse pointer when hovering on the Jupyter icon [#6550](https://github.com/jupyter/notebook/pull/6550) ([@hawkeyes21](https://github.com/hawkeyes21)) ### Maintenance and upkeep improvements - Switch to hatch for python version [#6544](https://github.com/jupyter/notebook/pull/6544) ([@blink1073](https://github.com/blink1073)) - Update to Lumino 2 and JupyterLab 4.0.0a29 [#6539](https://github.com/jupyter/notebook/pull/6539) ([@afshin](https://github.com/afshin)) - Update lerna version [#6535](https://github.com/jupyter/notebook/pull/6535) ([@blink1073](https://github.com/blink1073)) - Add task to auto activate the dev environment on Gitpod [#6527](https://github.com/jupyter/notebook/pull/6527) ([@jtpio](https://github.com/jtpio)) - Troubleshoot failing `macos` check on CI [#6523](https://github.com/jupyter/notebook/pull/6523) ([@jtpio](https://github.com/jtpio)) - Update reference snapshots [#6520](https://github.com/jupyter/notebook/pull/6520) ([@jtpio](https://github.com/jtpio)) - Add Gitpod files [#6518](https://github.com/jupyter/notebook/pull/6518) ([@jtpio](https://github.com/jtpio)) - Adding jupyterlab-probot yml file for labeling new issues [#6506](https://github.com/jupyter/notebook/pull/6506) ([@RRosio](https://github.com/RRosio)) - Uninstall `nbclassic` on Binder so Notebook v7 can load [#6505](https://github.com/jupyter/notebook/pull/6505) ([@jtpio](https://github.com/jtpio)) - Pin `ypy-websocket` to `0.2` [#6499](https://github.com/jupyter/notebook/pull/6499) ([@jtpio](https://github.com/jtpio)) - Bump moment from 2.29.3 to 2.29.4 [#6483](https://github.com/jupyter/notebook/pull/6483) ([@dependabot](https://github.com/dependabot)) - Bump moment from 2.29.2 to 2.29.4 in /ui-tests [#6482](https://github.com/jupyter/notebook/pull/6482) ([@dependabot](https://github.com/dependabot)) - Bump terser from 5.13.1 to 5.14.2 [#6481](https://github.com/jupyter/notebook/pull/6481) ([@dependabot](https://github.com/dependabot)) - Bump parse-url from 6.0.0 to 6.0.2 [#6465](https://github.com/jupyter/notebook/pull/6465) ([@dependabot](https://github.com/dependabot)) - Fix tests [#6464](https://github.com/jupyter/notebook/pull/6464) ([@jtpio](https://github.com/jtpio)) - Bump jpeg-js from 0.4.3 to 0.4.4 in /ui-tests [#6455](https://github.com/jupyter/notebook/pull/6455) ([@dependabot](https://github.com/dependabot)) ### Documentation improvements - Updates README to document maintained versions [#6480](https://github.com/jupyter/notebook/pull/6480) ([@JasonWeill](https://github.com/JasonWeill)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-06-14&to=2022-10-03&type=c)) [@afshin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aafshin+updated%3A2022-06-14..2022-10-03&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2022-06-14..2022-10-03&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abrichet+updated%3A2022-06-14..2022-10-03&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2022-06-14..2022-10-03&type=Issues) | [@echarles](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aecharles+updated%3A2022-06-14..2022-10-03&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-06-14..2022-10-03&type=Issues) | [@hawkeyes21](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ahawkeyes21+updated%3A2022-06-14..2022-10-03&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-06-14..2022-10-03&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJasonWeill+updated%3A2022-06-14..2022-10-03&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2022-06-14..2022-10-03&type=Issues) | [@RRosio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ARRosio+updated%3A2022-06-14..2022-10-03&type=Issues) ## 7.0.0a5 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a4...614e4780b88f5cf5e2bfda39a55357a0be5ef161)) ### Enhancements made - Add shadow to cells [#6433](https://github.com/jupyter/notebook/pull/6433) ([@trungleduc](https://github.com/trungleduc)) ### Maintenance and upkeep improvements - Fix docs build [#6447](https://github.com/jupyter/notebook/pull/6447) ([@jtpio](https://github.com/jtpio)) - \[pre-commit.ci\] pre-commit autoupdate [#6444](https://github.com/jupyter/notebook/pull/6444) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - \[pre-commit.ci\] pre-commit autoupdate [#6439](https://github.com/jupyter/notebook/pull/6439) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - \[pre-commit.ci\] pre-commit autoupdate [#6434](https://github.com/jupyter/notebook/pull/6434) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Use hatch backend [#6425](https://github.com/jupyter/notebook/pull/6425) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-05-20&to=2022-06-14&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2022-05-20..2022-06-14&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-05-20..2022-06-14&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-05-20..2022-06-14&type=Issues) | [@ofek](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aofek+updated%3A2022-05-20..2022-06-14&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2022-05-20..2022-06-14&type=Issues) | [@trungleduc](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atrungleduc+updated%3A2022-05-20..2022-06-14&type=Issues) ## 7.0.0a4 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a3...4bfaaac148a25ba76fcc7416e3a7b2c714b36fcd)) ### Enhancements made - Update to JupyterLab 4.0.0a25 [#6429](https://github.com/jupyter/notebook/pull/6429) ([@jtpio](https://github.com/jtpio)) - Add cell toolbar extension [#6418](https://github.com/jupyter/notebook/pull/6418) ([@jtpio](https://github.com/jtpio)) - add the show header command to the command palette [#6415](https://github.com/jupyter/notebook/pull/6415) ([@jeewonkoo](https://github.com/jeewonkoo)) - Remove the "Appearance" menu entry [#6412](https://github.com/jupyter/notebook/pull/6412) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - \[pre-commit.ci\] pre-commit autoupdate [#6426](https://github.com/jupyter/notebook/pull/6426) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Allow bot PRs to be automatically labeled [#6414](https://github.com/jupyter/notebook/pull/6414) ([@blink1073](https://github.com/blink1073)) - Add Visual Regression Test for the export submenu [#6383](https://github.com/jupyter/notebook/pull/6383) ([@jtpio](https://github.com/jtpio)) - Fix ESLint config for tests [#6382](https://github.com/jupyter/notebook/pull/6382) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-04-27&to=2022-05-20&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2022-04-27..2022-05-20&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-04-27..2022-05-20&type=Issues) | [@jeewonkoo](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajeewonkoo+updated%3A2022-04-27..2022-05-20&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-04-27..2022-05-20&type=Issues) | [@ofek](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aofek+updated%3A2022-04-27..2022-05-20&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2022-04-27..2022-05-20&type=Issues) ## 7.0.0a3 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a2...4076882c0e08875dd719945835f8cbe5b10eac9e)) ### Enhancements made - Show file checkboxes by default in the file browser [#6377](https://github.com/jupyter/notebook/pull/6377) ([@jtpio](https://github.com/jtpio)) - Remove blank space at the bottom of the notebook [#6376](https://github.com/jupyter/notebook/pull/6376) ([@jtpio](https://github.com/jtpio)) - Add a label to the upload button [#6374](https://github.com/jupyter/notebook/pull/6374) ([@jtpio](https://github.com/jtpio)) - Update to JupyterLab 4.0.0a24 [#6371](https://github.com/jupyter/notebook/pull/6371) ([@jtpio](https://github.com/jtpio)) - Initialize handler page_config from Server traitlets [#6366](https://github.com/jupyter/notebook/pull/6366) ([@bollwyvl](https://github.com/bollwyvl)) - Add project URLs to setup.cfg [#6346](https://github.com/jupyter/notebook/pull/6346) ([@tlinhart](https://github.com/tlinhart)) - Update to JupyterLab 4.0.0a23 [#6336](https://github.com/jupyter/notebook/pull/6336) ([@jtpio](https://github.com/jtpio)) ### Bugs fixed - Fix opening JupyterLab from Notebook [#6379](https://github.com/jupyter/notebook/pull/6379) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Add UI tests for a simple notebook [#6380](https://github.com/jupyter/notebook/pull/6380) ([@jtpio](https://github.com/jtpio)) - Bump async from 2.6.3 to 2.6.4 in /ui-tests [#6370](https://github.com/jupyter/notebook/pull/6370) ([@dependabot](https://github.com/dependabot)) - Fix build workflow on CI [#6369](https://github.com/jupyter/notebook/pull/6369) ([@jtpio](https://github.com/jtpio)) - \[pre-commit.ci\] pre-commit autoupdate [#6365](https://github.com/jupyter/notebook/pull/6365) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - \[pre-commit.ci\] pre-commit autoupdate [#6355](https://github.com/jupyter/notebook/pull/6355) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Bump moment from 2.29.1 to 2.29.2 [#6352](https://github.com/jupyter/notebook/pull/6352) ([@dependabot](https://github.com/dependabot)) - Bump moment from 2.29.1 to 2.29.2 in /ui-tests [#6351](https://github.com/jupyter/notebook/pull/6351) ([@dependabot](https://github.com/dependabot)) - Clean up pre-commit [#6349](https://github.com/jupyter/notebook/pull/6349) ([@blink1073](https://github.com/blink1073)) - Update to TypeScript 4.6 [#6345](https://github.com/jupyter/notebook/pull/6345) ([@jtpio](https://github.com/jtpio)) - \[pre-commit.ci\] pre-commit autoupdate [#6343](https://github.com/jupyter/notebook/pull/6343) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Add pytest and handle warnings [#6338](https://github.com/jupyter/notebook/pull/6338) ([@blink1073](https://github.com/blink1073)) - Add flake8 and git-blame-ignore-revs [#6337](https://github.com/jupyter/notebook/pull/6337) ([@blink1073](https://github.com/blink1073)) - Run Autoformatters [#6335](https://github.com/jupyter/notebook/pull/6335) ([@blink1073](https://github.com/blink1073)) - Bump minimist from 1.2.5 to 1.2.6 [#6334](https://github.com/jupyter/notebook/pull/6334) ([@dependabot](https://github.com/dependabot)) - Bump minimist from 1.2.5 to 1.2.6 in /ui-tests [#6333](https://github.com/jupyter/notebook/pull/6333) ([@dependabot](https://github.com/dependabot)) - Bump ansi-regex from 3.0.0 to 3.0.1 in /ui-tests [#6332](https://github.com/jupyter/notebook/pull/6332) ([@dependabot](https://github.com/dependabot)) - Adopt pre-commit [#6331](https://github.com/jupyter/notebook/pull/6331) ([@blink1073](https://github.com/blink1073)) ### Documentation improvements - Link to v6 plan in the README [#6375](https://github.com/jupyter/notebook/pull/6375) ([@echarles](https://github.com/echarles)) - Copy edits in config, edits bug report template [#6364](https://github.com/jupyter/notebook/pull/6364) ([@JasonWeill](https://github.com/JasonWeill)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-03-21&to=2022-04-27&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2022-03-21..2022-04-27&type=Issues) | [@bollwyvl](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abollwyvl+updated%3A2022-03-21..2022-04-27&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2022-03-21..2022-04-27&type=Issues) | [@echarles](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aecharles+updated%3A2022-03-21..2022-04-27&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-03-21..2022-04-27&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-03-21..2022-04-27&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJasonWeill+updated%3A2022-03-21..2022-04-27&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apre-commit-ci+updated%3A2022-03-21..2022-04-27&type=Issues) | [@tlinhart](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atlinhart+updated%3A2022-03-21..2022-04-27&type=Issues) ## 7.0.0a2 ([Full Changelog](https://github.com/jupyter/notebook/compare/v7.0.0a1...9be03f5f27232d50b16dbbaa50a222260166694c)) ### Enhancements made - Add support for opening a document with a different factory [#6315](https://github.com/jupyter/notebook/pull/6315) ([@jtpio](https://github.com/jtpio)) - Minor copy edit in README [#6313](https://github.com/jupyter/notebook/pull/6313) ([@JasonWeill](https://github.com/JasonWeill)) ### Bugs fixed - Fix rendering of markdown [#6318](https://github.com/jupyter/notebook/pull/6318) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Update to JupyterLab 4.0.0a22 [#6314](https://github.com/jupyter/notebook/pull/6314) ([@jtpio](https://github.com/jtpio)) ### Documentation improvements - docs: fix spelling [#6317](https://github.com/jupyter/notebook/pull/6317) ([@dijonkitchen](https://github.com/dijonkitchen)) - Minor copy edit in README [#6313](https://github.com/jupyter/notebook/pull/6313) ([@JasonWeill](https://github.com/JasonWeill)) - Update example notebook on Binder [#6306](https://github.com/jupyter/notebook/pull/6306) ([@jtpio](https://github.com/jtpio)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-03-09&to=2022-03-21&type=c)) [@dijonkitchen](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adijonkitchen+updated%3A2022-03-09..2022-03-21&type=Issues) | [@fcollonval](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afcollonval+updated%3A2022-03-09..2022-03-21&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-03-09..2022-03-21&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-03-09..2022-03-21&type=Issues) | [@JasonWeill](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJasonWeill+updated%3A2022-03-09..2022-03-21&type=Issues) ## 7.0.0a1 ([Full Changelog](https://github.com/jupyter/notebook/compare/v6.4.8...22fe46f3e806aa346625f6ef2f2a024d030a068d)) ### Enhancements made - Notebook v7 scaffolding [#6294](https://github.com/jupyter/notebook/pull/6294) ([@jtpio](https://github.com/jtpio)) ### Maintenance and upkeep improvements - Clean up CI [#6304](https://github.com/jupyter/notebook/pull/6304) ([@blink1073](https://github.com/blink1073)) - Remove the custom run keyboard shortcut [#6303](https://github.com/jupyter/notebook/pull/6303) ([@jtpio](https://github.com/jtpio)) - Bump nanoid from 3.1.30 to 3.3.1 in /ui-tests [#6302](https://github.com/jupyter/notebook/pull/6302) ([@dependabot](https://github.com/dependabot)) - Bump simple-get from 3.1.0 to 3.1.1 in /ui-tests [#6301](https://github.com/jupyter/notebook/pull/6301) ([@dependabot](https://github.com/dependabot)) - Bump url-parse from 1.5.4 to 1.5.10 in /ui-tests [#6300](https://github.com/jupyter/notebook/pull/6300) ([@dependabot](https://github.com/dependabot)) - Bump node-fetch from 2.6.6 to 2.6.7 in /ui-tests [#6299](https://github.com/jupyter/notebook/pull/6299) ([@dependabot](https://github.com/dependabot)) - Bump follow-redirects from 1.14.5 to 1.14.9 in /ui-tests [#6298](https://github.com/jupyter/notebook/pull/6298) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-01-25&to=2022-03-09&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2022-01-25..2022-03-09&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adependabot+updated%3A2022-01-25..2022-03-09&type=Issues) | [@github-actions](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agithub-actions+updated%3A2022-01-25..2022-03-09&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2022-01-25..2022-03-09&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2022-01-25..2022-03-09&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2022-01-25..2022-03-09&type=Issues) ## 6.4.8 ([Full Changelog](https://github.com/jupyter/notebook/compare/v6.4.7...479902d83a691253e0cff8439a33577e82408317)) ### Bugs fixed - Fix to remove potential memory leak on Jupyter Notebooks ZMQChannelHandler code [#6251](https://github.com/jupyter/notebook/pull/6251) ([@Vishwajeet0510](https://github.com/Vishwajeet0510)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2022-01-12&to=2022-01-25&type=c)) [@Vishwajeet0510](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AVishwajeet0510+updated%3A2022-01-12..2022-01-25&type=Issues) ## 6.4.7 ([Full Changelog](https://github.com/jupyter/notebook/compare/v6.4.6...b77b5e38b8fa1a20150d7fa4d735dbf1c4f00418)) ### Bugs fixed - Fix Chinese punctuation [#6268](https://github.com/jupyter/notebook/pull/6268) ([@LiHua-Official](https://github.com/LiHua-Official)) - Add date field to kernel message header [#6265](https://github.com/jupyter/notebook/pull/6265) ([@kevin-bates](https://github.com/kevin-bates)) - Fix deprecation warning [#6253](https://github.com/jupyter/notebook/pull/6253) ([@tornaria](https://github.com/tornaria)) ### Maintenance and upkeep improvements - Enforce labels on PRs [#6235](https://github.com/jupyter/notebook/pull/6235) ([@blink1073](https://github.com/blink1073)) - Fix: CI error for python 3.6 & macOS [#6215](https://github.com/jupyter/notebook/pull/6215) ([@penguinolog](https://github.com/penguinolog)) ### Other merged PRs - handle KeyError when get session [#6245](https://github.com/jupyter/notebook/pull/6245) ([@ccw630](https://github.com/ccw630)) - Updated doc for passwd [#6209](https://github.com/jupyter/notebook/pull/6209) ([@antoinecarme](https://github.com/antoinecarme)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2021-11-16&to=2022-01-12&type=c)) [@antoinecarme](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aantoinecarme+updated%3A2021-11-16..2022-01-12&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2021-11-16..2022-01-12&type=Issues) | [@ccw630](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Accw630+updated%3A2021-11-16..2022-01-12&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2021-11-16..2022-01-12&type=Issues) | [@LiHua-Official](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ALiHua-Official+updated%3A2021-11-16..2022-01-12&type=Issues) | [@penguinolog](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Apenguinolog+updated%3A2021-11-16..2022-01-12&type=Issues) | [@tornaria](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atornaria+updated%3A2021-11-16..2022-01-12&type=Issues) ## 6.4.6 ([Full Changelog](https://github.com/jupyter/notebook/compare/v6.4.5...160c27d3c23dafe8b42240571db21b0d5cbae2fe)) ### Bugs fixed - Fix `asyncio` error when opening notebooks [#6221](https://github.com/jupyter/notebook/pull/6221) ([@dleen](https://github.com/dleen)) - Change to use a universal Chinese translation on certain words [#6218](https://github.com/jupyter/notebook/pull/6218) ([@jackexu](https://github.com/jackexu)) - Fix Chinese translation typo [#6211](https://github.com/jupyter/notebook/pull/6211) ([@maliubiao](https://github.com/maliubiao) - Fix `send2trash` tests failing on Windows [#6127](https://github.com/jupyter/notebook/pull/6127) ([@dolfinus](https://github.com/dolfinus)) ### Maintenance and upkeep improvements - TST: don't look in user site for serverextensions [#6233](https://github.com/jupyter/notebook/pull/6233) ([@bnavigator](https://github.com/bnavigator)) - Enable terminal tests as `pywinpty` is ported for python 3.9 [#6228](https://github.com/jupyter/notebook/pull/6228) (`@nsait-linaro`) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2021-10-19&to=2021-11-16&type=c)) [@bnavigator](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abnavigator+updated%3A2021-10-19..2021-11-16&type=Issues) | [@dleen](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adleen+updated%3A2021-10-19..2021-11-16&type=Issues) | [@dolfinus](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adolfinus+updated%3A2021-10-19..2021-11-16&type=Issues) | [@jackexu](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajackexu+updated%3A2021-10-19..2021-11-16&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2021-10-19..2021-11-16&type=Issues) | [@maliubiao](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Amaliubiao+updated%3A2021-10-19..2021-11-16&type=Issues) | `@nsait-linaro` | [@takluyver](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atakluyver+updated%3A2021-10-19..2021-11-16&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2021-10-19..2021-11-16&type=Issues) ## 6.4.5 ([Full Changelog](https://github.com/jupyter/notebook/compare/v6.4.4...ccd9665571107e02a325a738b8baebd6532b2d3d)) ### Bug fixes - Recover from failure to render mimetype [#6181](https://github.com/jupyter/notebook/pull/6181) ([@martinRenou](https://github.com/martinRenou)) ### Maintenance and upkeep improvements - Fix crypto handling [#6197](https://github.com/jupyter/notebook/pull/6197) ([@blink1073](https://github.com/blink1073)) - Fix `jupyter_client` warning [#6178](https://github.com/jupyter/notebook/pull/6178) ([@martinRenou](https://github.com/martinRenou)) ### Documentation improvements - Fix nbsphinx settings [#6200](https://github.com/jupyter/notebook/pull/6200) ([@mgeier](https://github.com/mgeier)) - Fully revert the pinning of `nbsphinx` to 0.8.6 [#6201](https://github.com/jupyter/notebook/pull/6201) ([@kevin-bates](https://github.com/kevin-bates)) - Pin `nbsphinx` to 0.8.6, clean up orphaned resources [#6194](https://github.com/jupyter/notebook/pull/6194) ([@kevin-bates](https://github.com/kevin-bates)) - Fix typo in docstring [#6188](https://github.com/jupyter/notebook/pull/6188) ([@jgarte](https://github.com/jgarte)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2021-09-03&to=2021-10-19&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2021-09-03..2021-10-19&type=Issues) | [@jgarte](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajgarte+updated%3A2021-09-03..2021-10-19&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2021-09-03..2021-10-19&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AmartinRenou+updated%3A2021-09-03..2021-10-19&type=Issues) | [@mgeier](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Amgeier+updated%3A2021-09-03..2021-10-19&type=Issues) ## 6.4.4 ([Full Changelog](https://github.com/jupyter/notebook/compare/v6.4.3...c06c340574e1d2207940c5bd1190eb73d82ab945)) ### Documentation improvements - Update Manual Release Instructions [#6152](https://github.com/jupyter/notebook/pull/6152) ([@blink1073](https://github.com/blink1073)) ### Other merged PRs - Use default JupyterLab CSS sanitizer options for Markdown [#6160](https://github.com/jupyter/notebook/pull/6160) ([@krassowski](https://github.com/krassowski)) - Fix syntax highlight [#6128](https://github.com/jupyter/notebook/pull/6128) ([@massongit](https://github.com/massongit)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2021-08-11&to=2021-09-03&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2021-08-11..2021-09-03&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2021-08-11..2021-09-03&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akrassowski+updated%3A2021-08-11..2021-09-03&type=Issues) | [@massongit](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Amassongit+updated%3A2021-08-11..2021-09-03&type=Issues) | [@minrk](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aminrk+updated%3A2021-08-11..2021-09-03&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2021-08-11..2021-09-03&type=Issues) ## 6.4.3 ([Full Changelog](https://github.com/jupyter/notebook/compare/v6.4.2...c373bd89adaaddffbb71747ebbcfe8a749cae0a8)) ### Bugs fixed - Add @babel/core dependency [#6133](https://github.com/jupyter/notebook/pull/6133) ([@afshin](https://github.com/afshin)) - Switch webpack to production mode [#6131](https://github.com/jupyter/notebook/pull/6131) ([@afshin](https://github.com/afshin)) ### Maintenance and upkeep improvements - Clean up link checking [#6130](https://github.com/jupyter/notebook/pull/6130) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2021-08-06&to=2021-08-10&type=c)) [@afshin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aafshin+updated%3A2021-08-06..2021-08-10&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2021-08-06..2021-08-10&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2021-08-06..2021-08-10&type=Issues) ## 6.4.2 ([Full Changelog](https://github.com/jupyter/notebook/compare/v6.4.0...999e8322bcd24e0ed62b180c19ec13db3f48165b)) ### Bugs fixed - Add missing file to manifest [#6122](https://github.com/jupyter/notebook/pull/6122) ([@afshin](https://github.com/afshin)) - Fix issue #3218 [#6108](https://github.com/jupyter/notebook/pull/6108) ([@Nazeeh21](https://github.com/Nazeeh21)) - Fix version of jupyter-packaging in pyproject.toml [#6101](https://github.com/jupyter/notebook/pull/6101) ([@frenzymadness](https://github.com/frenzymadness)) - "#element".tooltip is not a function on home page fixed. [#6070](https://github.com/jupyter/notebook/pull/6070) @ilayh123 ### Maintenance and upkeep improvements - Enhancements to the desktop entry [#6099](https://github.com/jupyter/notebook/pull/6099) ([@Amr-Ibra](https://github.com/Amr-Ibra)) - Add missing spaces to help messages in config file [#6085](https://github.com/jupyter/notebook/pull/6085) ([@saiwing-yeung](https://github.com/saiwing-yeung)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2021-05-17&to=2021-08-06&type=c)) [@afshin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aafshin+updated%3A2021-05-17..2021-08-06&type=Issues) | [@Amr-Ibra](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AAmr-Ibra+updated%3A2021-05-17..2021-08-06&type=Issues) | [@frenzymadness](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afrenzymadness+updated%3A2021-05-17..2021-08-06&type=Issues) | [@ilayh123](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ailayh123+updated%3A2021-05-17..2021-08-06&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2021-05-17..2021-08-06&type=Issues) | [@Nazeeh21](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ANazeeh21+updated%3A2021-05-17..2021-08-06&type=Issues) | [@saiwing-yeung](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Asaiwing-yeung+updated%3A2021-05-17..2021-08-06&type=Issues) ## 6.4.0 ([Full Changelog](https://github.com/jupyter/notebook/compare/6.3.0...80eb286f316838afc76a9a84b06f54e7dccb6c86)) ### Bugs fixed - Fix Handling of Encoded Paths in Save As Dialog [#6030](https://github.com/jupyter/notebook/pull/6030) ([@afshin](https://github.com/afshin)) - Fix: split_cell doesn't always split cell [#6017](https://github.com/jupyter/notebook/pull/6017) ([@gamestrRUS](https://github.com/gamestrRUS)) - Correct 'Content-Type' headers [#6026](https://github.com/jupyter/notebook/pull/6026) ([@faucct](https://github.com/faucct)) - Fix skipped tests & remove deprecation warnings [#6018](https://github.com/jupyter/notebook/pull/6018) ([@befeleme](https://github.com/befeleme)) - \[Gateway\] Track only this server's kernels [#5980](https://github.com/jupyter/notebook/pull/5980) ([@kevin-bates](https://github.com/kevin-bates)) - Bind the HTTPServer in start [#6061](https://github.com/jupyter/notebook/pull/6061) ### Maintenance and upkeep improvements - Revert "do not apply asyncio patch for tornado >=6.1" [#6052](https://github.com/jupyter/notebook/pull/6052) ([@minrk](https://github.com/minrk)) - Use Jupyter Releaser [#6048](https://github.com/jupyter/notebook/pull/6048) ([@afshin](https://github.com/afshin)) - Add Workflow Permissions for Lock Bot [#6042](https://github.com/jupyter/notebook/pull/6042) ([@jtpio](https://github.com/jtpio)) - Fixes related to the recent changes in the documentation [#6021](https://github.com/jupyter/notebook/pull/6021) ([@frenzymadness](https://github.com/frenzymadness)) - Add maths checks in CSS reference test [#6035](https://github.com/jupyter/notebook/pull/6035) ([@stef4k](https://github.com/stef4k)) - Add Issue Lock and Answered Bots [#6019](https://github.com/jupyter/notebook/pull/6019) ([@afshin](https://github.com/afshin)) ### Documentation improvements - Spelling correction [#6045](https://github.com/jupyter/notebook/pull/6045) ([@wggillen](https://github.com/wggillen)) - Minor typographical and comment changes [#6025](https://github.com/jupyter/notebook/pull/6025) ([@misterhay](https://github.com/misterhay)) - Fixes related to the recent changes in the documentation [#6021](https://github.com/jupyter/notebook/pull/6021) ([@frenzymadness](https://github.com/frenzymadness)) - Fix readthedocs environment [#6020](https://github.com/jupyter/notebook/pull/6020) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2021-03-22&to=2021-05-12&type=c)) [@afshin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aafshin+updated%3A2021-03-22..2021-05-12&type=Issues) | [@befeleme](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abefeleme+updated%3A2021-03-22..2021-05-12&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2021-03-22..2021-05-12&type=Issues) | [@faucct](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afaucct+updated%3A2021-03-22..2021-05-12&type=Issues) | [@frenzymadness](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afrenzymadness+updated%3A2021-03-22..2021-05-12&type=Issues) | [@gamestrRUS](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AgamestrRUS+updated%3A2021-03-22..2021-05-12&type=Issues) | [@jtpio](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajtpio+updated%3A2021-03-22..2021-05-12&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2021-03-22..2021-05-12&type=Issues) | [@minrk](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aminrk+updated%3A2021-03-22..2021-05-12&type=Issues) | [@misterhay](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Amisterhay+updated%3A2021-03-22..2021-05-12&type=Issues) | [@stef4k](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Astef4k+updated%3A2021-03-22..2021-05-12&type=Issues) | [@wggillen](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Awggillen+updated%3A2021-03-22..2021-05-12&type=Issues) ## 6.3.0 ### Merged PRs - Add square logo and desktop entry files [#6010](https://github.com/jupyter/notebook/pull/6010) ([@befeleme](https://github.com/befeleme)) - Modernize Changelog [#6008](https://github.com/jupyter/notebook/pull/6008) ([@afshin](https://github.com/afshin)) - Add missing "import inspect" [#5999](https://github.com/jupyter/notebook/pull/5999) ([@mgeier](https://github.com/mgeier)) - Add Codecov badge to README [#5989](https://github.com/jupyter/notebook/pull/5989) ([@thomasrockhu](https://github.com/thomasrockhu)) - Remove configuration for nosetests from setup.cfg [#5986](https://github.com/jupyter/notebook/pull/5986) ([@frenzymadness](https://github.com/frenzymadness)) - Update security.rst [#5978](https://github.com/jupyter/notebook/pull/5978) ([@dlrice](https://github.com/dlrice)) - Docs-Translations: Updated Hindi and Chinese Readme.md [#5976](https://github.com/jupyter/notebook/pull/5976) ([@rjn01](https://github.com/rjn01)) - Allow /metrics by default if auth is off [#5974](https://github.com/jupyter/notebook/pull/5974) ([@blairdrummond](https://github.com/blairdrummond)) - Skip terminal tests on Windows 3.9+ (temporary) [#5968](https://github.com/jupyter/notebook/pull/5968) ([@kevin-bates](https://github.com/kevin-bates)) - Update GatewayKernelManager to derive from AsyncMappingKernelManager [#5966](https://github.com/jupyter/notebook/pull/5966) ([@kevin-bates](https://github.com/kevin-bates)) - Drop use of deprecated pyzmq.ioloop [#5965](https://github.com/jupyter/notebook/pull/5965) ([@kevin-bates](https://github.com/kevin-bates)) - Drop support for Python 3.5 [#5962](https://github.com/jupyter/notebook/pull/5962) ([@kevin-bates](https://github.com/kevin-bates)) - Allow jupyter_server-based contents managers in notebook [#5957](https://github.com/jupyter/notebook/pull/5957) ([@afshin](https://github.com/afshin)) - Russian translation fixes [#5954](https://github.com/jupyter/notebook/pull/5954) ([@insolor](https://github.com/insolor)) - Increase culling test idle timeout [#5952](https://github.com/jupyter/notebook/pull/5952) ([@kevin-bates](https://github.com/kevin-bates)) - Re-enable support for answer_yes flag [#5941](https://github.com/jupyter/notebook/pull/5941) ([@afshin](https://github.com/afshin)) - Replace Travis and Appveyor with Github Actions [#5938](https://github.com/jupyter/notebook/pull/5938) ([@kevin-bates](https://github.com/kevin-bates)) - DOC: Server extension, extra docs on configuration/authentication. [#5937](https://github.com/jupyter/notebook/pull/5937) ([@Carreau](https://github.com/Carreau)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/notebook/graphs/contributors?from=2021-01-13&to=2021-03-18&type=c)) [@abielhammonds](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aabielhammonds+updated%3A2021-01-13..2021-03-18&type=Issues) | [@afshin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aafshin+updated%3A2021-01-13..2021-03-18&type=Issues) | [@ajharry](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aajharry+updated%3A2021-01-13..2021-03-18&type=Issues) | [@Alokrar](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AAlokrar+updated%3A2021-01-13..2021-03-18&type=Issues) | [@befeleme](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abefeleme+updated%3A2021-01-13..2021-03-18&type=Issues) | [@blairdrummond](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablairdrummond+updated%3A2021-01-13..2021-03-18&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ablink1073+updated%3A2021-01-13..2021-03-18&type=Issues) | [@bollwyvl](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Abollwyvl+updated%3A2021-01-13..2021-03-18&type=Issues) | [@Carreau](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ACarreau+updated%3A2021-01-13..2021-03-18&type=Issues) | [@ChenChenDS](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AChenChenDS+updated%3A2021-01-13..2021-03-18&type=Issues) | [@cosmoscalibur](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Acosmoscalibur+updated%3A2021-01-13..2021-03-18&type=Issues) | [@dlrice](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adlrice+updated%3A2021-01-13..2021-03-18&type=Issues) | [@dwanneruchi](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Adwanneruchi+updated%3A2021-01-13..2021-03-18&type=Issues) | [@ElisonSherton](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AElisonSherton+updated%3A2021-01-13..2021-03-18&type=Issues) | [@FazeelUsmani](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AFazeelUsmani+updated%3A2021-01-13..2021-03-18&type=Issues) | [@frenzymadness](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Afrenzymadness+updated%3A2021-01-13..2021-03-18&type=Issues) | [@goerz](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Agoerz+updated%3A2021-01-13..2021-03-18&type=Issues) | [@insolor](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ainsolor+updated%3A2021-01-13..2021-03-18&type=Issues) | [@jasongrout](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ajasongrout+updated%3A2021-01-13..2021-03-18&type=Issues) | [@JianghuiDu](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJianghuiDu+updated%3A2021-01-13..2021-03-18&type=Issues) | [@JuzerShakir](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AJuzerShakir+updated%3A2021-01-13..2021-03-18&type=Issues) | [@kevin-bates](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Akevin-bates+updated%3A2021-01-13..2021-03-18&type=Issues) | [@Khalilsqu](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AKhalilsqu+updated%3A2021-01-13..2021-03-18&type=Issues) | [@meeseeksdev](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ameeseeksdev+updated%3A2021-01-13..2021-03-18&type=Issues) | [@mgeier](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Amgeier+updated%3A2021-01-13..2021-03-18&type=Issues) | [@michaelpedota](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Amichaelpedota+updated%3A2021-01-13..2021-03-18&type=Issues) | [@mjbright](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Amjbright+updated%3A2021-01-13..2021-03-18&type=Issues) | [@MSeal](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AMSeal+updated%3A2021-01-13..2021-03-18&type=Issues) | [@ncoughlin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ancoughlin+updated%3A2021-01-13..2021-03-18&type=Issues) | [@NTimmons](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3ANTimmons+updated%3A2021-01-13..2021-03-18&type=Issues) | [@ProsperousHeart](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AProsperousHeart+updated%3A2021-01-13..2021-03-18&type=Issues) | [@rjn01](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Arjn01+updated%3A2021-01-13..2021-03-18&type=Issues) | [@slw07g](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Aslw07g+updated%3A2021-01-13..2021-03-18&type=Issues) | [@stenivan](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Astenivan+updated%3A2021-01-13..2021-03-18&type=Issues) | [@takluyver](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Atakluyver+updated%3A2021-01-13..2021-03-18&type=Issues) | [@thomasrockhu](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Athomasrockhu+updated%3A2021-01-13..2021-03-18&type=Issues) | [@wgilpin](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Awgilpin+updated%3A2021-01-13..2021-03-18&type=Issues) | [@wxtt522](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Awxtt522+updated%3A2021-01-13..2021-03-18&type=Issues) | [@yuvipanda](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3Ayuvipanda+updated%3A2021-01-13..2021-03-18&type=Issues) | [@Zsailer](https://github.com/search?q=repo%3Ajupyter%2Fnotebook+involves%3AZsailer+updated%3A2021-01-13..2021-03-18&type=Issues) ## 6.2.0 ## Merged PRs - Increase minimum tornado version ([5933](https://github.com/jupyter/notebook/pull/5933)) - Adjust skip decorators to avoid remaining dependency on nose ([5932](https://github.com/jupyter/notebook/pull/5932)) - Ensure that cell ids persist after save ([5928](https://github.com/jupyter/notebook/pull/5928)) - Add reconnection to Gateway (form nb2kg) ([5924](https://github.com/jupyter/notebook/pull/5924)) - Fix some typos ([5917](https://github.com/jupyter/notebook/pull/5917)) - Handle TrashPermissionError, now that it exist ([5894](https://github.com/jupyter/notebook/pull/5894)) Thank you to all the contributors: - @kevin-bates - @mishaschwartz - @oyvsyo - @user202729 - @stefanor ## 6.1.6 ## Merged PRs - do not require nose for testing ([5826](https://github.com/jupyter/notebook/pull/5826)) - \[docs\] Update Chinese and Hindi readme.md ([5823](https://github.com/jupyter/notebook/pull/5823)) - Add support for creating terminals via GET ([5813](https://github.com/jupyter/notebook/pull/5813)) - Made doc translations in Hindi and Chinese ([5787](https://github.com/jupyter/notebook/pull/5787)) Thank you to all the contributors: - @pgajdos - @rjn01 - @kevin-bates - @virejdasani ## 6.1.5 6.1.5 is a security release, fixing one vulnerability: - Fix open redirect vulnerability GHSA-c7vm-f5p4-8fqh (CVE to be assigned) ## 6.1.4 - Fix broken links to jupyter documentation ([5686](https://github.com/jupyter/notebook/pull/5686)) - Add additional entries to troubleshooting section ([5695](https://github.com/jupyter/notebook/pull/5695)) - Revert change in page alignment ([5703](https://github.com/jupyter/notebook/pull/5703)) - Bug fix: remove double encoding in download files ([5720](https://github.com/jupyter/notebook/pull/5720)) - Fix typo for Check in zh_CN ([5730](https://github.com/jupyter/notebook/pull/5730)) - Require a file name in the "Save As" dialog ([5733](https://github.com/jupyter/notebook/pull/5733)) Thank you to all the contributors: - bdbai - Jaipreet Singh - Kevin Bates - Pavel Panchekha - Zach Sailer ## 6.1.3 - Title new buttons with label if action undefined ([5676](https://github.com/jupyter/notebook/pull/5676)) Thank you to all the contributors: - Kyle Kelley ## 6.1.2 - Fix russian message format for delete/duplicate actions ([5662](https://github.com/jupyter/notebook/pull/5662)) - Remove unnecessary import of bind_unix_socket ([5666](https://github.com/jupyter/notebook/pull/5666)) - Tooltip style scope fix ([5672](https://github.com/jupyter/notebook/pull/5672)) Thank you to all the contributors: - Dmitry Akatov - Kevin Bates - Magda Stenius ## 6.1.1 - Prevent inclusion of requests_unixsocket on Windows ([5650](https://github.com/jupyter/notebook/pull/5650)) Thank you to all the contributors: - Kevin Bates ## 6.1.0 Please note that this repository is currently maintained by a skeleton crew of maintainers from the Jupyter community. For our approach moving forward, please see this [notice](https://github.com/jupyter/notebook#notice) from the README. Thank you. Here is an enumeration of changes made since the last release and included in 6.1.0. - Remove deprecated encoding parameter for Python 3.9 compatibility. ([5174](https://github.com/jupyter/notebook/pull/5174)) - Add support for async kernel management ([4479](https://github.com/jupyter/notebook/pull/4479)) - Fix typo in password_required help message ([5320](https://github.com/jupyter/notebook/pull/5320)) - Gateway only: Ensure launch and request timeouts are in sync ([5317](https://github.com/jupyter/notebook/pull/5317)) - Update Markdown Cells example to HTML5 video tag ([5411](https://github.com/jupyter/notebook/pull/5411)) - Integrated LoginWidget into edit to enable users to logout from the t... ([5406](https://github.com/jupyter/notebook/pull/5406)) - Update message about minimum Tornado version ([5222](https://github.com/jupyter/notebook/pull/5222)) - Logged notebook type ([5425](https://github.com/jupyter/notebook/pull/5425)) - Added nl language ([5354](https://github.com/jupyter/notebook/pull/5354)) - Add UNIX socket support to notebook server. ([4835](https://github.com/jupyter/notebook/pull/4835)) - Update CodeMirror dependency ([5198](https://github.com/jupyter/notebook/pull/5198)) - Tree added download multiple files ([5351](https://github.com/jupyter/notebook/pull/5351)) - Toolbar buttons tooltip: show help instead of label ([5107](https://github.com/jupyter/notebook/pull/5107)) - Remove unnecessary import of requests_unixsocket ([5451](https://github.com/jupyter/notebook/pull/5451)) - Add ability to cull terminals and track last activity ([5372](https://github.com/jupyter/notebook/pull/5372)) - Code refactoring notebook.js ([5352](https://github.com/jupyter/notebook/pull/5352)) - Install terminado for docs build ([5462](https://github.com/jupyter/notebook/pull/5462)) - Convert notifications JS test to selenium ([5455](https://github.com/jupyter/notebook/pull/5455)) - Add cell attachments to markdown example ([5412](https://github.com/jupyter/notebook/pull/5412)) - Add Japanese document ([5231](https://github.com/jupyter/notebook/pull/5231)) - Migrate Move multiselection test to selenium ([5158](https://github.com/jupyter/notebook/pull/5158)) - Use `cmdtrl-enter` to run a cell ([5120](https://github.com/jupyter/notebook/pull/5120)) - Fix broken "Raw cell MIME type" dialog ([5385](https://github.com/jupyter/notebook/pull/5385)) - Make a notebook writable after successful save-as ([5296](https://github.com/jupyter/notebook/pull/5296)) - Add actual watch script ([4738](https://github.com/jupyter/notebook/pull/4738)) - Added `--autoreload` flag to `NotebookApp` ([4795](https://github.com/jupyter/notebook/pull/4795)) - Enable check_origin on gateway websocket communication ([5471](https://github.com/jupyter/notebook/pull/5471)) - Restore detection of missing terminado package ([5465](https://github.com/jupyter/notebook/pull/5465)) - Culling: ensure `last_activity` attr exists before use ([5355](https://github.com/jupyter/notebook/pull/5355)) - Added functionality to allow filter kernels by Jupyter Enterprise Gat... ([5484](https://github.com/jupyter/notebook/pull/5484)) - 'Play' icon for run-cell toolbar button ([2922](https://github.com/jupyter/notebook/pull/2922)) - Bump minimum version of jQuery to 3.5.0 ([5491](https://github.com/jupyter/notebook/pull/5491)) - Remove old JS markdown tests, add a new one in selenium ([5497](https://github.com/jupyter/notebook/pull/5497)) - Add support for more RTL languages ([5036](https://github.com/jupyter/notebook/pull/5036)) - Make markdown cells stay RTL in edit mode ([5037](https://github.com/jupyter/notebook/pull/5037)) - Unforce RTL output display ([5039](https://github.com/jupyter/notebook/pull/5039)) - Fixed multicursor backspacing ([4880](https://github.com/jupyter/notebook/pull/4880)) - Implemented Split Cell for multicursor ([4824](https://github.com/jupyter/notebook/pull/4824)) - Alignment issue \[FIXED\] ([3173](https://github.com/jupyter/notebook/pull/3173)) - MathJax: Support for `\gdef` ([4407](https://github.com/jupyter/notebook/pull/4407)) - Another (Minor) Duplicate Code Reduction ([5316](https://github.com/jupyter/notebook/pull/5316)) - Update readme regarding maintenance ([5500](https://github.com/jupyter/notebook/pull/5500)) - Document contents chunks ([5508](https://github.com/jupyter/notebook/pull/5508)) - Backspace deletes empty line ([5516](https://github.com/jupyter/notebook/pull/5516)) - The dropdown submenu at notebook page is not keyboard accessible ([4732](https://github.com/jupyter/notebook/pull/4732)) - Tooltips visible through keyboard navigation for specified buttons ([4729](https://github.com/jupyter/notebook/pull/4729)) - Fix for recursive symlink ([4670](https://github.com/jupyter/notebook/pull/4670)) - Fix for the terminal shutdown issue ([4180](https://github.com/jupyter/notebook/pull/4180)) - Add japanese translation files ([4490](https://github.com/jupyter/notebook/pull/4490)) - Workaround for socket permission errors on Cygwin ([4584](https://github.com/jupyter/notebook/pull/4584)) - Implement optional markdown header and footer files ([4043](https://github.com/jupyter/notebook/pull/4043)) - Remove double link when using `custom_display_url` ([5544](https://github.com/jupyter/notebook/pull/5544)) - Respect `cell.is_editable` during find-and-replace ([5545](https://github.com/jupyter/notebook/pull/5545)) - Fix exception causes all over the codebase ([5556](https://github.com/jupyter/notebook/pull/5556) - Improve login shell heuristics ([5588](https://github.com/jupyter/notebook/pull/5588)) - Added support for `JUPYTER_TOKEN_FILE` ([5587](https://github.com/jupyter/notebook/pull/5587)) - Kill notebook itself when server cull idle kernel ([5593](https://github.com/jupyter/notebook/pull/5593)) - Implement password hashing with bcrypt ([3793](https://github.com/jupyter/notebook/pull/3793)) - Fix broken links ([5600](https://github.com/jupyter/notebook/pull/5600)) - Russian internationalization support ([5571](https://github.com/jupyter/notebook/pull/5571)) - Add a metadata tag to override notebook direction (ltr/rtl) ([5052](https://github.com/jupyter/notebook/pull/5052)) - Paste two images from clipboard in markdown cell ([5598](https://github.com/jupyter/notebook/pull/5598)) - Add keyboard shortcuts to menu dropdowns ([5525](https://github.com/jupyter/notebook/pull/5525)) - Update codemirror to `5.56.0+components1` ([5637](https://github.com/jupyter/notebook/pull/5637)) Thank you to all the contributors: - Aaron Myatt - Adam Blake - Afshin Taylor Darian - Aman Bansal - Ben Thayer - berendjan - Bruno P. Kinoshita - bzinberg - Christophe Cadilhac - Daiki Katsuragawa - David Lukes - Dmitriy Q - dmpe - dylanzjy - dSchurch - E. M. Bray - ErwinRussel - Felix Mönckemeyer - Grant Nestor - Jarrad Whitaker - Jesus Panales Castillo - Joshua Zeltser - Karthikeyan Singaravelan - Kenichi Ito - Kevin Bates - Koki Nishihara - Kris Wilson - Kyle Kelley - Laura Merlo - levinxo - Luciano Resende - Luis Cabezon Manchado - Madhusudhan Srinivasa - Matthias Geier - mattn - Max Klein - Min RK - Mingxuan Lin - Mohammad Mostafa Farzan - Niko Felger - Norah Abanumay - Onno Broekmans - PierreMB - pinarkavak - Ram Rachum - Reece Hart - Remi Rampin - Rohit Sanjay - Shane Canon - Simon Li - Steinar Sturlaugsson - Steven Silvester - taohan16 - Thew Dhanat - Thomas Kluyver - Toon Baeyens - Vidar Tonaas Fauske - Zachary Sailer ## 6.0.3 - Dependency updates to fix startup issues on Windows platform - Add support for nbconvert 6.x - Creation of recent tab Thanks for all the contributors: - Luciano Resende - Kevin Bates - ahangsleben - Zachary Sailer - Pallavi Bharadwaj - Thomas Kluyver - Min RK - forest0 - Bibo Hao - Michal Charemza - Sergey Shevelev - Shuichiro MAKIGAKI - krinsman - TPartida - Landen McDonald - Tres DuBiel ## 6.0.2 - Update JQuery dependency to version 3.4.1 to fix security vulnerability (CVE-2019-11358) - Update CodeMirror to version 5.48.4 to fix Python formatting issues - Continue removing obsolete Python 2.x code/dependencies - Multiple documentation updates Thanks for all the contributors: - David Robles - Jason Grout - Kerwin Sun - Kevin Bates - Kyle Kelley - Luciano Resende - Marcus D Sherman - Sasaki Takeru - Tom Jarosz - Vidar Tonaas Fauske - Wes Turner - Zachary Sailer ## 6.0.1 - Attempt to re-establish websocket connection to Gateway ([4777](https://github.com/jupyter/notebook/pull/4777)) - Add missing react-dom js to package data ([4772](https://github.com/jupyter/notebook/pull/4772)) Thanks for all the contributors: - Eunsoo Park - Min RK ## 6.0 This is the first major release of the Jupyter Notebook since version 5.0 (March 2017). We encourage users to start trying JupyterLab, which has just announced it's 1.0 release in preparation for a future transition. - Remove Python 2.x support in favor of Python 3.5 and higher. - Multiple accessibility enhancements and bug-fixes. - Multiple translation enhancements and bug-fixes. - Remove deprecated ANSI CSS styles. - Native support to forward requests to Jupyter Gateway(s) (Embedded NB2KG). - Use JavaScript to redirect users to notebook homepage. - Enhanced SSL/TLS security by using PROTOCOL_TLS which selects the highest ssl/tls protocol version available that both the client and server support. When PROTOCOL_TLS is not available use PROTOCOL_SSLv23. - Add `?no_track_activity=1` argument to allow API requests. to not be registered as activity (e.g. API calls by external activity monitors). - Kernels shutting down due to an idle timeout is no longer considered an activity-updating event. - Further improve compatibility with tornado 6 with improved checks for when websockets are closed. - Launch the browser with a local file which redirects to the server address including the authentication token. This prevents another logged-in user from stealing the token from command line arguments and authenticating to the server. The single-use token previously used to mitigate this has been removed. Thanks to Dr. Owain Kenway for suggesting the local file approach. - Respect nbconvert entrypoints as sources for exporters - Update to CodeMirror to 5.37, which includes f-string syntax for Python 3.6. - Update jquery-ui to 1.12 - Execute cells by clicking icon in input prompt. - New "Save as" menu option. - When serving on a loopback interface, protect against DNS rebinding by checking the `Host` header from the browser. This check can be disabled if necessary by setting `NotebookApp.allow_remote_access`. (Disabled by default while we work out some Mac issues in [3754](https://github.com/jupyter/notebook/issues/3754)). - Add kernel_info_timeout traitlet to enable restarting slow kernels. - Add `custom_display_host` config option to override displayed URL. - Add /metrics endpoint for Prometheus Metrics. - Optimize large file uploads. - Allow access control headers to be overridden in jupyter_notebook_config.py to support greater CORS and proxy configuration flexibility. - Add support for terminals on windows. - Add a "restart and run all" button to the toolbar. - Frontend/extension-config: allow default json files in a .d directory. - Allow setting token via jupyter_token env. - Cull idle kernels using `--MappingKernelManager.cull_idle_timeout`. - Allow read-only notebooks to be trusted. - Convert JS tests to Selenium. Security Fixes included in previous minor releases of Jupyter Notebook and also included in version 6.0. - Fix Open Redirect vulnerability (CVE-2019-10255) where certain malicious URLs could redirect from the Jupyter login page to a malicious site after a successful login. - Contains a security fix for a cross-site inclusion (XSSI) vulnerability (CVE-2019--9644), where files at a known URL could be included in a page from an unauthorized website if the user is logged into a Jupyter server. The fix involves setting the `X-Content-Type-Options: nosniff` header, and applying CSRF checks previously on all non-GET API requests to GET requests to API endpoints and the /files/ endpoint. - Check Host header to more securely protect localhost deployments from DNS rebinding. This is a pre-emptive measure, not fixing a known vulnerability. Use `.NotebookApp.allow_remote_access` and `.NotebookApp.local_hostnames` to configure access. - Upgrade bootstrap to 3.4, fixing an XSS vulnerability, which has been assigned [CVE-2018-14041](https://nvd.nist.gov/vuln/detail/CVE-2018-14041). - Contains a security fix preventing malicious directory names from being able to execute javascript. - Contains a security fix preventing nbconvert endpoints from executing javascript with access to the server API. CVE request pending. Thanks for all the contributors: - AAYUSH SINHA - Aaron Hall, MBA - Abhinav Sagar - Adam Rule - Adeel Ahmad - Alex Rothberg - Amy Skerry-Ryan - Anastasis Germanidis - Andrés Sánchez - Arjun Radhakrishna - Arovit Narula - Benda Xu - Björn Grüning - Brian E. Granger - Carol Willing - Celina Kilcrease - Chris Holdgraf - Chris Miller - Ciaran Langton - Damian Avila - Dana Lee - Daniel Farrell - Daniel Nicolai - Darío Hereñú - Dave Aitken - Dave Foster - Dave Hirschfeld - Denis Ledoux - Dmitry Mikushin - Dominic Kuang - Douglas Hanley - Elliott Sales de Andrade - Emilio Talamante Lugo - Eric Perry - Ethan T. Hendrix - Evan Van Dam - Francesco Franchina - Frédéric Chapoton - Félix-Antoine Fortin - Gabriel - Gabriel Nützi - Gabriel Ruiz - Gestalt LUR - Grant Nestor - Gustavo Efeiche - Harsh Vardhan - Heng GAO - Hisham Elsheshtawy - Hong Xu - Ian Rose - Ivan Ogasawara - J Forde - Jason Grout - Jessica B. Hamrick - Jiaqi Liu - John Emmons - Josh Barnes - Karthik Balakrishnan - Kevin Bates - Kirit Thadaka - Kristian Gregorius Hustad - Kyle Kelley - Leo Gallucci - Lilian Besson - Lucas Seiki Oshiro - Luciano Resende - Luis Angel Rodriguez Guerrero - M Pacer - Maarten Breddels - Mac Knight - Madicken Munk - Maitiú Ó Ciaráin - Marc Udoff - Mathis HAMMEL - Mathis Rosenhauer - Matthias Bussonnier - Matthias Geier - Max Vovshin - Maxime Mouchet - Michael Chirico - Michael Droettboom - Michael Heilman - Michael Scott Cuthbert - Michal Charemza - Mike Boyle - Milos Miljkovic - Min RK - Miro Hrončok - Nicholas Bollweg - Nitesh Sawant - Ondrej Jariabka - Park Hae Jin - Paul Ivanov - Paul Masson - Peter Parente - Pierre Tholoniat - Remco Verhoef - Roland Weber - Roman Kornev - Rosa Swaby - Roy Hyunjin Han - Sally - Sam Lau - Samar Sultan - Shiti Saxena - Simon Biggs - Spencer Park - Stephen Ward - Steve (Gadget) Barnes - Steven Silvester - Surya Prakash Susarla - Syed Shah - Sylvain Corlay - Thomas Aarholt - Thomas Kluyver - Tim - Tim Head - Tim Klever - Tim Metzler - Todd - Tom Jorquera - Tyler Makaro - Vaibhav Sagar - Victor - Vidar Tonaas Fauske - Vu Minh Tam - Vít Tuček - Will Costello - Will Starms - William Hosford - Xiaohan Li - Yuvi Panda - ashley teoh - nullptr ## 5.7.8 - Fix regression in restarting kernels in 5.7.5. The restart handler would return before restart was completed. - Further improve compatibility with tornado 6 with improved checks for when websockets are closed. - Fix regression in 5.7.6 on Windows where .js files could have the wrong mime-type. - Fix Open Redirect vulnerability (CVE-2019-10255) where certain malicious URLs could redirect from the Jupyter login page to a malicious site after a successful login. 5.7.7 contained only a partial fix for this issue. ## 5.7.6 5.7.6 contains a security fix for a cross-site inclusion (XSSI) vulnerability (CVE-2019--9644), where files at a known URL could be included in a page from an unauthorized website if the user is logged into a Jupyter server. The fix involves setting the `X-Content-Type-Options: nosniff` header, and applying CSRF checks previously on all non-GET API requests to GET requests to API endpoints and the /files/ endpoint. The attacking page is able to access some contents of files when using Internet Explorer through script errors, but this has not been demonstrated with other browsers. ## 5.7.5 - Fix compatibility with tornado 6 ([4392](https://github.com/jupyter/notebook/pull/4392), [4449](https://github.com/jupyter/notebook/pull/4449)). - Fix opening integer filedescriptor during startup on Python 2 ([4349](https://github.com/jupyter/notebook/pull/4349)) - Fix compatibility with asynchronous \[KernelManager.restart_kernel\]{.title-ref} methods ([4412](https://github.com/jupyter/notebook/pull/4412)) ## 5.7.4 5.7.4 fixes a bug introduced in 5.7.3, in which the `list_running_servers()` function attempts to parse HTML files as JSON, and consequently crashes ([4284](https://github.com/jupyter/notebook/pull/4284)). ## 5.7.3 5.7.3 contains one security improvement and one security fix: - Launch the browser with a local file which redirects to the server address including the authentication token ([4260](https://github.com/jupyter/notebook/pull/4260)). This prevents another logged-in user from stealing the token from command line arguments and authenticating to the server. The single-use token previously used to mitigate this has been removed. Thanks to Dr. Owain Kenway for suggesting the local file approach. - Upgrade bootstrap to 3.4, fixing an XSS vulnerability, which has been assigned [CVE-2018-14041](https://nvd.nist.gov/vuln/detail/CVE-2018-14041) ([4271](https://github.com/jupyter/notebook/pull/4271)). ## 5.7.2 5.7.2 contains a security fix preventing malicious directory names from being able to execute javascript. CVE request pending. ## 5.7.1 5.7.1 contains a security fix preventing nbconvert endpoints from executing javascript with access to the server API. CVE request pending. ## 5.7.0 New features: - Update to CodeMirror to 5.37, which includes f-string syntax for Python 3.6 ([3816](https://github.com/jupyter/notebook/pull/3816)) - Update jquery-ui to 1.12 ([3836](https://github.com/jupyter/notebook/pull/3836)) - Check Host header to more securely protect localhost deployments from DNS rebinding. This is a pre-emptive measure, not fixing a known vulnerability ([3766](https://github.com/jupyter/notebook/pull/3766)). Use `.NotebookApp.allow_remote_access` and `.NotebookApp.local_hostnames` to configure access. - Allow access-control-allow-headers to be overridden ([3886](https://github.com/jupyter/notebook/pull/3886)) - Allow configuring max_body_size and max_buffer_size ([3829](https://github.com/jupyter/notebook/pull/3829)) - Allow configuring get_secure_cookie keyword-args ([3778](https://github.com/jupyter/notebook/pull/3778)) - Respect nbconvert entrypoints as sources for exporters ([3879](https://github.com/jupyter/notebook/pull/3879)) - Include translation sources in source distributions ([3925](https://github.com/jupyter/notebook/pull/3925), [3931](https://github.com/jupyter/notebook/pull/3931)) - Various improvements to documentation ([3799](https://github.com/jupyter/notebook/pull/3799), [3800](https://github.com/jupyter/notebook/pull/3800), [3806](https://github.com/jupyter/notebook/pull/3806), [3883](https://github.com/jupyter/notebook/pull/3883), [3908](https://github.com/jupyter/notebook/pull/3908)) Fixing problems: - Fix breadcrumb link when running with a base url ([3905](https://github.com/jupyter/notebook/pull/3905)) - Fix possible type error when closing activity stream ([3907](https://github.com/jupyter/notebook/pull/3907)) - Disable metadata editing for non-editable cells ([3744](https://github.com/jupyter/notebook/pull/3744)) - Fix some styling and alignment of prompts caused by regressions in 5.6.0. - Enter causing page reload in shortcuts editor ([3871](https://github.com/jupyter/notebook/pull/3871)) - Fix uploading to the same file twice ([3712](https://github.com/jupyter/notebook/pull/3712)) See the 5.7 milestone on GitHub for a complete list of [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A5.7) involved in this release. Thanks to the following contributors: - Aaron Hall - Benjamin Ragan-Kelley - Bill Major - bxy007 - Dave Aitken - Denis Ledoux - Félix-Antoine Fortin - Gabriel - Grant Nestor - Kevin Bates - Kristian Gregorius Hustad - M Pacer - Madicken Munk - Maitiu O Ciarain - Matthias Bussonnier - Michael Boyle - Michael Chirico - Mokkapati, Praneet(ES) - Peter Parente - Sally Wilsak - Steven Silvester - Thomas Kluyver - Walter Martin ## 5.6.0 New features: - Execute cells by clicking icon in input prompt ([3535](https://github.com/jupyter/notebook/pull/3535), [3687](https://github.com/jupyter/notebook/pull/3687)) - New "Save as" menu option ([3289](https://github.com/jupyter/notebook/pull/3289)) - When serving on a loopback interface, protect against DNS rebinding by checking the `Host` header from the browser ([3714](https://github.com/jupyter/notebook/pull/3714)). This check can be disabled if necessary by setting `NotebookApp.allow_remote_access`. (Disabled by default while we work out some Mac issues in [3754](https://github.com/jupyter/notebook/issues/3754)). - Add kernel_info_timeout traitlet to enable restarting slow kernels ([3665](https://github.com/jupyter/notebook/pull/3665)) - Add `custom_display_host` config option to override displayed URL ([3668](https://github.com/jupyter/notebook/pull/3668)) - Add /metrics endpoint for Prometheus Metrics ([3490](https://github.com/jupyter/notebook/pull/3490)) - Update to MathJax 2.7.4 ([3751](https://github.com/jupyter/notebook/pull/3751)) - Update to jQuery 3.3 ([3655](https://github.com/jupyter/notebook/pull/3655)) - Update marked to 0.4 ([3686](https://github.com/jupyter/notebook/pull/3686)) Fixing problems: - Don't duplicate token in displayed URL ([3656](https://github.com/jupyter/notebook/pull/3656)) - Clarify displayed URL when listening on all interfaces ([3703](https://github.com/jupyter/notebook/pull/3703)) - Don't trash non-empty directories on Windows ([3673](https://github.com/jupyter/notebook/pull/3673)) - Include LICENSE file in wheels ([3671](https://github.com/jupyter/notebook/pull/3671)) - Don't show "0 active kernels" when starting the notebook ([3696](https://github.com/jupyter/notebook/pull/3696)) Testing: - Add find replace test ([3630](https://github.com/jupyter/notebook/pull/3630)) - Selenium test for deleting all cells ([3601](https://github.com/jupyter/notebook/pull/3601)) - Make creating a new notebook more robust ([3726](https://github.com/jupyter/notebook/pull/3726)) Thanks to the following contributors: - Arovit Narula ([arovit](https://github.com/arovit)) - lucasoshiro ([lucasoshiro](https://github.com/lucasoshiro)) - M Pacer ([mpacer](https://github.com/mpacer)) - Thomas Kluyver ([takluyver](https://github.com/takluyver)) - Todd ([toddrme2178](https://github.com/toddrme2178)) - Yuvi Panda ([yuvipanda](https://github.com/yuvipanda)) See the 5.6 milestone on GitHub for a complete list of [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A5.6) involved in this release. ## 5.5.0 New features: - The files list now shows file sizes ([3539](https://github.com/jupyter/notebook/pull/3539)) - Add a quit button in the dashboard ([3004](https://github.com/jupyter/notebook/pull/3004)) - Display hostname in the terminal when running remotely ([3356](https://github.com/jupyter/notebook/pull/3356), [3593](https://github.com/jupyter/notebook/pull/3593)) - Add slides exportation/download to the menu ([3287](https://github.com/jupyter/notebook/pull/3287)) - Add any extra installed nbconvert exporters to the "Download as" menu ([3323](https://github.com/jupyter/notebook/pull/3323)) - Editor: warning when overwriting a file that is modified on disk ([2783](https://github.com/jupyter/notebook/pull/2783)) - Display a warning message if cookies are not enabled ([3511](https://github.com/jupyter/notebook/pull/3511)) - Basic `__version__` reporting for extensions ([3541](https://github.com/jupyter/notebook/pull/3541)) - Add `NotebookApp.terminals_enabled` config option ([3478](https://github.com/jupyter/notebook/pull/3478)) - Make buffer time between last modified on disk and last modified on last save configurable ([3273](https://github.com/jupyter/notebook/pull/3273)) - Allow binding custom shortcuts for 'close and halt' ([3314](https://github.com/jupyter/notebook/pull/3314)) - Add description for 'Trusted' notification ([3386](https://github.com/jupyter/notebook/pull/3386)) - Add `settings['activity_sources']` ([3401](https://github.com/jupyter/notebook/pull/3401)) - Add an `output_updated.OutputArea` event ([3560](https://github.com/jupyter/notebook/pull/3560)) Fixing problems: - Fixes to improve web accessibility ([3507](https://github.com/jupyter/notebook/pull/3507)) - Fixed color contrast issue in tree.less ([3336](https://github.com/jupyter/notebook/pull/3336)) - Allow cancelling upload of large files ([3373](https://github.com/jupyter/notebook/pull/3373)) - Don't clear login cookie on requests without cookie ([3380](https://github.com/jupyter/notebook/pull/3380)) - Don't trash files on different device to home dir on Linux ([3304](https://github.com/jupyter/notebook/pull/3304)) - Clear waiting asterisks when restarting kernel ([3494](https://github.com/jupyter/notebook/pull/3494)) - Fix output prompt when `execution_count` missing ([3236](https://github.com/jupyter/notebook/pull/3236)) - Make the 'changed on disk' dialog work when displayed twice ([3589](https://github.com/jupyter/notebook/pull/3589)) - Fix going back to root directory with history in notebook list ([3411](https://github.com/jupyter/notebook/pull/3411)) - Allow defining keyboard shortcuts for missing actions ([3561](https://github.com/jupyter/notebook/pull/3561)) - Prevent default on pageup/pagedown when completer is active ([3500](https://github.com/jupyter/notebook/pull/3500)) - Prevent default event handling on new terminal ([3497](https://github.com/jupyter/notebook/pull/3497)) - ConfigManager should not write out default values found in the .d directory ([3485](https://github.com/jupyter/notebook/pull/3485)) - Fix leak of iopub object in activity monitoring ([3424](https://github.com/jupyter/notebook/pull/3424)) - Javascript lint in notebooklist.js ([3409](https://github.com/jupyter/notebook/pull/3409)) - Some Javascript syntax fixes ([3294](https://github.com/jupyter/notebook/pull/3294)) - Convert native for loop to `Array.forEach()` ([3477](https://github.com/jupyter/notebook/pull/3477)) - Disable cache when downloading nbconvert output ([3484](https://github.com/jupyter/notebook/pull/3484)) - Add missing digestmod arg to HMAC ([3399](https://github.com/jupyter/notebook/pull/3399)) - Log OSErrors failing to create less-critical files during startup ([3384](https://github.com/jupyter/notebook/pull/3384)) - Use powershell on Windows ([3379](https://github.com/jupyter/notebook/pull/3379)) - API spec improvements, API handler improvements ([3368](https://github.com/jupyter/notebook/pull/3368)) - Set notebook to dirty state after change to kernel metadata ([3350](https://github.com/jupyter/notebook/pull/3350)) - Use CSP header to treat served files as belonging to a separate origin ([3341](https://github.com/jupyter/notebook/pull/3341)) - Don't install gettext into builtins ([3330](https://github.com/jupyter/notebook/pull/3330)) - Add missing `import _` ([3316](https://github.com/jupyter/notebook/pull/3316), [3326](https://github.com/jupyter/notebook/pull/3326)) - Write `notebook.json` file atomically ([3305](https://github.com/jupyter/notebook/pull/3305)) - Fix clicking with modifiers, page title updates ([3282](https://github.com/jupyter/notebook/pull/3282)) - Upgrade jQuery to version 2.2 ([3428](https://github.com/jupyter/notebook/pull/3428)) - Upgrade xterm.js to 3.1.0 ([3189](https://github.com/jupyter/notebook/pull/3189)) - Upgrade moment.js to 2.19.3 ([3562](https://github.com/jupyter/notebook/pull/3562)) - Upgrade CodeMirror to 5.35 ([3372](https://github.com/jupyter/notebook/pull/3372)) - "Require" pyzmq>=17 ([3586](https://github.com/jupyter/notebook/pull/3586)) Documentation: - Documentation updates and organisation ([3584](https://github.com/jupyter/notebook/pull/3584)) - Add section in docs about privacy ([3571](https://github.com/jupyter/notebook/pull/3571)) - Add explanation on how to change the type of a cell to Markdown ([3377](https://github.com/jupyter/notebook/pull/3377)) - Update docs with confd implementation details ([3520](https://github.com/jupyter/notebook/pull/3520)) - Add more information for where `jupyter_notebook_config.py` is located ([3346](https://github.com/jupyter/notebook/pull/3346)) - Document options to enable nbextensions in specific sections ([3525](https://github.com/jupyter/notebook/pull/3525)) - jQuery attribute selector value MUST be surrounded by quotes ([3527](https://github.com/jupyter/notebook/pull/3527)) - Do not execute special notebooks with nbsphinx ([3360](https://github.com/jupyter/notebook/pull/3360)) - Other minor fixes in [3288](https://github.com/jupyter/notebook/pull/3288), [3528](https://github.com/jupyter/notebook/pull/3528), [3293](https://github.com/jupyter/notebook/pull/3293), [3367](https://github.com/jupyter/notebook/pull/3367) Testing: - Testing with Selenium & Sauce labs ([3321](https://github.com/jupyter/notebook/pull/3321)) - Selenium utils + markdown rendering tests ([3458](https://github.com/jupyter/notebook/pull/3458)) - Convert insert cell tests to Selenium ([3508](https://github.com/jupyter/notebook/pull/3508)) - Convert prompt numbers tests to Selenium ([3554](https://github.com/jupyter/notebook/pull/3554)) - Convert delete cells tests to Selenium ([3465](https://github.com/jupyter/notebook/pull/3465)) - Convert undelete cell tests to Selenium ([3475](https://github.com/jupyter/notebook/pull/3475)) - More selenium testing utilities ([3412](https://github.com/jupyter/notebook/pull/3412)) - Only check links when build is trigger by Travis Cron job ([3493](https://github.com/jupyter/notebook/pull/3493)) - Fix Appveyor build errors ([3430](https://github.com/jupyter/notebook/pull/3430)) - Undo patches in teardown before attempting to delete files ([3459](https://github.com/jupyter/notebook/pull/3459)) - Get tests running with tornado 5 ([3398](https://github.com/jupyter/notebook/pull/3398)) - Unpin ipykernel version on Travis ([3223](https://github.com/jupyter/notebook/pull/3223)) Thanks to the following contributors: - Arovit Narula ([arovit](https://github.com/arovit)) - Ashley Teoh ([ashleytqy](https://github.com/ashleytqy)) - Nicholas Bollweg ([bollwyvl](https://github.com/bollwyvl)) - Alex Rothberg ([cancan101](https://github.com/cancan101)) - Celina Kilcrease ([ckilcrease](https://github.com/ckilcrease)) - dabuside ([dabuside](https://github.com/dabuside)) - Damian Avila ([damianavila](https://github.com/damianavila)) - Dana Lee ([danagilliann](https://github.com/danagilliann)) - Dave Hirschfeld ([dhirschfeld](https://github.com/dhirschfeld)) - Heng GAO ([ehengao](https://github.com/ehengao)) - Leo Gallucci ([elgalu](https://github.com/elgalu)) - Evan Van Dam ([evandam](https://github.com/evandam)) - forbxy ([forbxy](https://github.com/forbxy)) - Grant Nestor ([gnestor](https://github.com/gnestor)) - Ethan T. Hendrix ([hendrixet](https://github.com/hendrixet)) - Miro Hrončok ([hroncok](https://github.com/hroncok)) - Paul Ivanov ([ivanov](https://github.com/ivanov)) - Darío Hereñú ([kant](https://github.com/kant)) - Kevin Bates ([kevin-bates](https://github.com/kevin-bates)) - Maarten Breddels ([maartenbreddels](https://github.com/maartenbreddels)) - Michael Droettboom ([mdboom](https://github.com/mdboom)) - Min RK ([minrk](https://github.com/minrk)) - M Pacer ([mpacer](https://github.com/mpacer)) - Peter Parente ([parente](https://github.com/parente)) - Paul Masson ([paulmasson](https://github.com/paulmasson)) - Philipp Rudiger ([philippjfr](https://github.com/philippjfr)) - Mac Knight (Shels1909) - Hisham Elsheshtawy ([Sheshtawy](https://github.com/Sheshtawy)) - Simon Biggs ([SimonBiggs](https://github.com/SimonBiggs)) - Sunil Hari (`@sunilhari`) - Thomas Kluyver ([takluyver](https://github.com/takluyver)) - Tim Klever ([tklever](https://github.com/tklever)) - Gabriel Ruiz ([unnamedplay-r](https://github.com/unnamedplay-r)) - Vaibhav Sagar ([vaibhavsagar](https://github.com/vaibhavsagar)) - William Hosford ([whosford](https://github.com/whosford)) - Hong ([xuhdev](https://github.com/xuhdev)) See the 5.5 milestone on GitHub for a complete list of [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A5.5) involved in this release. ## 5.4.1 A security release to fix [CVE-2018-8768](http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-8768). Thanks to [Alex](https://hackerone.com/pisarenko) for identifying this bug, and Jonathan Kamens and Scott Sanderson at Quantopian for verifying it and bringing it to our attention. ## 5.4.0 - Fix creating files and folders after navigating directories in the dashboard ([3264](https://github.com/jupyter/notebook/pull/3264)). - Enable printing notebooks in colour, removing the CSS that made everything black and white ([3212](https://github.com/jupyter/notebook/pull/3212)). - Limit the completion options displayed in the notebook to 1000, to avoid performance issues with very long lists ([3195](https://github.com/jupyter/notebook/pull/3195)). - Accessibility improvements in `tree.html` ([3271](https://github.com/jupyter/notebook/pull/3271)). - Added alt-text to the kernel logo image in the notebook UI ([3228](https://github.com/jupyter/notebook/pull/3228)). - Added a test on Travis CI to flag if symlinks are accidentally introduced in the future. This should prevent the issue that necessitated `release-5.3.1`{.interpreted-text role="ref"} ([3227](https://github.com/jupyter/notebook/pull/3227)). - Use lowercase letters for random IDs generated in our Javascript ([3264](https://github.com/jupyter/notebook/pull/3264)). - Removed duplicate code setting `TextCell.notebook` ([3256](https://github.com/jupyter/notebook/pull/3256)). Thanks to the following contributors: - Alex Soderman ([asoderman](https://github.com/asoderman)) - Matthias Bussonnier ([Carreau](https://github.com/Carreau)) - Min RK ([minrk](https://github.com/minrk)) - Nitesh Sawant ([ns23](https://github.com/ns23)) - Thomas Kluyver ([takluyver](https://github.com/takluyver)) - Yuvi Panda ([yuvipanda](https://github.com/yuvipanda)) See the 5.4 milestone on GitHub for a complete list of [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A5.4) involved in this release. ## 5.3.1 Replaced a symlink in the repository with a copy, to fix issues installing on Windows ([3220](https://github.com/jupyter/notebook/pull/3220)). ## 5.3.0 This release introduces a couple notable improvements, such as terminal support for Windows and support for OS trash (files deleted from the notebook dashboard are moved to the OS trash vs. deleted permanently). - Add support for terminals on windows ([3087](https://github.com/jupyter/notebook/pull/3087)). - Add a "restart and run all" button to the toolbar ([2965](https://github.com/jupyter/notebook/pull/2965)). - Send files to os trash mechanism on delete ([1968](https://github.com/jupyter/notebook/pull/1968)). - Allow programmatic copy to clipboard ([3088](https://github.com/jupyter/notebook/pull/3088)). - Use DOM History API for navigating between directories in the file browser ([3115](https://github.com/jupyter/notebook/pull/3115)). - Add translated files to folder(docs-translations) ([3065](https://github.com/jupyter/notebook/pull/3065)). - Allow non empty dirs to be deleted ([3108](https://github.com/jupyter/notebook/pull/3108)). - Set cookie on base_url ([2959](https://github.com/jupyter/notebook/pull/2959)). - Allow token-authenticated requests cross-origin by default ([2920](https://github.com/jupyter/notebook/pull/2920)). - Change cull_idle_timeout_minimum to 1 from 300 ([2910](https://github.com/jupyter/notebook/pull/2910)). - Config option to shut down server after n seconds with no kernels ([2963](https://github.com/jupyter/notebook/pull/2963)). - Display a "close" button on load notebook error ([3176](https://github.com/jupyter/notebook/pull/3176)). - Add action to command palette to run CodeMirror's "indentAuto" on selection ([3175](https://github.com/jupyter/notebook/pull/3175)). - Add option to specify extra services ([3158](https://github.com/jupyter/notebook/pull/3158)). - Warn_bad_name should not use global name ([3160](https://github.com/jupyter/notebook/pull/3160)). - Avoid overflow of hidden form ([3148](https://github.com/jupyter/notebook/pull/3148)). - Fix shutdown trans loss ([3147](https://github.com/jupyter/notebook/pull/3147)). - Find available kernelspecs more efficiently ([3136](https://github.com/jupyter/notebook/pull/3136)). - Don't try to translate missing help strings ([3122](https://github.com/jupyter/notebook/pull/3122)). - Frontend/extension-config: allow default json files in a .d directory ([3116](https://github.com/jupyter/notebook/pull/3116)). - Use \[requirejs\]{.title-ref} vs. \[require\]{.title-ref} ([3097](https://github.com/jupyter/notebook/pull/3097)). - Fixes some ui bugs in firefox #3044 ([3058](https://github.com/jupyter/notebook/pull/3058)). - Compare non-specific language code when choosing to use arabic numerals ([3055](https://github.com/jupyter/notebook/pull/3055)). - Fix save-script deprecation ([3053](https://github.com/jupyter/notebook/pull/3053)). - Include moment locales in package_data ([3051](https://github.com/jupyter/notebook/pull/3051)). - Fix moment locale loading in bidi support ([3048](https://github.com/jupyter/notebook/pull/3048)). - Tornado 5: periodiccallback loop arg will be removed ([3034](https://github.com/jupyter/notebook/pull/3034)). - Use \[/files\]{.title-ref} prefix for pdf-like files ([3031](https://github.com/jupyter/notebook/pull/3031)). - Add folder for document translation ([3022](https://github.com/jupyter/notebook/pull/3022)). - When login-in via token, let a chance for user to set the password ([3008](https://github.com/jupyter/notebook/pull/3008)). - Switch to jupyter_core implementation of ensure_dir_exists ([3002](https://github.com/jupyter/notebook/pull/3002)). - Send http shutdown request on 'stop' subcommand ([3000](https://github.com/jupyter/notebook/pull/3000)). - Work on loading ui translations ([2969](https://github.com/jupyter/notebook/pull/2969)). - Fix ansi inverse ([2967](https://github.com/jupyter/notebook/pull/2967)). - Add send2trash to requirements for building docs ([2964](https://github.com/jupyter/notebook/pull/2964)). - I18n readme.md improvement ([2962](https://github.com/jupyter/notebook/pull/2962)). - Add 'reason' field to json error responses ([2958](https://github.com/jupyter/notebook/pull/2958)). - Add some padding for stream outputs ([3194](https://github.com/jupyter/notebook/pull/3194)). - Always use setuptools in `setup.py` ([3206](https://github.com/jupyter/notebook/pull/3206)). - Fix clearing cookies on logout when `base_url` is configured ([3207](https://github.com/jupyter/notebook/pull/3207)). Thanks to the following contributors: - bacboc ([bacboc](https://github.com/bacboc)) - Steven Silvester ([blink1073](https://github.com/blink1073)) - Matthias Bussonnier ([Carreau](https://github.com/Carreau)) - ChungJooHo ([ChungJooHo](https://github.com/ChungJooHo)) - edida ([edida](https://github.com/edida)) - Francesco Franchina (`ferdas`) - forbxy ([forbxy](https://github.com/forbxy)) - Grant Nestor ([gnestor](https://github.com/gnestor)) - Josh Barnes ([jcb91](https://github.com/jcb91)) - JocelynDelalande ([JocelynDelalande](https://github.com/JocelynDelalande)) - Karthik Balakrishnan ([karthikb351](https://github.com/karthikb351)) - Kevin Bates ([kevin-bates](https://github.com/kevin-bates)) - Kirit Thadaka ([kirit93](https://github.com/kirit93)) - Lilian Besson ([Naereen](https://github.com/Naereen)) - Maarten Breddels ([maartenbreddels](https://github.com/maartenbreddels)) - Madhu94 ([Madhu94](https://github.com/Madhu94)) - Matthias Geier ([mgeier](https://github.com/mgeier)) - Michael Heilman ([mheilman](https://github.com/mheilman)) - Min RK ([minrk](https://github.com/minrk)) - PHaeJin ([PHaeJin](https://github.com/PHaeJin)) - Sukneet ([Sukneet](https://github.com/Sukneet)) - Thomas Kluyver ([takluyver](https://github.com/takluyver)) See the 5.3 milestone on GitHub for a complete list of [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A5.3) involved in this release. ## 5.2.1 - Fix invisible CodeMirror cursor at specific browser zoom levels ([2983](https://github.com/jupyter/notebook/pull/2983)). - Fix nbconvert handler causing broken export to PDF ([2981](https://github.com/jupyter/notebook/pull/2981)). - Fix the prompt_area argument of the output area constructor. ([2961](https://github.com/jupyter/notebook/pull/2961)). - Handle a compound extension in new_untitled ([2949](https://github.com/jupyter/notebook/pull/2949)). - Allow disabling offline message buffering ([2916](https://github.com/jupyter/notebook/pull/2916)). Thanks to the following contributors: - Steven Silvester ([blink1073](https://github.com/blink1073)) - Grant Nestor ([gnestor](https://github.com/gnestor)) - Jason Grout ([jasongrout](https://github.com/jasongrout)) - Min RK ([minrk](https://github.com/minrk)) - M Pacer ([mpacer](https://github.com/mpacer)) See the 5.2.1 milestone on GitHub for a complete list of [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A5.2.1) involved in this release. ## 5.2.0 - Allow setting token via jupyter_token env ([2921](https://github.com/jupyter/notebook/pull/2921)). - Fix some errors caused by raising 403 in get_current_user ([2919](https://github.com/jupyter/notebook/pull/2919)). - Register contents_manager.files_handler_class directly ([2917](https://github.com/jupyter/notebook/pull/2917)). - Update viewable_extensions ([2913](https://github.com/jupyter/notebook/pull/2913)). - Show edit shortcuts modal after shortcuts modal is hidden ([2912](https://github.com/jupyter/notebook/pull/2912)). - Improve edit/view behavior ([2911](https://github.com/jupyter/notebook/pull/2911)). - The root directory of the notebook server should never be hidden ([2907](https://github.com/jupyter/notebook/pull/2907)). - Fix notebook require config to match tools/build-main ([2888](https://github.com/jupyter/notebook/pull/2888)). - Give page constructor default arguments ([2887](https://github.com/jupyter/notebook/pull/2887)). - Fix codemirror.less to match codemirror's expected padding layout ([2880](https://github.com/jupyter/notebook/pull/2880)). - Add x-xsrftoken to access-control-allow-headers ([2876](https://github.com/jupyter/notebook/pull/2876)). - Buffer messages when websocket connection is interrupted ([2871](https://github.com/jupyter/notebook/pull/2871)). - Load locale dynamically only when not en-us ([2866](https://github.com/jupyter/notebook/pull/2866)). - Changed key strength to 2048 bits ([2861](https://github.com/jupyter/notebook/pull/2861)). - Resync jsversion with python version ([2860](https://github.com/jupyter/notebook/pull/2860)). - Allow copy operation on modified, read-only notebook ([2854](https://github.com/jupyter/notebook/pull/2854)). - Update error handling on apihandlers ([2853](https://github.com/jupyter/notebook/pull/2853)). - Test python 3.6 on travis, drop 3.3 ([2852](https://github.com/jupyter/notebook/pull/2852)). - Avoid base64-literals in image tests ([2851](https://github.com/jupyter/notebook/pull/2851)). - Upgrade xterm.js to 2.9.2 ([2849](https://github.com/jupyter/notebook/pull/2849)). - Changed all python variables named file to file_name to not override built_in file ([2830](https://github.com/jupyter/notebook/pull/2830)). - Add more doc tests ([2823](https://github.com/jupyter/notebook/pull/2823)). - Typos fix ([2815](https://github.com/jupyter/notebook/pull/2815)). - Rename and update license \[ci skip\] ([2810](https://github.com/jupyter/notebook/pull/2810)). - Travis builds doc ([2808](https://github.com/jupyter/notebook/pull/2808)). - Pull request i18n ([2804](https://github.com/jupyter/notebook/pull/2804)). - Factor out output_prompt_function, as is done with input prompt ([2774](https://github.com/jupyter/notebook/pull/2774)). - Use rfc5987 encoding for filenames ([2767](https://github.com/jupyter/notebook/pull/2767)). - Added path to the resources metadata, the same as in from_filename(...) in nbconvert.exporters.py ([2753](https://github.com/jupyter/notebook/pull/2753)). - Make "extrakeys" consistent for notebook and editor ([2745](https://github.com/jupyter/notebook/pull/2745)). - Bidi support ([2357](https://github.com/jupyter/notebook/pull/2357)). Special thanks to [samarsultan](https://github.com/samarsultan) and the Arabic Competence and Globalization Center Team at IBM Egypt for adding RTL (right-to-left) support to the notebook! See the 5.2 milestone on GitHub for a complete list of [issues](https://github.com/jupyter/notebook/issues?utf8=%E2%9C%93&q=is%3Aissue%20milestone%3A5.2) and [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A5.2) involved in this release. ## 5.1.0 - Preliminary i18n implementation ([2140](https://github.com/jupyter/notebook/pull/2140)). - Expose URL with auth token in notebook UI ([2666](https://github.com/jupyter/notebook/pull/2666)). - Fix search background style ([2387](https://github.com/jupyter/notebook/pull/2387)). - List running notebooks without requiring `--allow-root` ([2421](https://github.com/jupyter/notebook/pull/2421)). - Allow session of type other than notebook ([2559](https://github.com/jupyter/notebook/pull/2559)). - Fix search background style ([2387](https://github.com/jupyter/notebook/pull/2387)). - Fix some Markdown styling issues ([2571](https://github.com/jupyter/notebook/pull/2571)), ([2691](https://github.com/jupyter/notebook/pull/2691)) and ([2534](https://github.com/jupyter/notebook/pull/2534)). - Remove keymaps that conflict with non-English keyboards ([2535](https://github.com/jupyter/notebook/pull/2535)). - Add session-specific favicons (notebook, terminal, file) ([2452](https://github.com/jupyter/notebook/pull/2452)). - Add /api/shutdown handler ([2507](https://github.com/jupyter/notebook/pull/2507)). - Include metadata when copying a cell ([2349](https://github.com/jupyter/notebook/pull/2349)). - Stop notebook server from command line ([2388](https://github.com/jupyter/notebook/pull/2388)). - Improve "View" and "Edit" file handling in dashboard ([2449](https://github.com/jupyter/notebook/pull/2449)) and ([2402](https://github.com/jupyter/notebook/pull/2402)). - Provide a promise to replace use of the `app_initialized.NotebookApp` event ([2710](https://github.com/jupyter/notebook/pull/2710)). - Fix disabled collapse/expand output button ([2681](https://github.com/jupyter/notebook/pull/2681)). - Cull idle kernels using `--MappingKernelManager.cull_idle_timeout` ([2215](https://github.com/jupyter/notebook/pull/2215)). - Allow read-only notebooks to be trusted ([2718](https://github.com/jupyter/notebook/pull/2718)). See the 5.1 milestone on GitHub for a complete list of [issues](https://github.com/jupyter/notebook/issues?utf8=%E2%9C%93&q=is%3Aissue%20milestone%3A5.1) and [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A5.1) involved in this release. ## 5.0.0 This is the first major release of the Jupyter Notebook since version 4.0 was created by the "Big Split" of IPython and Jupyter. We encourage users to start trying JupyterLab in preparation for a future transition. We have merged more than 300 pull requests since 4.0. Some of the major user-facing changes are described here. ### File sorting in the dashboard Files in the dashboard may now be sorted by last modified date or name ([943](https://github.com/jupyter/notebook/pull/943)): ### Cell tags There is a new cell toolbar for adding _cell tags_ ([2048](https://github.com/jupyter/notebook/pull/2048)): Cell tags are a lightweight way to customise the behaviour of tools working with notebooks; we're working on building support for them into tools like [nbconvert](https://nbconvert.readthedocs.io/en/latest/) and [nbval](https://github.com/computationalmodelling/nbval). To start using tags, select `Tags` in the `View > Cell Toolbar` menu in a notebook. The UI for editing cell tags is basic for now; we hope to improve it in future releases. ### Table style The default styling for tables in the notebook has been updated ([1776](https://github.com/jupyter/notebook/pull/1776)). ### Customise keyboard shortcuts You can now edit keyboard shortcuts for _Command Mode_ within the UI ([1347](https://github.com/jupyter/notebook/pull/1347)): See the `Help > Edit Keyboard Shortcuts` menu item and follow the instructions. ### Other additions - You can copy and paste cells between notebooks, using `Ctrl-C`{.interpreted-text role="kbd"} and `Ctrl-V`{.interpreted-text role="kbd"} (`Cmd-C`{.interpreted-text role="kbd"} and `Cmd-V`{.interpreted-text role="kbd"} on Mac). - It's easier to configure a password for the notebook with the new `jupyter notebook password` command ([2007](https://github.com/jupyter/notebook/pull/2007)). - The file list can now be ordered by _last modified_ or by _name_ ([943](https://github.com/jupyter/notebook/pull/943)). - Markdown cells now support attachments. Simply drag and drop an image from your desktop to a markdown cell to add it. Unlike relative links that you enter manually, attachments are embedded in the notebook itself. An unreferenced attachment will be automatically scrubbed from the notebook on save ([621](https://github.com/jupyter/notebook/pull/621)). - Undoing cell deletion now supports undeleting multiple cells. Cells may not be in the same order as before their deletion, depending on the actions you did on the meantime, but this should should help reduce the impact of accidentally deleting code. - The file browser now has _Edit_ and _View_ buttons. - The file browser now supports moving multiple files at once ([1088](https://github.com/jupyter/notebook/pull/1088)). - The Notebook will refuse to run as root unless the `--allow-root` flag is given ([1115](https://github.com/jupyter/notebook/pull/1115)). - Keyboard shortcuts are now declarative ([1234](https://github.com/jupyter/notebook/pull/1234)). - Toggling line numbers can now affect all cells ([1312](https://github.com/jupyter/notebook/pull/1312)). - Add more visible _Trusted_ and _Untrusted_ notifications ([1658](https://github.com/jupyter/notebook/pull/1658)). - The favicon (browser shortcut icon) now changes to indicate when the kernel is busy ([1837](https://github.com/jupyter/notebook/pull/1837)). - Header and toolbar visibility is now persisted in nbconfig and across sessions ([1769](https://github.com/jupyter/notebook/pull/1769)). - Load server extensions with ConfigManager so that merge happens recursively, unlike normal config values, to make it load more consistently with frontend extensions([2108](https://github.com/jupyter/notebook/pull/2108)). - The notebook server now supports the bundler API from the [jupyter_cms incubator project](https://github.com/jupyter-incubator/contentmanagement) ([1579](https://github.com/jupyter/notebook/pull/1579)). - The notebook server now provides information about kernel activity in its kernel resource API ([1827](https://github.com/jupyter/notebook/pull/1827)). Remember that upgrading `notebook` only affects the user interface. Upgrading kernels and libraries may also provide new features, better stability and integration with the notebook interface. ## 4.4.0 - Allow override of output callbacks to redirect output messages. This is used to implement the ipywidgets Output widget, for example. - Fix an async bug in message handling by allowing comm message handlers to return a promise which halts message processing until the promise resolves. See the 4.4 milestone on GitHub for a complete list of [issues](https://github.com/jupyter/notebook/issues?utf8=%E2%9C%93&q=is%3Aissue%20milestone%3A4.4) and [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A4.4) involved in this release. ## 4.3.2 4.3.2 is a patch release with a bug fix for CodeMirror and improved handling of the "editable" cell metadata field. - Monkey-patch for CodeMirror that resolves [#2037](https://github.com/jupyter/notebook/issues/2037) without breaking [#1967](https://github.com/jupyter/notebook/issues/1967) - Read-only (`"editable": false`) cells can be executed but cannot be split, merged, or deleted See the 4.3.2 milestone on GitHub for a complete list of [issues](https://github.com/jupyter/notebook/issues?utf8=%E2%9C%93&q=is%3Aissue%20milestone%3A4.3.2) and [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A4.3.2) involved in this release. ## 4.3.1 4.3.1 is a patch release with a security patch, a couple bug fixes, and improvements to the newly-released token authentication. **Security fix**: - CVE-2016-9971. Fix CSRF vulnerability, where malicious forms could create untitled files and start kernels (no remote execution or modification of existing files) for users of certain browsers (Firefox, Internet Explorer / Edge). All previous notebook releases are affected. Bug fixes: - Fix carriage return handling - Make the font size more robust against fickle browsers - Ignore resize events that bubbled up and didn't come from window - Add Authorization to allowed CORS headers - Downgrade CodeMirror to 5.16 while we figure out issues in Safari Other improvements: - Better docs for token-based authentication - Further highlight token info in log output when autogenerated See the 4.3.1 milestone on GitHub for a complete list of [issues](https://github.com/jupyter/notebook/issues?utf8=%E2%9C%93&q=is%3Aissue%20milestone%3A4.3.1) and [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A4.3.1) involved in this release. ## 4.3.0 4.3 is a minor release with many bug fixes and improvements. The biggest user-facing change is the addition of token authentication, which is enabled by default. A token is generated and used when your browser is opened automatically, so you shouldn't have to enter anything in the default circumstances. If you see a login page (e.g. by switching browsers, or launching on a new port with `--no-browser`), you get a login URL with the token from the command `jupyter notebook list`, which you can paste into your browser. Highlights: - API for creating mime-type based renderer extensions using `OutputArea.register_mime_type` and `Notebook.render_cell_output` methods. See [mimerender-cookiecutter](https://github.com/jupyterlab/mimerender-cookiecutter) for reference implementations and cookiecutter. - Enable token authentication by default. See `server_security`{.interpreted-text role="ref"} for more details. - Update security docs to reflect new signature system - Switched from term.js to xterm.js Bug fixes: - Ensure variable is set if exc_info is falsey - Catch and log handler exceptions in `events.trigger` - Add debug log for static file paths - Don't check origin on token-authenticated requests - Remove leftover print statement - Fix highlighting of Python code blocks - `json_errors` should be outermost decorator on API handlers - Fix remove old nbserver info files - Fix notebook mime type on download links - Fix carriage symbol behavior - Fix terminal styles - Update dead links in docs - If kernel is broken, start a new session - Include cross-origin check when allowing login URL redirects Other improvements: - Allow JSON output data with mime type `application/*+json` - Allow kernelspecs to have spaces in them for backward compat - Allow websocket connections from scripts - Allow `None` for post_save_hook - Upgrade CodeMirror to 5.21 - Upgrade xterm to 2.1.0 - Docs for using comms - Set `dirty` flag when output arrives - Set `ws-url` data attribute when accessing a notebook terminal - Add base aliases for nbextensions - Include `@` operator in CodeMirror IPython mode - Extend mathjax_url docstring - Load nbextension in predictable order - Improve the error messages for nbextensions - Include cross-origin check when allowing login URL redirects See the 4.3 milestone on GitHub for a complete list of [issues](https://github.com/jupyter/notebook/issues?utf8=%E2%9C%93&q=is%3Aissue%20milestone%3A4.3%20) and [pull requests](https://github.com/jupyter/notebook/pulls?utf8=%E2%9C%93&q=is%3Apr%20milestone%3A4.3%20) involved in this release. ## 4.2.3 4.2.3 is a small bugfix release on 4.2. > Highlights: - Fix regression in 4.2.2 that delayed loading custom.js until after `notebook_loaded` and `app_initialized` events have fired. - Fix some outdated docs and links. ## 4.2.2 4.2.2 is a small bugfix release on 4.2, with an important security fix. All users are strongly encouraged to upgrade to 4.2.2. > Highlights: - **Security fix**: CVE-2016-6524, where untrusted latex output could be added to the page in a way that could execute javascript. - Fix missing POST in OPTIONS responses. - Fix for downloading non-ascii filenames. - Avoid clobbering ssl_options, so that users can specify more detailed SSL configuration. - Fix inverted load order in nbconfig, so user config has highest priority. - Improved error messages here and there. ## 4.2.1 4.2.1 is a small bugfix release on 4.2. Highlights: - Compatibility fixes for some versions of ipywidgets - Fix for ignored CSS on Windows - Fix specifying destination when installing nbextensions ## 4.2.0 Release 4.2 adds a new API for enabling and installing extensions. Extensions can now be enabled at the system-level, rather than just per-user. An API is defined for installing directly from a Python package, as well. Highlighted changes: - Upgrade MathJax to 2.6 to fix vertical-bar appearing on some equations. - Restore ability for notebook directory to be root (4.1 regression) - Large outputs are now throttled, reducing the ability of output floods to kill the browser. - Fix the notebook ignoring cell executions while a kernel is starting by queueing the messages. - Fix handling of url prefixes (e.g. JupyterHub) in terminal and edit pages. - Support nested SVGs in output. And various other fixes and improvements. ## 4.1.0 Bug fixes: - Properly reap zombie subprocesses - Fix cross-origin problems - Fix double-escaping of the base URL prefix - Handle invalid unicode filenames more gracefully - Fix ANSI color-processing - Send keepalive messages for web terminals - Fix bugs in the notebook tour UI changes: - Moved the cell toolbar selector into the _View_ menu. Added a button that triggers a "hint" animation to the main toolbar so users can find the new location. (Click here to see a [screencast](https://cloud.githubusercontent.com/assets/335567/10711889/59665a5a-7a3e-11e5-970f-86b89592880c.gif) ) - Added _Restart & Run All_ to the _Kernel_ menu. Users can also bind it to a keyboard shortcut on action `restart-kernel-and-run-all-cells`. - Added multiple-cell selection. Users press `Shift-Up/Down` or `Shift-K/J` to extend selection in command mode. Various actions such as cut/copy/paste, execute, and cell type conversions apply to all selected cells. - Added a command palette for executing Jupyter actions by name. Users press `Cmd/Ctrl-Shift-P` or click the new command palette icon on the toolbar. - Added a _Find and Replace_ dialog to the _Edit_ menu. Users can also press `F` in command mode to show the dialog. Other improvements: - Custom KernelManager methods can be Tornado coroutines, allowing async operations. - Make clearing output optional when rewriting input with `set_next_input(replace=True)`. - Added support for TLS client authentication via `--NotebookApp.client-ca`. - Added tags to `jupyter/notebook` releases on DockerHub. `latest` continues to track the master branch. See the 4.1 milestone on GitHub for a complete list of [issues](https://github.com/jupyter/notebook/issues?page=3&q=milestone%3A4.1+is%3Aclosed+is%3Aissue&utf8=%E2%9C%93) and [pull requests](https://github.com/jupyter/notebook/pulls?q=milestone%3A4.1+is%3Aclosed+is%3Apr) handled. ## 4.0.x ### 4.0.6 - fix installation of mathjax support files - fix some double-escape regressions in 4.0.5 - fix a couple of cases where errors could prevent opening a notebook ### 4.0.5 Security fixes for maliciously crafted files. - [CVE-2015-6938](http://www.openwall.com/lists/oss-security/2015/09/02/3): malicious filenames - [CVE-2015-7337](http://www.openwall.com/lists/oss-security/2015/09/16/3): malicious binary files in text editor. Thanks to Jonathan Kamens at Quantopian and Juan Broullón for the reports. ### 4.0.4 - Fix inclusion of mathjax-safe extension ### 4.0.2 - Fix launching the notebook on Windows - Fix the path searched for frontend config ### 4.0.0 First release of the notebook as a standalone package. ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing to Jupyter Notebook Thanks for contributing to Jupyter Notebook! Make sure to follow [Project Jupyter's Code of Conduct](https://jupyter.org/governance/conduct/code-of-conduct) for a friendly and welcoming collaborative environment. ## Setting up a development environment Note: You will need NodeJS to build the extension package. The `jlpm` command is JupyterLab's pinned version of [yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use `yarn` or `npm` in lieu of `jlpm` below. **Note**: we recommend using `mamba` to speed up the creation of the environment. ```bash # create a new environment mamba create -n notebook -c conda-forge python nodejs -y # activate the environment mamba activate notebook # Install package in development mode pip install -e ".[dev,docs,test]" # Install dependencies and build packages jlpm jlpm build # Link the notebook extension and @jupyter-notebook schemas jlpm develop # Enable the server extension jupyter server extension enable notebook ``` `notebook` follows a monorepo structure. To build all the packages at once: ```bash jlpm build ``` There is also a `watch` script to watch for changes and rebuild the app automatically: ```bash jlpm watch ``` To make sure the `notebook` server extension is installed: ```bash $ jupyter server extension list Config dir: /home/username/.jupyter Config dir: /home/username/miniforge3/envs/notebook/etc/jupyter jupyterlab enabled - Validating jupyterlab... jupyterlab 3.0.0 OK notebook enabled - Validating notebook... notebook 7.0.0a0 OK Config dir: /usr/local/etc/jupyter ``` Then start Jupyter Notebook with: ```bash jupyter notebook ``` ### Local changes in Notebook dependencies The development installation described above fetches JavaScript dependencies from `npm`, according to the versions in the _package.json_ file. However, it is sometimes useful to be able to test changes in Notebook, with dependencies (e.g. `@jupyterlab` packages) that have not yet been published. [yalc](https://github.com/wclr/yalc) can help you use local JavaScript packages when building Notebook, acting as a local package repository. - Install yalc globally in your environment: `npm install -g yalc` - Publish your dependency package:\ `yalc publish`, from the package root directory.\ For instance, if you are developing on _@jupyterlab/ui-components_, this command must be executed from _path_to_jupyterlab/packages/ui-components_. - Depend on this local repository in Notebook: - from the Notebook root directory:\ `yalc add your_package` : this will create a _dependencies_ entry in the main _package.json_ file.\ With the previous example, it would be `yalc add @jupyterlab/ui-components`. - Notebook is a monorepo, so we want this dependency to be 'linked' as a resolution (for all sub-packages) instead of a dependency.\ The easiest way is to manually move the new entry in _package.json_ from _dependencies_ to _resolutions_. - Build Notebook with the local dependency:\ `jlpm install && jlpm build` Changes in the dependency must then be built and pushed using `jlpm build && yalc push` (from the package root directory), and fetched from Notebook using `yarn install`. **Warning**: you need to make sure that the dependencies of Notebook and the local package match correctly, otherwise there will be errors with webpack during build.\ In the previous example, both _@jupyterlab/ui-components_ and Notebook depend on _@jupyterlab/coreutils_. We strongly advise you to depend on the same version. ## Running Tests To run the tests: ```bash jlpm run build:test jlpm run test ``` There are also end to end tests to cover higher level user interactions, located in the `ui-tests` folder. To run these tests: ```bash cd ui-tests #install required packages for jlpm jlpm #install playwright jlpm playwright install # start a new Jupyter server in a terminal jlpm start # in a new terminal, run the tests jlpm test ``` The `test` script calls the Playwright test runner. You can pass additional arguments to `playwright` by appending parameters to the command. For example to run the test in headed mode, `jlpm test --headed`. Check out the [Playwright Command Line Reference](https://playwright.dev/docs/test-cli/) for more information about the available command line options. Running the end to end tests in headful mode will trigger something like the following: ![playwright-headed-demo](https://user-images.githubusercontent.com/591645/141274633-ca9f9c2f-eef6-430e-9228-a35827f8133d.gif) ## Tasks caching The repository is configured to use the Lerna caching system (via `nx`) for some of the development scripts. This helps speed up rebuilds when running `jlpm run build` multiple times to avoid rebuilding packages that have not changed on disk. You can generate a graph to have a better idea of the dependencies between all the packages using the following command: ``` npx nx graph ``` Running the command will open a browser tab by default with a graph that looks like the following: ![a screenshot showing the nx task graph](https://github.com/jupyter/notebook/assets/591645/34eb46f0-b0e5-44b6-9430-ae5fbd673a4b) To learn more about Lerna caching: - https://lerna.js.org/docs/features/cache-tasks - https://nx.dev/docs/features/cache-task-results ### Updating reference snapshots Often a PR might make changes to the user interface, which can cause the visual regression tests to fail. If you want to update the reference snapshots while working on a PR you can post the following sentence as a GitHub comment: ``` bot please update playwright snapshots ``` This will trigger a GitHub Action that will run the UI tests automatically and push new commits to the branch if the reference snapshots have changed. ## Code Styling All non-python source code is formatted using [prettier](https://prettier.io) and python source code is formatted using [black](https://github.com/psf/black). When code is modified and committed, all staged files will be automatically formatted using pre-commit git hooks (with help from [pre-commit](https://github.com/pre-commit/pre-commit). The benefit of using code formatters like `prettier` and `black` is that it removes the topic of code style from the conversation when reviewing pull requests, thereby speeding up the review process. As long as your code is valid, the pre-commit hook should take care of how it should look. `pre-commit` and its associated hooks will automatically be installed when you run `pip install -e ".[dev,test]"` To install `pre-commit` manually, run the following: ```shell pip install pre-commit pre-commit install ``` You can invoke the pre-commit hook by hand at any time with: ```shell pre-commit run ``` which should run any autoformatting on your code and tell you about any errors it couldn't fix automatically. You may also install [black integration](https://github.com/psf/black#editor-integration) into your text editor to format code automatically. If you have already committed files before setting up the pre-commit hook with `pre-commit install`, you can fix everything up using `pre-commit run --all-files`. You need to make the fixing commit yourself after that. You may also use the prettier npm script (e.g. `npm run prettier` or `yarn prettier` or `jlpm prettier`) to format the entire code base. We recommend installing a prettier extension for your code editor and configuring it to format your code with a keyboard shortcut, or automatically on save. Some of the hooks only run on CI by default, but you can invoke them by running with the `--hook-stage manual` argument. ## Documentation First make sure you have set up a development environment as described above. Then run the following command to build the docs: ```shell hatch run docs:build ``` In a separate terminal window, run the following command to serve the documentation: ```shell hatch run docs:serve ``` Now open a web browser and navigate to `http://localhost:8000` to access the documentation. ## Contributing from the browser Alternatively you can also contribute to Jupyter Notebook without setting up a local environment, directly from a web browser: - [GitHub CodeSpaces](https://github.com/codespaces) is directly integrated into GitHub. This repository uses the [pixi](https://pixi.sh/) package manager to set up the development environment. To contribute after the Codespace is started: - Run `pixi shell` in a terminal to activate the development environment - Use the commands above for building the extension and running the tests, for example: `jlpm build` - To start the application: `pixi run start`. A popup should appear with a button to open the Jupyter Notebook in a new browser tab. If the popup does not appear, you can navigate to the "Forwarded ports" panel to find the URL to the application. - GitHub's [built-in editor](https://docs.github.com/en/repositories/working-with-files/managing-files/editing-files) is suitable for contributing small fixes. - A more advanced [github.dev](https://docs.github.com/en/codespaces/the-githubdev-web-based-editor) editor can be accessed by pressing the dot (.) key while in the Jupyter Notebook GitHub repository ================================================ FILE: LICENSE ================================================ BSD 3-Clause License - Copyright (c) 2001-2015, IPython Development Team - Copyright (c) 2015-, Jupyter Development Team All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ================================================ FILE: README.md ================================================ # Jupyter Notebook ![Github Actions Status](https://github.com/jupyter/notebook/workflows/Build/badge.svg) [![Documentation Status](https://readthedocs.org/projects/jupyter-notebook/badge/?version=latest)](https://jupyter-notebook.readthedocs.io/en/latest/?badge=latest) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/jupyter/notebook/main?urlpath=tree) The Jupyter notebook is a web-based notebook environment for interactive computing. ![Jupyter notebook example](docs/resources/running_code_med.png 'Jupyter notebook example') ## Maintained versions We maintain the **two most recently released major versions of Jupyter Notebook**, Classic Notebook v6 and Notebook v7. Notebook v5 is no longer maintained. All Notebook v5 users are strongly advised to upgrade to Classic Notebook v6 as soon as possible. Upgrading to Notebook v7 may require more work, if you use custom extensions, as extensions written for Notebook v5 or Classic Notebook v6 are not compatible with Notebook v7. ### Notebook v7 The newest major version of Notebook is based on: - JupyterLab components for the frontend - Jupyter Server for the Python server This represents a significant change to the `jupyter/notebook` code base. To learn more about Notebook v7: https://jupyter.org/enhancement-proposals/79-notebook-v7/notebook-v7.html ### Classic Notebook v6 Maintenance and security-related issues [only](https://github.com/jupyter/notebook-team-compass/issues/5#issuecomment-1085254000) are now being addressed in the [`6.5.x`](https://github.com/jupyter/notebook/tree/6.5.x) branch. It depends on [`nbclassic`](https://github.com/jupyter/nbclassic) for the HTML/JavaScript/CSS assets. New features and continuous improvement is now focused on Notebook v7 (see section above). If you have an open pull request with a new feature or if you were planning to open one, we encourage switching over to the Jupyter Server and JupyterLab architecture, and distribute it as a server extension and / or JupyterLab prebuilt extension. That way your new feature will also be compatible with the new Notebook v7. ## Jupyter notebook, the language-agnostic evolution of IPython notebook Jupyter notebook is a language-agnostic HTML notebook application for Project Jupyter. In 2015, Jupyter notebook was released as a part of The Big Split™ of the IPython codebase. IPython 3 was the last major monolithic release containing both language-agnostic code, such as the _IPython notebook_, and language specific code, such as the _IPython kernel for Python_. As computing spans across many languages, Project Jupyter will continue to develop the language-agnostic **Jupyter notebook** in this repo and with the help of the community develop language specific kernels which are found in their own discrete repos. - [The Big Split™ announcement](https://blog.jupyter.org/the-big-split-9d7b88a031a7) - [Jupyter Ascending blog post](https://blog.jupyter.org/jupyter-ascending-1bf5b362d97e) ## Installation You can find the installation documentation for the [Jupyter platform, on ReadTheDocs](https://jupyter.readthedocs.io/en/latest/install.html). The documentation for advanced usage of Jupyter notebook can be found [here](https://jupyter-notebook.readthedocs.io/en/latest/). For a local installation, make sure you have [pip installed](https://pip.readthedocs.io/en/stable/installing/) and run: ```bash pip install notebook ``` ## Usage - Running Jupyter notebook ### Running in a local installation Launch with: ```bash jupyter notebook ``` ### Running in a remote installation You need some configuration before starting Jupyter notebook remotely. See [Running a notebook server](https://jupyter-server.readthedocs.io/en/latest/operators/public-server.html). ## Development Installation See [`CONTRIBUTING.md`](CONTRIBUTING.md) for how to set up a local development installation. ## Contributing If you are interested in contributing to the project, see [`CONTRIBUTING.md`](CONTRIBUTING.md). ## Community Guidelines and Code of Conduct This repository is a Jupyter project and follows the Jupyter [Community Guides and Code of Conduct](https://jupyter.readthedocs.io/en/latest/community/content-community.html). ## Resources - [Project Jupyter website](https://jupyter.org) - [Online Demo at jupyter.org/try](https://jupyter.org/try) - [Documentation for Jupyter notebook](https://jupyter-notebook.readthedocs.io/en/latest/) - [Korean Version of Installation](https://github.com/ChungJooHo/Jupyter_Kor_doc/) - [Documentation for Project Jupyter](https://jupyter.readthedocs.io/en/latest/index.html) - [Issues](https://github.com/jupyter/notebook/issues) - [Technical support - Jupyter Google Group](https://discourse.jupyter.org/) ## About the Jupyter Development Team The Jupyter Development Team is the set of all contributors to the Jupyter project. This includes all of the Jupyter subprojects. The core team that coordinates development on GitHub can be found here: https://github.com/jupyter/. ## Our Copyright Policy Jupyter uses a shared copyright model. Each contributor maintains copyright over their contributions to Jupyter. But, it is important to note that these contributions are typically only changes to the repositories. Thus, the Jupyter source code, in its entirety is not the copyright of any single person or institution. Instead, it is the collective copyright of the entire Jupyter Development Team. If individual contributors want to maintain a record of what changes/contributions they have specific copyright on, they should indicate their copyright in the commit message of the change, when they commit the change to one of the Jupyter repositories. With this in mind, the following banner should be used in any source code file to indicate the copyright and license terms: ``` # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. ``` ================================================ FILE: RELEASE.md ================================================ # Releasing Jupyter Notebook ## Using `jupyter_releaser` The recommended way to make a release is to use [`jupyter_releaser`](https://jupyter-releaser.readthedocs.io/en/latest/get_started/making_release_from_repo.html). ## Manual Release To create a manual release, perform the following steps: ### Set up ```bash pip install hatch twine git pull origin $(git branch --show-current) git clean -dffx ``` ### Update the version and apply the tag ```bash echo "Enter new version" read new_version hatch version ${new_version} git tag -a ${new_version} -m "Release ${new_version}" ``` ### Build the artifacts ```bash rm -rf dist hatch build ``` ### Publish the artifacts to pypi ```bash twine check dist/* twine upload dist/* ``` ================================================ FILE: app/index.template.js ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. // Inspired by: https://github.com/jupyterlab/jupyterlab/blob/master/dev_mode/index.js import { PageConfig, URLExt } from '@jupyterlab/coreutils'; import { PluginRegistry } from '@lumino/coreutils'; require('./style.js'); require('./extraStyle.js'); function loadScript(url) { return new Promise((resolve, reject) => { const newScript = document.createElement('script'); newScript.onerror = reject; newScript.onload = resolve; newScript.async = true; document.head.appendChild(newScript); newScript.src = url; }); } async function loadComponent(url, scope) { await loadScript(url); // From MIT-licensed https://github.com/module-federation/module-federation-examples/blob/af043acd6be1718ee195b2511adf6011fba4233c/advanced-api/dynamic-remotes/app1/src/App.js#L6-L12 // eslint-disable-next-line no-undef await __webpack_init_sharing__('default'); const container = window._JUPYTERLAB[scope]; // Initialize the container, it may provide shared modules and may need ours // eslint-disable-next-line no-undef await container.init(__webpack_share_scopes__.default); } async function createModule(scope, module) { try { const factory = await window._JUPYTERLAB[scope].get(module); const instance = factory(); instance.__scope__ = scope; return instance; } catch (e) { console.warn( `Failed to create module: package: ${scope}; module: ${module}` ); throw e; } } /** * The main function */ async function main() { const mimeExtensionsMods = [ {{#each notebook_mime_extensions}} require('{{ @key }}'), {{/each}} ]; const mimeExtensions = await Promise.all(mimeExtensionsMods); // Load the base plugins available on all pages let baseMods = [ {{#each notebook_plugins}} {{#if (ispage @key '/')}} {{{ list_plugins }}} {{/if}} {{/each}} ]; const page = `/${PageConfig.getOption('notebookPage')}`; switch (page) { {{#each notebook_plugins}} {{#unless (ispage @key '/')}} // list all the other plugins grouped by page case '{{ @key }}': { baseMods = baseMods.concat([ {{{ list_plugins }}} ]); break; } {{/unless}} {{/each}} } // populate the list of disabled extensions const disabled = []; const availablePlugins = []; /** * Iterate over active plugins in an extension. * * #### Notes * This also populates the disabled */ function* activePlugins(extension) { // Handle commonjs or es2015 modules let exports; if (Object.prototype.hasOwnProperty.call(extension, '__esModule')) { exports = extension.default; } else { // CommonJS exports. exports = extension; } let plugins = Array.isArray(exports) ? exports : [exports]; for (let plugin of plugins) { const isDisabled = PageConfig.Extension.isDisabled(plugin.id); availablePlugins.push({ id: plugin.id, description: plugin.description, requires: plugin.requires ?? [], optional: plugin.optional ?? [], provides: plugin.provides ?? null, autoStart: plugin.autoStart, enabled: !isDisabled, extension: extension.__scope__ }); if (isDisabled) { disabled.push(plugin.id); continue; } yield plugin; } } const extension_data = JSON.parse( PageConfig.getOption('federated_extensions') ); const mods = []; const federatedExtensionPromises = []; const federatedMimeExtensionPromises = []; const federatedStylePromises = []; const extensions = await Promise.allSettled( extension_data.map(async data => { await loadComponent( `${URLExt.join( PageConfig.getOption('fullLabextensionsUrl'), data.name, data.load )}`, data.name ); return data; }) ); extensions.forEach(p => { if (p.status === 'rejected') { // There was an error loading the component console.error(p.reason); return; } const data = p.value; if (data.extension) { federatedExtensionPromises.push(createModule(data.name, data.extension)); } if (data.mimeExtension) { federatedMimeExtensionPromises.push( createModule(data.name, data.mimeExtension) ); } if (data.style && !PageConfig.Extension.isDisabled(data.name)) { federatedStylePromises.push(createModule(data.name, data.style)); } }); // Add the base frontend extensions const baseFrontendMods = await Promise.all(baseMods); baseFrontendMods.forEach(p => { for (let plugin of activePlugins(p)) { mods.push(plugin); } }); // Add the federated extensions. const federatedExtensions = await Promise.allSettled( federatedExtensionPromises ); federatedExtensions.forEach(p => { if (p.status === 'fulfilled') { for (let plugin of activePlugins(p.value)) { mods.push(plugin); } } else { console.error(p.reason); } }); // Add the federated mime extensions. const federatedMimeExtensions = await Promise.allSettled( federatedMimeExtensionPromises ); federatedMimeExtensions.forEach(p => { if (p.status === 'fulfilled') { for (let plugin of activePlugins(p.value)) { mimeExtensions.push(plugin); } } else { console.error(p.reason); } }); // Load all federated component styles and log errors for any that do not (await Promise.allSettled(federatedStylePromises)) .filter(({ status }) => status === 'rejected') .forEach(({ reason }) => { console.error(reason); }); // Set the list of base notebook multi-page plugins so the app is aware of all // its built-in plugins even if they are not loaded on the current page. // For example this is useful so the Settings Editor can list the debugger // plugin even if the debugger is only loaded on the notebook page. PageConfig.setOption('allPlugins', '{{{ json notebook_plugins }}}'); const pluginRegistry = new PluginRegistry(); const NotebookApp = require('@jupyter-notebook/application').NotebookApp; pluginRegistry.registerPlugins(mods); const IServiceManager = require('@jupyterlab/services').IServiceManager; const serviceManager = await pluginRegistry.resolveRequiredService(IServiceManager); const app = new NotebookApp({ pluginRegistry, serviceManager, mimeExtensions, availablePlugins }); // Expose global app instance when in dev mode or when toggled explicitly. const exposeAppInBrowser = (PageConfig.getOption('exposeAppInBrowser') || '').toLowerCase() === 'true'; if (exposeAppInBrowser) { window.jupyterapp = app; } await app.start(); } window.addEventListener('load', main); ================================================ FILE: app/package.json ================================================ { "name": "@jupyter-notebook/app", "version": "7.6.0-alpha.4", "private": true, "scripts": { "build": "rspack", "build:prod": "rspack --config ./rspack.prod.config.js", "clean": "rimraf build && jlpm run clean:static", "clean:static": "rimraf -g \"../notebook/static/!(favicons)\"", "watch": "rspack --watch --config rspack.config.js" }, "resolutions": { "@codemirror/state": "~6.5.4", "@codemirror/view": "~6.39.15", "@jupyter-notebook/application": "~7.6.0-alpha.4", "@jupyter-notebook/application-extension": "~7.6.0-alpha.4", "@jupyter-notebook/console-extension": "~7.6.0-alpha.4", "@jupyter-notebook/docmanager-extension": "~7.6.0-alpha.4", "@jupyter-notebook/documentsearch-extension": "~7.6.0-alpha.4", "@jupyter-notebook/help-extension": "~7.6.0-alpha.4", "@jupyter-notebook/notebook-extension": "~7.6.0-alpha.4", "@jupyter-notebook/terminal-extension": "~7.6.0-alpha.4", "@jupyter-notebook/tree": "~7.6.0-alpha.4", "@jupyter-notebook/tree-extension": "~7.6.0-alpha.4", "@jupyter-notebook/ui-components": "~7.6.0-alpha.4", "@jupyter/react-components": "~0.16.7", "@jupyter/web-components": "~0.16.7", "@jupyter/ydoc": "~3.1.0", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/application-extension": "~4.6.0-alpha.4", "@jupyterlab/apputils": "~4.7.0-alpha.4", "@jupyterlab/apputils-extension": "~4.6.0-alpha.4", "@jupyterlab/attachments": "~4.6.0-alpha.4", "@jupyterlab/audio-extension": "~4.6.0-alpha.4", "@jupyterlab/cell-toolbar": "~4.6.0-alpha.4", "@jupyterlab/cell-toolbar-extension": "~4.6.0-alpha.4", "@jupyterlab/celltags-extension": "~4.6.0-alpha.4", "@jupyterlab/codeeditor": "~4.6.0-alpha.4", "@jupyterlab/codemirror": "~4.6.0-alpha.4", "@jupyterlab/codemirror-extension": "~4.6.0-alpha.4", "@jupyterlab/completer": "~4.6.0-alpha.4", "@jupyterlab/completer-extension": "~4.6.0-alpha.4", "@jupyterlab/console": "~4.6.0-alpha.4", "@jupyterlab/console-extension": "~4.6.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/csvviewer-extension": "~4.6.0-alpha.4", "@jupyterlab/debugger": "~4.6.0-alpha.4", "@jupyterlab/debugger-extension": "~4.6.0-alpha.4", "@jupyterlab/docmanager": "~4.6.0-alpha.4", "@jupyterlab/docmanager-extension": "~4.6.0-alpha.4", "@jupyterlab/documentsearch": "~4.6.0-alpha.4", "@jupyterlab/documentsearch-extension": "~4.6.0-alpha.4", "@jupyterlab/extensionmanager": "~4.6.0-alpha.4", "@jupyterlab/extensionmanager-extension": "~4.6.0-alpha.4", "@jupyterlab/filebrowser": "~4.6.0-alpha.4", "@jupyterlab/filebrowser-extension": "~4.6.0-alpha.4", "@jupyterlab/fileeditor": "~4.6.0-alpha.4", "@jupyterlab/fileeditor-extension": "~4.6.0-alpha.4", "@jupyterlab/help-extension": "~4.6.0-alpha.4", "@jupyterlab/htmlviewer": "~4.6.0-alpha.4", "@jupyterlab/htmlviewer-extension": "~4.6.0-alpha.4", "@jupyterlab/hub-extension": "~4.6.0-alpha.4", "@jupyterlab/imageviewer": "~4.6.0-alpha.4", "@jupyterlab/imageviewer-extension": "~4.6.0-alpha.4", "@jupyterlab/javascript-extension": "~4.6.0-alpha.4", "@jupyterlab/json-extension": "~4.6.0-alpha.4", "@jupyterlab/logconsole-extension": "~4.6.0-alpha.4", "@jupyterlab/lsp": "~4.6.0-alpha.4", "@jupyterlab/lsp-extension": "~4.6.0-alpha.4", "@jupyterlab/mainmenu": "~4.6.0-alpha.4", "@jupyterlab/mainmenu-extension": "~4.6.0-alpha.4", "@jupyterlab/markdownviewer": "~4.6.0-alpha.4", "@jupyterlab/markdownviewer-extension": "~4.6.0-alpha.4", "@jupyterlab/markedparser-extension": "~4.6.0-alpha.4", "@jupyterlab/mathjax-extension": "~4.6.0-alpha.4", "@jupyterlab/mermaid": "~4.6.0-alpha.4", "@jupyterlab/mermaid-extension": "~4.6.0-alpha.4", "@jupyterlab/metadataform": "~4.6.0-alpha.4", "@jupyterlab/metadataform-extension": "~4.6.0-alpha.4", "@jupyterlab/notebook": "~4.6.0-alpha.4", "@jupyterlab/notebook-extension": "~4.6.0-alpha.4", "@jupyterlab/observables": "~5.6.0-alpha.4", "@jupyterlab/outputarea": "~4.6.0-alpha.4", "@jupyterlab/pdf-extension": "~4.6.0-alpha.4", "@jupyterlab/pluginmanager-extension": "~4.6.0-alpha.4", "@jupyterlab/rendermime": "~4.6.0-alpha.4", "@jupyterlab/rendermime-interfaces": "~3.14.0-alpha.4", "@jupyterlab/running-extension": "~4.6.0-alpha.4", "@jupyterlab/services": "~7.6.0-alpha.4", "@jupyterlab/services-extension": "~4.6.0-alpha.4", "@jupyterlab/settingeditor": "~4.6.0-alpha.4", "@jupyterlab/settingeditor-extension": "~4.6.0-alpha.4", "@jupyterlab/settingregistry": "~4.6.0-alpha.4", "@jupyterlab/shortcuts-extension": "~5.4.0-alpha.4", "@jupyterlab/statedb": "~4.6.0-alpha.4", "@jupyterlab/statusbar": "~4.6.0-alpha.4", "@jupyterlab/terminal": "~4.6.0-alpha.4", "@jupyterlab/terminal-extension": "~4.6.0-alpha.4", "@jupyterlab/theme-dark-extension": "~4.6.0-alpha.4", "@jupyterlab/theme-dark-high-contrast-extension": "~4.6.0-alpha.4", "@jupyterlab/theme-light-extension": "~4.6.0-alpha.4", "@jupyterlab/toc-extension": "~6.6.0-alpha.4", "@jupyterlab/tooltip": "~4.6.0-alpha.4", "@jupyterlab/tooltip-extension": "~4.6.0-alpha.4", "@jupyterlab/translation": "~4.6.0-alpha.4", "@jupyterlab/translation-extension": "~4.6.0-alpha.4", "@jupyterlab/ui-components": "~4.6.0-alpha.4", "@jupyterlab/ui-components-extension": "~4.6.0-alpha.4", "@jupyterlab/vega5-extension": "~4.6.0-alpha.4", "@jupyterlab/video-extension": "~4.6.0-alpha.4", "@lezer/common": "~1.5.0", "@lezer/highlight": "~1.2.0", "@lumino/algorithm": "~2.0.4", "@lumino/application": "~2.4.8", "@lumino/commands": "~2.3.3", "@lumino/coreutils": "~2.2.2", "@lumino/disposable": "~2.1.5", "@lumino/domutils": "~2.0.4", "@lumino/dragdrop": "~2.1.8", "@lumino/messaging": "~2.0.4", "@lumino/properties": "~2.0.4", "@lumino/signaling": "~2.1.5", "@lumino/virtualdom": "~2.0.4", "@lumino/widgets": "~2.7.5", "react": "~18.2.0", "react-dom": "~18.2.0", "yjs": "~13.6.8" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyter-notebook/application-extension": "^7.6.0-alpha.4", "@jupyter-notebook/console-extension": "^7.6.0-alpha.4", "@jupyter-notebook/docmanager-extension": "^7.6.0-alpha.4", "@jupyter-notebook/documentsearch-extension": "^7.6.0-alpha.4", "@jupyter-notebook/help-extension": "^7.6.0-alpha.4", "@jupyter-notebook/notebook-extension": "^7.6.0-alpha.4", "@jupyter-notebook/terminal-extension": "^7.6.0-alpha.4", "@jupyter-notebook/tree": "^7.6.0-alpha.4", "@jupyter-notebook/tree-extension": "^7.6.0-alpha.4", "@jupyter-notebook/ui-components": "^7.6.0-alpha.4", "@jupyterlab/application-extension": "~4.6.0-alpha.4", "@jupyterlab/apputils-extension": "~4.6.0-alpha.4", "@jupyterlab/attachments": "~4.6.0-alpha.4", "@jupyterlab/audio-extension": "~4.6.0-alpha.4", "@jupyterlab/cell-toolbar-extension": "~4.6.0-alpha.4", "@jupyterlab/celltags-extension": "~4.6.0-alpha.4", "@jupyterlab/codemirror": "~4.6.0-alpha.4", "@jupyterlab/codemirror-extension": "~4.6.0-alpha.4", "@jupyterlab/completer-extension": "~4.6.0-alpha.4", "@jupyterlab/console-extension": "~4.6.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/csvviewer-extension": "~4.6.0-alpha.4", "@jupyterlab/debugger-extension": "~4.6.0-alpha.4", "@jupyterlab/docmanager-extension": "~4.6.0-alpha.4", "@jupyterlab/documentsearch-extension": "~4.6.0-alpha.4", "@jupyterlab/extensionmanager-extension": "~4.6.0-alpha.4", "@jupyterlab/filebrowser-extension": "~4.6.0-alpha.4", "@jupyterlab/fileeditor-extension": "~4.6.0-alpha.4", "@jupyterlab/help-extension": "~4.6.0-alpha.4", "@jupyterlab/htmlviewer-extension": "~4.6.0-alpha.4", "@jupyterlab/hub-extension": "~4.6.0-alpha.4", "@jupyterlab/imageviewer-extension": "~4.6.0-alpha.4", "@jupyterlab/javascript-extension": "~4.6.0-alpha.4", "@jupyterlab/json-extension": "~4.6.0-alpha.4", "@jupyterlab/logconsole-extension": "~4.6.0-alpha.4", "@jupyterlab/lsp": "~4.6.0-alpha.4", "@jupyterlab/lsp-extension": "~4.6.0-alpha.4", "@jupyterlab/mainmenu-extension": "~4.6.0-alpha.4", "@jupyterlab/markdownviewer-extension": "~4.6.0-alpha.4", "@jupyterlab/markedparser-extension": "~4.6.0-alpha.4", "@jupyterlab/mathjax-extension": "~4.6.0-alpha.4", "@jupyterlab/mermaid-extension": "~4.6.0-alpha.4", "@jupyterlab/metadataform-extension": "~4.6.0-alpha.4", "@jupyterlab/notebook-extension": "~4.6.0-alpha.4", "@jupyterlab/pdf-extension": "~4.6.0-alpha.4", "@jupyterlab/pluginmanager-extension": "~4.6.0-alpha.4", "@jupyterlab/running-extension": "~4.6.0-alpha.4", "@jupyterlab/services-extension": "~4.6.0-alpha.4", "@jupyterlab/settingeditor": "~4.6.0-alpha.4", "@jupyterlab/settingeditor-extension": "~4.6.0-alpha.4", "@jupyterlab/shortcuts-extension": "~5.4.0-alpha.4", "@jupyterlab/terminal-extension": "~4.6.0-alpha.4", "@jupyterlab/theme-dark-extension": "~4.6.0-alpha.4", "@jupyterlab/theme-dark-high-contrast-extension": "~4.6.0-alpha.4", "@jupyterlab/theme-light-extension": "~4.6.0-alpha.4", "@jupyterlab/toc-extension": "~6.6.0-alpha.4", "@jupyterlab/tooltip-extension": "~4.6.0-alpha.4", "@jupyterlab/translation-extension": "~4.6.0-alpha.4", "@jupyterlab/ui-components-extension": "~4.6.0-alpha.4", "@jupyterlab/vega5-extension": "~4.6.0-alpha.4", "@jupyterlab/video-extension": "~4.6.0-alpha.4", "@lumino/coreutils": "~2.2.2", "react": "^18.2.0", "react-dom": "^18.2.0", "yjs": "^13.5.40" }, "devDependencies": { "@jupyterlab/builder": "~4.6.0-alpha.4", "@jupyterlab/buildutils": "~4.6.0-alpha.4", "@rspack/cli": "^1.7.1", "@rspack/core": "^1.7.1", "@types/rimraf": "^3.0.2", "fs-extra": "^8.1.0", "glob": "~7.1.6", "handlebars": "^4.7.7", "rimraf": "^3.0.2", "webpack-bundle-analyzer": "^4.8.0", "webpack-merge": "^5.8.0", "whatwg-fetch": "^3.0.0" }, "jupyterlab": { "name": "Jupyter Notebook", "mimeExtensions": { "@jupyterlab/javascript-extension": true, "@jupyterlab/json-extension": true, "@jupyterlab/pdf-extension": true, "@jupyterlab/vega5-extension": true }, "plugins": { "/": { "@jupyter-notebook/application-extension": true, "@jupyter-notebook/console-extension": true, "@jupyter-notebook/docmanager-extension": true, "@jupyter-notebook/documentsearch-extension": true, "@jupyter-notebook/help-extension": true, "@jupyter-notebook/notebook-extension": true, "@jupyter-notebook/terminal-extension": true, "@jupyterlab/application-extension": [ "@jupyterlab/application-extension:context-menu", "@jupyterlab/application-extension:faviconbusy", "@jupyterlab/application-extension:router", "@jupyterlab/application-extension:top-bar", "@jupyterlab/application-extension:top-spacer" ], "@jupyterlab/apputils-extension": [ "@jupyterlab/apputils-extension:kernels-settings", "@jupyterlab/apputils-extension:palette", "@jupyterlab/apputils-extension:notification", "@jupyterlab/apputils-extension:sanitizer", "@jupyterlab/apputils-extension:sessionDialogs", "@jupyterlab/apputils-extension:settings", "@jupyterlab/apputils-extension:state", "@jupyterlab/apputils-extension:themes", "@jupyterlab/apputils-extension:themes-palette-menu", "@jupyterlab/apputils-extension:toolbar-registry", "@jupyterlab/apputils-extension:utilityCommands" ], "@jupyterlab/audio-extension": true, "@jupyterlab/codemirror-extension": true, "@jupyterlab/completer-extension": [ "@jupyterlab/completer-extension:base-service", "@jupyterlab/completer-extension:inline-completer", "@jupyterlab/completer-extension:inline-completer-factory", "@jupyterlab/completer-extension:inline-history", "@jupyterlab/completer-extension:manager" ], "@jupyterlab/console-extension": [ "@jupyterlab/console-extension:cell-executor", "@jupyterlab/console-extension:completer", "@jupyterlab/console-extension:factory", "@jupyterlab/console-extension:foreign", "@jupyterlab/console-extension:tracker" ], "@jupyterlab/csvviewer-extension": true, "@jupyterlab/docmanager-extension": [ "@jupyterlab/docmanager-extension:plugin", "@jupyterlab/docmanager-extension:download", "@jupyterlab/docmanager-extension:contexts", "@jupyterlab/docmanager-extension:manager" ], "@jupyterlab/documentsearch-extension": [ "@jupyterlab/documentsearch-extension:plugin" ], "@jupyterlab/filebrowser-extension": [ "@jupyterlab/filebrowser-extension:factory", "@jupyterlab/filebrowser-extension:default-file-browser" ], "@jupyterlab/fileeditor-extension": [ "@jupyterlab/fileeditor-extension:plugin", "@jupyterlab/fileeditor-extension:widget-factory" ], "@jupyterlab/help-extension": [ "@jupyterlab/help-extension:resources" ], "@jupyterlab/htmlviewer-extension": true, "@jupyterlab/hub-extension": true, "@jupyterlab/imageviewer-extension": true, "@jupyterlab/lsp-extension": true, "@jupyterlab/mainmenu-extension": [ "@jupyterlab/mainmenu-extension:plugin" ], "@jupyterlab/markedparser-extension": true, "@jupyterlab/mathjax-extension": true, "@jupyterlab/mermaid-extension": true, "@jupyterlab/notebook-extension": [ "@jupyterlab/notebook-extension:cell-executor", "@jupyterlab/notebook-extension:code-console", "@jupyterlab/notebook-extension:export", "@jupyterlab/notebook-extension:factory", "@jupyterlab/notebook-extension:tracker", "@jupyterlab/notebook-extension:widget-factory" ], "@jupyterlab/pluginmanager-extension": true, "@jupyterlab/services-extension": true, "@jupyterlab/shortcuts-extension": true, "@jupyterlab/terminal-extension": true, "@jupyterlab/theme-light-extension": true, "@jupyterlab/theme-dark-extension": true, "@jupyterlab/theme-dark-high-contrast-extension": true, "@jupyterlab/translation-extension": true, "@jupyterlab/ui-components-extension": true, "@jupyterlab/video-extension": true }, "/tree": { "@jupyterlab/application-extension": [ "@jupyterlab/application-extension:commands" ], "@jupyterlab/cell-toolbar-extension": true, "@jupyterlab/extensionmanager-extension": true, "@jupyterlab/filebrowser-extension": [ "@jupyterlab/filebrowser-extension:browser", "@jupyterlab/filebrowser-extension:create-new-language-file", "@jupyterlab/filebrowser-extension:download", "@jupyterlab/filebrowser-extension:file-upload-status", "@jupyterlab/filebrowser-extension:open-with", "@jupyterlab/filebrowser-extension:search", "@jupyterlab/filebrowser-extension:share-file" ], "@jupyter-notebook/tree-extension": true, "@jupyterlab/running-extension": [ "@jupyterlab/running-extension:plugin" ], "@jupyterlab/settingeditor-extension": true }, "/notebooks": { "@jupyterlab/celltags-extension": true, "@jupyterlab/cell-toolbar-extension": true, "@jupyterlab/debugger-extension": [ "@jupyterlab/debugger-extension:completions", "@jupyterlab/debugger-extension:config", "@jupyterlab/debugger-extension:debug-console", "@jupyterlab/debugger-extension:main", "@jupyterlab/debugger-extension:notebooks", "@jupyterlab/debugger-extension:service", "@jupyterlab/debugger-extension:sidebar", "@jupyterlab/debugger-extension:sources", "@jupyterlab/debugger-extension:display-registry" ], "@jupyterlab/logconsole-extension": true, "@jupyterlab/metadataform-extension": true, "@jupyterlab/notebook-extension": [ "@jupyterlab/notebook-extension:active-cell-tool", "@jupyterlab/notebook-extension:completer", "@jupyterlab/notebook-extension:copy-output", "@jupyterlab/notebook-extension:metadata-editor", "@jupyterlab/notebook-extension:search", "@jupyterlab/notebook-extension:toc", "@jupyterlab/notebook-extension:tools", "@jupyterlab/notebook-extension:update-raw-mimetype" ], "@jupyterlab/toc-extension": [ "@jupyterlab/toc-extension:registry", "@jupyterlab/toc-extension:tracker" ], "@jupyterlab/tooltip-extension": [ "@jupyterlab/tooltip-extension:manager", "@jupyterlab/tooltip-extension:notebooks" ] }, "/consoles": { "@jupyterlab/tooltip-extension": [ "@jupyterlab/tooltip-extension:manager", "@jupyterlab/tooltip-extension:consoles" ] }, "/edit": { "@jupyterlab/fileeditor-extension": [ "@jupyterlab/fileeditor-extension:completer", "@jupyterlab/fileeditor-extension:search" ], "@jupyterlab/markdownviewer-extension": true } }, "singletonPackages": [ "@codemirror/state", "@codemirror/view", "@jupyter-notebook/tree", "@jupyter/react-components", "@jupyter/web-components", "@jupyter/ydoc", "@jupyterlab/application", "@jupyterlab/apputils", "@jupyterlab/cell-toolbar", "@jupyterlab/codeeditor", "@jupyterlab/codemirror", "@jupyterlab/completer", "@jupyterlab/console", "@jupyterlab/coreutils", "@jupyterlab/debugger", "@jupyterlab/docmanager", "@jupyterlab/documentsearch", "@jupyterlab/extensionmanager", "@jupyterlab/filebrowser", "@jupyterlab/fileeditor", "@jupyterlab/htmlviewer", "@jupyterlab/imageviewer", "@jupyterlab/lsp", "@jupyterlab/mainmenu", "@jupyterlab/markdownviewer", "@jupyterlab/mermaid", "@jupyterlab/metadataform", "@jupyterlab/notebook", "@jupyterlab/observables", "@jupyterlab/outputarea", "@jupyterlab/rendermime", "@jupyterlab/rendermime-interfaces", "@jupyterlab/services", "@jupyterlab/settingeditor", "@jupyterlab/settingregistry", "@jupyterlab/statedb", "@jupyterlab/statusbar", "@jupyterlab/terminal", "@jupyterlab/tooltip", "@jupyterlab/translation", "@jupyterlab/ui-components", "@lezer/common", "@lezer/highlight", "@lumino/algorithm", "@lumino/application", "@lumino/commands", "@lumino/coreutils", "@lumino/disposable", "@lumino/domutils", "@lumino/dragdrop", "@lumino/messaging", "@lumino/properties", "@lumino/signaling", "@lumino/virtualdom", "@lumino/widgets", "react", "react-dom", "yjs" ] } } ================================================ FILE: app/publicpath.js ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. // We dynamically set the webpack public path based on the page config // settings from the JupyterLab app. We copy some of the pageconfig parsing // logic in @jupyterlab/coreutils below, since this must run before any other // files are loaded (including @jupyterlab/coreutils). /** * Get global configuration data for the Jupyter application. * * @param name - The name of the configuration option. * * @returns The config value or an empty string if not found. * * #### Notes * All values are treated as strings. * For browser based applications, it is assumed that the page HTML * includes a script tag with the id `jupyter-config-data` containing the * configuration as valid JSON. In order to support the classic Notebook, * we fall back on checking for `body` data of the given `name`. */ function getOption(name) { let configData = Object.create(null); // Use script tag if available. if (typeof document !== 'undefined' && document) { const el = document.getElementById('jupyter-config-data'); if (el) { configData = JSON.parse(el.textContent || '{}'); } } return configData[name] || ''; } // eslint-disable-next-line no-undef __webpack_public_path__ = getOption('fullStaticUrl') + '/'; ================================================ FILE: app/rspack.config.js ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. // Heavily inspired (and slightly tweaked) from: // https://github.com/jupyterlab/jupyterlab/blob/master/examples/federated/core_package/rspack.config.js const fs = require('fs-extra'); const path = require('path'); const rspack = require('@rspack/core'); const merge = require('webpack-merge').default; const Handlebars = require('handlebars'); const { ModuleFederationPlugin } = rspack.container; const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; const Build = require('@jupyterlab/builder').Build; const WPPlugin = require('@jupyterlab/builder').WPPlugin; const HtmlWebpackPlugin = require('html-webpack-plugin'); const baseConfig = require('@jupyterlab/builder/lib/webpack.config.base'); const data = require('./package.json'); const names = Object.keys(data.dependencies).filter((name) => { const packageData = require(path.join(name, 'package.json')); return packageData.jupyterlab !== undefined; }); // Ensure a clear build directory. const buildDir = path.resolve(__dirname, 'build'); if (fs.existsSync(buildDir)) { fs.removeSync(buildDir); } fs.ensureDirSync(buildDir); // Handle the extensions. const { mimeExtensions, plugins } = data.jupyterlab; // Create the list of extension packages from the package.json metadata const extensionPackages = new Set(); Object.keys(plugins).forEach((page) => { const pagePlugins = plugins[page]; Object.keys(pagePlugins).forEach((name) => { extensionPackages.add(name); }); }); Handlebars.registerHelper('json', function (context) { return JSON.stringify(context); }); // custom help to check if a page corresponds to a value Handlebars.registerHelper('ispage', function (key, page) { return key === page; }); // custom helper to load the plugins on the index page Handlebars.registerHelper('list_plugins', function () { let str = ''; const page = this; Object.keys(this).forEach((extension) => { const plugin = page[extension]; if (plugin === true) { str += `require(\'${extension}\'),\n `; } else if (Array.isArray(plugin)) { const plugins = plugin.map((p) => `'${p}',`).join('\n'); str += ` require(\'${extension}\').default.filter(({id}) => [ ${plugins} ].includes(id)), `; } }); return str; }); // Create the entry point and other assets in build directory. const source = fs.readFileSync('index.template.js').toString(); const template = Handlebars.compile(source); const extData = { notebook_plugins: plugins, notebook_mime_extensions: mimeExtensions, }; const indexOut = template(extData); fs.writeFileSync(path.join(buildDir, 'index.js'), indexOut); // Copy extra files const cssImports = path.resolve(__dirname, 'style.js'); fs.copySync(cssImports, path.resolve(buildDir, 'extraStyle.js')); const extras = Build.ensureAssets({ packageNames: names, output: buildDir, schemaOutput: path.resolve(__dirname, '..', 'notebook'), }); /** * Create the rspack ``shared`` configuration */ function createShared(packageData) { // Set up module federation sharing config const shared = {}; // Make sure any resolutions are shared for (let [pkg, requiredVersion] of Object.entries(packageData.resolutions)) { shared[pkg] = { requiredVersion }; } // Add any extension packages that are not in resolutions (i.e., installed from npm) for (let pkg of extensionPackages) { if (!shared[pkg]) { shared[pkg] = { requiredVersion: require(`${pkg}/package.json`).version, }; } } // Add dependencies and sharedPackage config from extension packages if they // are not already in the shared config. This means that if there is a // conflict, the resolutions package version is the one that is shared. const extraShared = []; for (let pkg of extensionPackages) { let pkgShared = {}; let { dependencies = {}, jupyterlab: { sharedPackages = {} } = {}, } = require(`${pkg}/package.json`); for (let [dep, requiredVersion] of Object.entries(dependencies)) { if (!shared[dep]) { pkgShared[dep] = { requiredVersion }; } } // Overwrite automatic dependency sharing with custom sharing config for (let [dep, config] of Object.entries(sharedPackages)) { if (config === false) { delete pkgShared[dep]; } else { if ('bundled' in config) { config.import = config.bundled; delete config.bundled; } pkgShared[dep] = config; } } extraShared.push(pkgShared); } // Now merge the extra shared config const mergedShare = {}; for (let sharedConfig of extraShared) { for (let [pkg, config] of Object.entries(sharedConfig)) { // Do not override the basic share config from resolutions if (shared[pkg]) { continue; } // Add if we haven't seen the config before if (!mergedShare[pkg]) { mergedShare[pkg] = config; continue; } // Choose between the existing config and this new config. We do not try // to merge configs, which may yield a config no one wants let oldConfig = mergedShare[pkg]; // if the old one has import: false, use the new one if (oldConfig.import === false) { mergedShare[pkg] = config; } } } Object.assign(shared, mergedShare); // Transform any file:// requiredVersion to the version number from the // imported package. This assumes (for simplicity) that the version we get // importing was installed from the file. for (let [pkg, { requiredVersion }] of Object.entries(shared)) { if (requiredVersion && requiredVersion.startsWith('file:')) { shared[pkg].requiredVersion = require(`${pkg}/package.json`).version; } } // Add singleton package information for (let pkg of packageData.jupyterlab.singletonPackages) { if (shared[pkg]) { shared[pkg].singleton = true; } } return shared; } // Make a bootstrap entrypoint const entryPoint = path.join(buildDir, 'bootstrap.js'); const bootstrap = 'import("./index.js");'; fs.writeFileSync(entryPoint, bootstrap); if (process.env.NODE_ENV === 'production') { baseConfig.mode = 'production'; } if (process.argv.includes('--analyze')) { extras.push(new BundleAnalyzerPlugin()); } const htmlPlugins = []; ['consoles', 'edit', 'error', 'notebooks', 'terminals', 'tree'].forEach( (name) => { htmlPlugins.push( new HtmlWebpackPlugin({ chunksSortMode: 'none', template: path.join( path.resolve('./templates'), `${name}_template.html` ), title: name, filename: path.join( path.resolve(__dirname, '..', 'notebook/templates'), `${name}.html` ), }) ); } ); module.exports = [ merge(baseConfig, { mode: 'development', entry: ['./publicpath.js', './' + path.relative(__dirname, entryPoint)], output: { path: path.resolve(__dirname, '..', 'notebook/static/'), publicPath: '{{page_config.fullStaticUrl}}/', library: { type: 'var', name: ['_JUPYTERLAB', 'CORE_OUTPUT'], }, filename: '[name].[contenthash].js', }, optimization: { splitChunks: { chunks: 'all', cacheGroups: { jlab_core: { test: /[\\/]node_modules[\\/]@(jupyterlab|jupyter-notebook|lumino(?!\/datagrid))[\\/]/, name: 'notebook_core', }, }, }, }, resolve: { fallback: { util: false }, }, plugins: [ ...htmlPlugins, new WPPlugin.JSONLicenseWebpackPlugin({ excludedPackageTest: (packageName) => packageName === '@jupyter-notebook/app', }), new ModuleFederationPlugin({ library: { type: 'var', name: ['_JUPYTERLAB', 'CORE_LIBRARY_FEDERATION'], }, name: 'CORE_FEDERATION', shared: createShared(data), }), ], }), ].concat(extras); const logPath = path.join(buildDir, 'build_log.json'); fs.writeFileSync(logPath, JSON.stringify(module.exports, null, ' ')); ================================================ FILE: app/rspack.config.watch.js ================================================ /* * Copyright (c) Jupyter Development Team. * Distributed under the terms of the Modified BSD License. */ const base = require('./rspack.config'); module.exports = [ { ...base[0], bail: false, watch: true, }, ...base.slice(1), ]; ================================================ FILE: app/rspack.prod.config.js ================================================ /* * Copyright (c) Jupyter Development Team. * Distributed under the terms of the Modified BSD License. */ const merge = require('webpack-merge').default; const config = require('./rspack.config'); const WPPlugin = require('@jupyterlab/builder').WPPlugin; config[0] = merge(config[0], { mode: 'production', devtool: 'source-map', output: { // Add version argument when in production so the Jupyter server // allows caching of files (i.e., does not set the CacheControl header to no-cache to prevent caching static files) filename: '[name].[contenthash].js?v=[contenthash]', }, optimization: { minimize: false, }, plugins: [ new WPPlugin.JSONLicenseWebpackPlugin({ excludedPackageTest: (packageName) => packageName === '@jupyter-notebook/app', }), ], }); module.exports = config; ================================================ FILE: app/style.js ================================================ ================================================ FILE: app/templates/consoles_template.html ================================================ {{page_config['appName'] | e}} - Console {% block favicon %} {% endblock %} {% if custom_css %} {% endif %} {# Copy so we do not modify the page_config with updates. #} {% set page_config_full = page_config.copy() %} {# Set a dummy variable - we just want the side effect of the update. #} {% set _ = page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value to say that we are on the tree page #} {% set _ = page_config_full.update(notebookPage='consoles') %} ================================================ FILE: app/templates/edit_template.html ================================================ {{page_config['appName'] | e}} - Edit {% block favicon %} {% endblock %} {# Copy so we do not modify the page_config with updates. #} {% set page_config_full = page_config.copy() %} {# Set a dummy variable - we just want the side effect of the update. #} {% set _ = page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value to say that we are on the tree page #} {% set _ = page_config_full.update(notebookPage='edit') %} ================================================ FILE: app/templates/error_template.html ================================================ {% block title %}{{page_title | e}}{% endblock %} {% block favicon %}{% endblock %} {% block stylesheet %} {% endblock %} {% block site %}
{% block h1_error %}

{{status_code | e}} : {{status_message | e}}

{% endblock h1_error %} {% block error_detail %} {% if message %}

The error was:

{{message | e}}
{% endif %} {% endblock %} {% endblock %} {% block script %} {% endblock script %} ================================================ FILE: app/templates/notebooks_template.html ================================================ {{page_config['appName'] | e}} - Notebook {% block favicon %} {% endblock %} {% if custom_css %} {% endif %} {# Copy so we do not modify the page_config with updates. #} {% set page_config_full = page_config.copy() %} {# Set a dummy variable - we just want the side effect of the update. #} {% set _ = page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value to say that we are on the tree page #} {% set _ = page_config_full.update(notebookPage='notebooks') %} ================================================ FILE: app/templates/terminals_template.html ================================================ {{page_config['appName'] | e}} - Terminal {% block favicon %} {% endblock %} {% if custom_css %} {% endif %} {# Copy so we do not modify the page_config with updates. #} {% set page_config_full = page_config.copy() %} {# Set a dummy variable - we just want the side effect of the update. #} {% set _ = page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value to say that we are on the tree page #} {% set _ = page_config_full.update(notebookPage='terminals') %} ================================================ FILE: app/templates/tree_template.html ================================================ Home {% block favicon %} {% endblock %} {% if custom_css %} {% endif %} {# Copy so we do not modify the page_config with updates. #} {% set page_config_full = page_config.copy() %} {# Set a dummy variable - we just want the side effect of the update. #} {% set _ = page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} {# Sentinel value to say that we are on the tree page #} {% set _ = page_config_full.update(notebookPage='tree') %} ================================================ FILE: binder/environment.yml ================================================ name: notebook channels: - conda-forge dependencies: - ipywidgets=8 - jupyterlab=4 - jupyterlab-language-pack-fr-FR - matplotlib - numpy - nodejs=20 - python >=3.10,<3.11 - xeus-python ================================================ FILE: binder/example.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Welcome to Jupyter Notebook v7! 👋\n", "\n", "Jupyter Notebook v7 is built using the same components as JupyterLab, and reuses a lot of the work from the JupyterLab community by leveraging the new prebuilt (federated) extension system." ] }, { "attachments": { "212ecd19-156e-48dd-99c7-e2ee7457de6f.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAbQAAACBCAIAAAAnlti7AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4nO3dZ1wTSRsA8GeTUBI6BKmJCEJQQCk2DAgqICoiiqJgh7OcJ1YQO2BH7GA7xXqCnqdiL2AHO2AH7ASxQEBpCYQk+35YzAUIKBAU35v/zw+42czMzmSfzMzObjCrjg6AIAiC1ET62QVAEARpjVBwRBAEkQFTVVX72WVAEARpdTAcx392GRAEQVqdxg+rIyIAw9A/+f+LiJB/8yII0lSN7zliWMuUBAFAvXgEaTUoTXwfOo3lC33lIEgrg65WIwiCyICCI4IgiAwoOCIIgsjQ1DnHZnv//v2pU6e1tLT8/Ib/rDIgCILU56cFx5MnT7158wYATE1Nu3RB93cjCNK6yC045uXlGRkZ1doofp8penMX55cCAEZVI7frRjLsQLykra1FBEctLS15lQFBEERemrrOsea7DsbH37t3z8fHx9XFBQCAXyJI3S9I2QsVpbXfrWWk4DBUkT0WqOr376dpaWmZmZk2o/z/L2TVKoIgP5H8h9XCp8kVR+bVDYsE/HOeIDmmKu0YdcyWX240nZKScuLECTab7ePj87PLgiBIy5JPcBwVEODq4mJkZCRMO1ZxZL70SyQDS0xZDQDEn/PwL++JjfjnPN5mH+XhqygOQ+VSgB+Dy+UWFhb+7FIgCPIjyK3naGRkJHyaTERGSse+FCs3smk3TMu41m7453fCp8mi13eFzy5VHJlP1TIim3aXVxmQnwUvvb93ZVxG+6nrg2x+2jU+BJEr+cw5AgDwS8qi+lA69lVyD64bE+vCP7+rPLVS9CFLZXoiUNUb2DMqKgoA/P39mUym9JawsDDp3TgcTkJCAoPBCAgIkN7CZrOdnJwSExNTU1OJfh+bzR48eDCdTid2i4+Pz83NJXaTTjA9PT0pKYlOpwcFBRFJET1HHR0d4r213iKdBYvFGjx4sKWlpeTVrKwsYkhub2+fkJCQmprq7e397/D8F59zFOfG9m0/89Wk5Fcxrgo/uzAIIhdyWwQuSNlHHbtF2S/qeyIjAGBaxspjtyq5TatKO9bwntnZ2dnZ2Twer9aWWrvxeLzs7Ozc3NxaW7hcblRU1MmTJ2k0GoPBAIDU1NTw8HAOh0PsRqfTs7Ozk5KSaiWYmpqanZ1NvKVhPB4vPDycyMLNzc3Ozo7D4axZsyYlJaXWgRCFSU1N/WaaSAsSf7yyKWzDpaJmfBcJH24fM2BhUqX8CoW0NnILjgpdhjRhgExxGKrQwtOOSUlJHA5n7ty5kZGRkZGRsbGxDAaDz+fHxcUROxC9v9zcXEm4BAAej5eRkQEA9vb2AMBkMsPCwthsNgCw2eywsLCwsDBJtzExMZHoe0ZGRgYEBAQHBxO92oSEBOmYDgCpqalcLjcwMHD37t3oqo48iLhPks/cfS9u3JventsScyqL14zgKHp35+zV558bl29d5cnB5nquGzJF9e+Cl+fcPnM5q7yZOX2T6OUWDwOzyWeLm/LeprRCqye34PidHUYZGhxTNx+fzw8KCpKMcGk0WnBwMADk5uamp6cTW4ioJ93RI16ys7OTjL7rw+PxkpOTdXR0goKCJBuZTCabzebz+UQ6EoWFhf7+/rXG7/9xlafHaVM9d+U3KVLhn0/O9Z6455mwvh0EuclrJ7pbG6orK1C1mLYeE7feLWlFkxcUbRMra0tD1QYeyiR8uHn08GXJRS0deTAVQ5aVVTsdxca/9Zut8Gv6/7+3WkdHh+j9SdDpdDs7OwCQdBWJ4Eh0FQnE38RuDcvKypK5p46ODgBwuVzpjVQqtUmRES+6v2v6gE5G6spUDaNOA2fuf1SKAwBUPljeXYWsM2Dn2+pTR5i10VWdoj/sYJ4YAEQv9wf2ZBlqUhUUlDUZdoPnHs7if02y7NamcQPZnUz1NKiKCkrqRrY+C4/fS9k9d5ijeRs1JSV1Y3vfiPPvvvZoxDknFo3y7NHBWFtFSUFJTd+y1+iIo5llDYWZsmeH5/t2aatJVVbV79B3Uuytwh8elKpexg3vPiDyOm3Agh1HTvy9fdEwcyFPpNSKHg+nZD8n8dL2EYxWcB6SDIbEJJ+c1536swvSarSCRmlhMrt+xEyiZF2OpaWljo5OYWEh0dEjxtTfGciICJucnBxY08mTJwGg1tyo5JpSY+AlKQvde0/e+UTTbVLo7DFdRCkxE9xG7c0RAyjZhmwNteNfWDjr4DsxgOjljuCIFOVBazb6G5EAAFOi0PS6+fw2e17olIHG+efXjh449woxPsN5T88dPpdW1m7AmN+Dp413139/ZtXQbr0mx2Wqd/edMCnAkfbi+NLhATHPifAoyr168HDScwXbQWMmTQka2pWa/fdSv579VtytZ7RX8Xi9t3PAuhTMcfyckIkutEe7p/cbvPZJ1XcftOhVnJ+lnpqSgrK2mcuU/c/4AAD451vr/bsYqyspqelZ9N/wiOipiD9sd1fCMAyjDjssPYkhzjswM+S8xuTjtxLXTPMfNGDQiEmLtuwJcVQCAADhg3VubTWUldWM7P2irnO/Bm5+1qHZA20ZmjR1RrdRG299rt4uen9pVUD3thpUqoax3aQjH6S7caW3l3TTZI5MyBUB78Yq7x6WhppURSU1w05eIQmZkgKJ3ietGNGFoU5V0bfxCjv2kpitrLo914LWZ8s7MQDv+vKBXS0MNamKClQd8z7B8dkVkiwEV4OZZAzDFGyWPKjM3NhHz8hnD6dGV1KYHu1uRldRVKTpdugXmphTqxNHJG6gQVVQpOl18o3cvn6qZydDdaqKns2Q1TeKcADAP+8bRDOaelkAIHp1YKJrJxO6qpKCknT9VJ4aq0n7Wsl4QVz/6v1ltUIV58wS326m2jRVg05DIpM+1Or4ymxfABC8Obl4qJ2RmpIiTcvYymlEbAZxJJWvjs0bZKOvQlUzdvBbnpTXwDyE3KB1F9Xc3d0PHTqUkZFhb29PhMha/c2GsVgsFotVd3uTomFNomexM9c/1B595O6eIXokADxk0BSHgbujd6SPWdmFouwQtnX2CZfVYaFH+674Mn3JFYUBOzeNNia+9EiMgNjj1dfuQRBk2dMh4khC6treHkR8AEy979wdsf0UAaA8YKZt35iScQfTdnkqAwD+sfeQjhPOxh97GTyPRSZ2p1gFxuyZ2Y4EAGLupRC3QRuX/7FpyO0FVuRaRRbn7g+NuI7133br+ERTBQBYGLDI0WnVhs2Xp/3Z7/t6JqQ23QJX7A82Uq96dXTJ9N9/7+B0ZQYzbU3ggjSHjce2dVcvff1Rg0HkS9L123lhcQ8FIGkwpRIX5yX+lVzRa+O8Ptqyuookne6TV0+wVf+cujl08ci5Vlm7vdTxL+dnDZx43XHF9rNdSfc3zwgbHmLxLG6AemXa8kGDN+AjIncvt6Z95uCddCWdCmFO/G8jYsgzz+/0Z5Dxz69vJj9nhu3d7EQryz69PmKcWx4lLX64PlaZtnyQz0by2FUHVzOLktfNC/AsPXl/i4fmv+XBK9/cufKq3fz9W51oZZmHI8N+G8+0Twm1JAMAKHRdcD7OXx/DlNuYUbiXhUKhSFyzH04ydg1eZxdhQCt/vCd0ZuBsO6d/AuhYzcTNFiX86aRUcDV6euS0tAGLl+2aq196dc30JYErXZ6tdZQKBeKCx9duiz22/zOSiX+4HhP2tX4abLAarVBxN9J75F/M+etPbNZ4vidk1sgpJo+PjzP8ty8mq31NsZJLIZ5+8fRJK+PXs6hFpxaN2nX3nQjsyMXJc/oH/GM8I+qIuzbn2PIFPoMEV28u7arcUIGa7xcOjllZWdJrZWpd+mgY0WckRr4EJyenQ4cOpaenBwUFEWNqd3f370+QTqe30AUWUeaxI4+EjEBfu6r3794BAIC5c3fNXcfu3MvHuxhiQO22YOvMk72jp/fNqHwB/bZvHsesPR4Qlhd9rlQ2c+xKhyd5eWU41B1ZqvTwcNaKic/J+YyDAQaAtXHtY0M59fT5KxGwagc/ABK9b0SE71++hw79/XhupG3NDPGPZ45cLdfwHtZb8VN1kXUdnZjYjru3X4j6daqbmgyYmo2nrw0AQA+78ot7Rt95KABjbj6XZNDFw7WrKQWIaQwcoHrizrr2XJnoVdZLnOlvpyd7dERiOA0f4mFMAhezvHNWGy+kV3m5FB7ddFA49sTO6X2oAI4s7qW2IcduVg5wTorZkmm35NGfM9pLyl4JACAuujJ/yB/pfXdfW9Jd8iOe1PbOAzz6KEJfd1eDz1YB6/a/GDrX6GLMlky7xY+2TGlPAujbhfLccvL6I4vdJ9Ya1VDN2J5uvRWhd0/FtFO+F67mh1gaAABgKgYsK+vqwXeb2dcLZ9c5nDZdvYnPXzdW3rH4yDvPhAG9aq6qorbr4ebaSxF6qt7769qNXgEBA8zJ4Kx864DH7du5Ysd2tRPs7ObRx5gErhYfL1pvupBe5eUqsyK/km6FshMxO3L7b7kyf6gWBs6dV948Mfz45eJxo/99jIKs9m1Xcmzjng+9N1ze+JsRCaCSu5O8CwAAzz+2cV+B55Ybq8fqYQB9rCqeWC/fdH7uXz6qDZaouX7JYTWVSoU60ZCY+6ur1jIgAtE3lO7WEZdliEsoWVlZOjo639npIzqY9eXefMI3L94IRW93DG7H+MpszKFCMV5UUFg9VKE5LtwQxCzIyi7rPCtqvMm/bVr5+sSiIXaGKspqOm3oatqD9+XjIBLJHpGQtOlamLikuLQ6UZK6lgYJ55WV13chQNWuaweK6HX26zrT8MK3L94IxUVHJphLitzOa8tLEV7E/e7LCoK3p5YMc2QZ6WjSzX8/XSaorBSBYq/Js7o8Devm4Bu261puxbeSIJFIgH379ydIRqYmCkUFRWIQZj94yn+3c4CWsrKysjLVMOhMefGHD2XCNxkPS5lsZ5PaUV2QPN9/U8nYXbFDDGWdR5h2b/cu8CT9sUD05sHDUqaTc3XTYHQnF2vR4/Rn9c8yKLUzM8b+beFv4z2Ln+3Vpb2Btqae/aKbgsqKynpneEn6RvpYYQGxkInUxqANVvKlpP6MSMZm7Yj6+W6it4+eFH85PsaAqqysrKys5bO/QPDxfYH0B09W+woz0x8Jrfq66teqTWFW+iNhx15OukRbkpi9erUrf5Tx8vsL1DS/ZM/R0tIyIyMjKSlJMvLlcDgNLB5MSEiQvpQcHx/P5/PrXqhhs9mpqakJCQl8Pn/w4MH1pSa9lBIAmEwmg8HIzc1NSEjw9/dv4iE1AMNIQOkQtC3KR1/6RCepW0jCYGn62at5QCYJnyTsvTVjrTPRixHcWzrYb9WrtgOmrvXrYaKOF13fPHvTvXqzIZNJGOBiyTmgoKAAON7ATQJkMqmeH7/BSBiQjYat2TLOQjqgYFST77x/Rvxq23j/LaIpmw9u7azDv7TIm7glVaXbgstZAxN3blizwH1r7IwTV9f0xjCo7j/WKZ6JWVvIffS4EO+m13CEpFAo4ioxAIhxnGIz40R8UNuvNUtSNdDEODgu8zgpVl7D+Cf3zIrwSY7qLWvsTiKRicLhOABI74Bhsgv9b+kpFBCLibEz9s3bA4RpK/0CDzMXxhzxtlArPhrcb3sDO2MKSoogFomItBUUFEAsbjDySeoHSGQyCKvqXpSu3QpiMU4yHrv3TKjt1/bGqG2kvlxkty8uEomAQqHUqcnatSfZ2LLkFhyFT5MpVm5NeWPascbeYe3u7p6RkZGdnR0eHm5vb8/lcokbTohrILXo6Oikp6dzOBxJF4+4SCIdLgmSyzLwdfFjLfb29idPnszIyIiLi6PT6Ww2m7jaExQUFBUVlZSUlJ6eLnkjl8vl8XjEsqHmIDPaMcji9wLd3l5eskcRpdfCp8S+tgo7Njtn2viYyRHed9b1UgMQZp4+lSUym7H32NqeigAAVZrXIzbXGxwbrepF5isRmWnats5niMxsxyCL75Rr9Bjo9Y24VA/h84dPxOwNi0e5agAICoyVsY/Vr1DonYfN3+vj7+DRceGflyL79KPRsLLiEhm9YZLxgCHd582P3Xjbb5WjWt3X6yKbW7FI+5/labH6GUgX28SqAzUnJSVH3NWsRp+GZDRoc4wf2cXPf7zlzeOBprV7lrz7tx/gFr9ZKpJNbG1UV6emcsRdTUkAeNHN60/I1gEdvuvsw6g0Kl5S3OACpLJnj16reUaHDXVSBKjMqt31kheyrp6uOO3FayHY1ig6plSzFcgmVpbUT09yFMxHypiSgfral2LGMoPDt+8V4yZa0vVPsbS1Iv+VcrNwlqkuBiDOTUl5S7O2NWuZg5TKV24pVZRUHJmn7LWgEesW+SUVp1dSOn5XSJUe5FpaWgYGBiYkJOTm5ubm5lKpVOJWPJnBkU6n+/v7x8TEnDhxgtiio6MTHBwsc9RsZ2eXnJzMZrNpNJrMMri5uSUnJxO9VB0dHSIUEkvET5w4kZGRIcmFSqU26pJOfSgdvQZarFh9bPXaab3Du6nXiTXlNyJ+j31lMefaQu/uZcLzV/1if1869G40WwUjK1AwqCznCQGasHZNBpxXWiaqnoqperlv3eE8zHS2lw0FACdTyJi4rLhECKAAJIN+g7opX720blmS92YP3e84U8WFmdeTkzWJg8Nobe1MO1jgq3etiDca1kEbz/pIXBEVZSduv63Y2Upf8Ut62gexRgctClCtbFmCzVtW/q3Rm/a+UNdrWHfJeUVqP2n9wiNu4QN6cWb+MbSrMa2S++J+Snnv6PkusktBMho2zW+VX9iw4Io5Plbawk9ZBYZ+o5201Tz/CGrnHjl8IrZgpK1O1acCDZdhXarfoj9o06ElT13nTNzCvjDdAgDwwqSYFXElbIYgY+eiuBLXjaM6kIHkEfw7y3XZqJlqS3yZRUnRoac1Rh33MyDBd6wMpJjZ2tCi46N3OYxrV5Yjsg0wOePpGq2++taxCZLJZVULS+OS+C3Rx1T6maoLXhSKoUUekkrpNMDTaP22WQvahXiaKBU8/CQGYqayTit4Tg0y9Vg5IpCyYFQXPazwZY6aR6D7vwuWyGay2pfE8P3Nc9lvs0dFiua4an66eeCeAJwAANPznTVm5aC5AYuwuR7anKNLI++aT7nS/7u+8JoFbywAvJ53lW/0Lg13qEyKwXnF30iEV1yZFFMa7sDbPuqbGU6YMGHChAkysisvz8zMzMzMLC8vl/nGzMzMCRMmrF69mvhvTk5OZmZmTk5OA3mFhIRMmDCh4X0KCgrqS0dSpIZTkKH+WsVxceHFGdY0DKMyHIdNnDlnzoxJI93sx8d/xnEcr8xY6qBMaff7RaLGRe/2DaaTlB2WZlTiuCBtSScljNKmi9/0hZHLli1bNNpeDVPqt/OTGMdx8aed/ZRIur+dr6zOperuPBZFoeuqTGH1hrKEocqgPOwwD8dxXHBjpgkZMLKmpfuYabNmBHlZa5MxhXYTEj+JcRzH8cqrwW3JmArLe/7xl0Icx8vvLnPUIGGKenbeE6bPCZk5ZXT/bkNjX4lkHF7FqbE1+glAbh9yU1D2cNdvTqZaSmSyooq2kYXj/Mt8vOzKYmdTbWUySUHN2N53WfJHEY7j4sJry70sdZQVlHVYQ7ZJSv+17koeJ8wf3sOMTlMgK6rps5z8ll78KBLcCjWn9o7NFUkKQB1+pALHcRznZR4KGWhjqKpIUdJkdpnw1xtiH0HO2YhhDsbqihSqjpl7dHpVxenx2tSvlfMs2klV033ba2HRXi9lNSsXVwttZUVVI4cRUdfyvx5yVe658KG2BiqKVLplv9mHs/lEupKSiIv2elENf79EtIcwO6o7tXPEwyocx3HB879+626kqqCgatQ15ELRsw2uugaDd+dIV6a4KHW9f1eGugKZoqRGZ1r1W5NWVeNlqcTFedv6Us1mpwpwHMdFr9axqVaL0qqk96m/fsTF92LHdGeoK5ApVC3jjuxRO54IcZmtIMg5EzGsC1NDiaKobmjjE/NIujw4Lqt9cRwXF9xYO6pnezqNqm3eq4eZota400S78LMPz/HsoEtVVDHoPCT8LKdmai1DnsFRXJRbGm5fGmZRGmbB2zFakLJX+OqO8NUdnFeM84qJvwUpe3k7RhP7lG/0/mYYTUtLmzBhQkhISKPLWSc4ftOFCxcatb88NRQccRwXFd7fPdvboa2WMpmsoNqmfbfBS85/EuOivL3e2mTtwfvyJCdK1bPV3ZVJ2oP3vRfjeOXrk4uHdWunTaWQKMqq2oamNo4DwpOLcbxpwZFi2m+MtwNDQ1GBqm3qGLDiXI7g3xJ+OL9ooJWeusPSR0QC4pKnhxf5OZrRaRQShaZjYuc54+/XsoLj/5GaAQ5pFvH7bX1p5qG3f0QYlE1+T+UBAADx+0z+/qmS5zY2gGRgSR27peGbDnk8XlRUVG5urpubm+RZO98vKytrzZo1LBar1vN7ZLp48eKhQ4eoVGpkZOQ3bxmUv9b+VJ6qlFkWrluN12ZdI9Y5IrLgn/d5Gy1gnH6ztY98JjL+a/jph+MyVaxM9VUqXl/YMHdl1tCLD9c7/6x7duR8tZpk2EFlxomKUyuE6YkN7KbAHqvkFtzw7GRMTExWVhafz2cwGC36jAYulxsXF0dcpfH39/8JkRFBEAAQF726ejAyMTO3kK+oa8n223V82U+LjCDH4CgQCIj4wmKxlP2ixE7jBSl7Ra/vSvciMU1DipWbotO473lKBbFy0Nvb28PDQ+blkW+i0WgsFuubzxwjHllGpVKDg4OlV5UjSCNhWuNO8cb97FL8ukhGw7fdGr7tZxfjK7kNq0+eOPnhwwcAMDQ0HOQ9SPol0es7mLK65HcHWyEOhyOH+/yao7UPqxHkP0duPUciMgLA+/e1Jxxb/w8h/OTIiCBI6yO3yXUDA4NafyAIgvy65DasFggEjx49AoBOnTopKqJrdY2EhtUI0srIeSkP0kSoVhGklUFr1hAEQWRAwRFBEEQGFBwRBEFkoDR2zpF4RECjZyqRBqFaRZDWhvKN51zWQTyerbHvQhqGahVBWhvKxYsXG/WG/gBAPKcYkbfGtgWCIC2n8Ut5IiIgMrJlCvPfFh4OERE/uxAIglRrfHBEEAT5D0BXqxEEQWRAwRFBEEQGFBwRBEFkQMERQRBEBhQcEQRBZEDBEUEQRAYUHBEEQWT4YcFRXPbuyZNc3k9YVIlXfsn/XPHj80XkrpL74sGLQnSPZaP92LNPVPbp4xfhj8mrJbVscMSLTk3v6Tz/SjngRacWjlx85uOP/2Dzz8xyGr3rhUiqMACAV1VWtVRZamSEyI/w4dagwO0PftBpJ66srJL+v0hQKcm5IiXctceUo59+kTj9Q88+MWfP+L5zTnN/kbppgPyCozBjdR9z03+Z916VLlK1dB8xwtVMWW65fCPT9l3mX6+qZ19MUhhx3oHRXQIP5Ten+USP1rhb9lv7RCS1jXd5brdOQf8UqrTwUcsizosPdGC1NzNrb97RtueAcQt33ykQfftt8iDK2elr5bszh8iOn7l7bLcegX+9qPwxuTcGXvLor7ARvR06WlhYObgOnXEwu74qEj3d6NV19kXJgKMqdbFz7+X3vn62FNr18hvZz1rjJ81KCTNW97H67WixpCcoTF/hahX4z5cfPTATc29tnzHE2dbSnGXdzW3k4lO5v35I/Jd8nx+hyF5yav1ANQAAwCg0TYoiZdAMcwCAFmy1GpmSqRoK9e5oXl0YsUggaG7gIFt5DWi3+/SZxzOtbasrsTz1zBVBz0V9dZS0qjP6gXBheXEFa9o/cWONq768f3J+c0TQZMHxI1PMyT+yFIJXh2YGbRcFxm0bba70IzP+LpW3105dmdEzYuvyHgakL28ecNT1641uIoGgxnkuFFTh//4yEtmo79SZLVjSXwP+5VzktK3vfFbsXtuZLuY+f1Bg1Ob/6SKGnI9FSU2Hrkuga6lQoOrq3C7sJbdqdebE3Ftbg4e42FtZdxswdcf9z82MnNKZaqsqAABe/iQ+bLhzZ0tLW9cxOx5Vj4ZqFKbqVnjP9qamZtYzLgialCuZ5TXQ4v25M4++HlxpypmrYudBrpqYdEb8F8cjxvbrYdOxs4t/xKm3AhC93j7EavC2VyIAwItPTOnsvuaRCACAd36Gvcvy+80ZNCqoaGtr6xqadvaYHOzdJutKygdx1bWwrj0XVx90aeIk6/4bM0UAvFvr/fs5OVhbmLM6sYeGxj/jNSNbAi5488+sCeuKR+3YPtlGBQBkN7Qo++B03z5drVkWHbuOP8CperIryMulizXL3MK6x8CpO+5X937wkocH5o7s28XaysFtQvTVj3LoBYs/v3pVpM32HdLdnMk06+Ti62WngQHIaCNC5bngjqampubOS+8KAUCcf3AUy9TU1MJ7ywvBw6i+1tPOCaD+muQ9Pxo+qo9DB3MLKwfngYE7H4sAgJeZEDqkpw3LwsqhT+hpbot0GareJa2Z6MXu3NGm5xAZDSt6snuiVy8HawtzS9tevjO332r6AEP88eVrfts+IwbYmzGZ5vZuw/t1qP5GFD7dPtLR2rKDnWtAxKm3xIePf2O5Zw/bjixLWxf/iLMcEQCIc08tHunRo5OlhaW9z+bHInlHhmb6CYFezEmYPfUvgc/mcynn1vXJ3zZzXWrzz8waSq8tn7LqqeXcg5euntw0rpMqJmMfhe6Lrz7NzMxMX+fexJ9KJJt5+3QquHg6QwAAgJfcOHOD0ndIbw3p3Hi31kwKT7eYe+jatfhpba4snB/Pwdr26K7/Ou1BCQ4geHT3QXnugwf5YgDhs/sPyV0dreTQlxeV5Vw9lfKBpK6uIuvQAQCEHzIfi9zXnU9JSTowg3F3xYJ9L5oXfipeHJ45bk2h346dU+3UiFxlN7T4w8ObudbzTqXevnp0uZcRcJ8/LLBbfPZGypW/lzi82RwSm14FgBedXzx547uey0/cuPTnCPhnztKzRc0+UUi6jn07ldXauQAAABTtSURBVB5ZMmdH8osv/x6tjDYi+oxK/TY8yMzMfHp5YVcKAJDa+O95nJmZ+eTolPZS3XGZNYkXX44MjEgznbkv+WbK6UUOhRlZ+SLAC89Er0y3Wno+/dGds38G99Sur3WaQfhs+9TZFzSDdl9KSVxi/Xjl7O1Pan7dirlZGfl2C05ev5F0cBG7IG7S77ua2vTkdr16m7zeE7r4QCqnvEY/m8wYsDQh+fqFuLG084uWHvskBgBl6zGb/r50++6VP33xxMXrkkoB8KJnNx/rTzp67XbKyRh/c6zFI0PjyDc4Cq4vcbbt3Llz586du0w6UiDz4yzKOfdPGmN0yOjOeloM59/H9yxJuZbZnO6SVKYOI/58KQL+7RMX+O4z5g+yNtJndnZzNJU5siRRFJWUlBQVKU2uAhLDy7f75/PHb/EA8KLkxOs0zyFsmvQeFbeOnizp+8esvibaulZDJ/sYPb5+5wupg3NPtQc30/ggyr51X8Oy3Ytb90tx0etbd4odnB2aM1EpfLzJp5uDrXVH2z6T9r23njy1v1ZDp5+Spr5BGz1mZ9+ggQYv0x836/qR8M3ZA5dL2vbo0U7yVdRAQytoGhrTtdswjbXIAAAU9TYGbfSMOnr+Nqwj90HGBzH++fKRS0pDZv3uaKSl7zB+oofS7SvpTevgSyObTdh1JGqAwqXIIU69Rszfl1YoqqeNiE9u9UdEgVx9SCTFmv+XqF2T+JdLCWfFg+ct9LY20m3DMNJWJN5BUVFVLH77LKcYVPTaM7WbdfIJri1i21hXsx29750IAED4KPHoa/uJc31YdG0zj6kBnd5dT+HUiX0KGoYMfX2GlcfMqKkdM48cf9LE6KhkN/tg/AJ2ydGQ/o59xy3752lp9SmPqTMtTPTbMO1Hj3FVepiWKQIATKsti6mjrmHQddQQ28o3r6oHA5i6QVs9bboxQ1dB3pGhueQ859h11uEoTzUAAExZWxsDGdOzeP7HAkHmxkFWm4n/isWqg4ubM40rnamihh4ZL8rnVtJtDVp+zgvT7efXO3rhkcthTnZn/rml55PQtUameMmnT+XFt6c7nKv+GQQxZv25WKxk18eJvOjaA17bB7eVPEN80xfcSON1fnsj124YW6M5nQmKZeDO7QFGBadDAxMstuwLtqMBVAEG35jyxTS0NIHH5+Og3uTcKR3+iJvO2zBn/MiC9fuWeuiTm9LQJE0tDeCX83BxxYcCQV7KGJu/iBfEIrLzF3ksRMFULQbOWDcwOOLFhc0LFo6fXHnskI/MNmpi8tU1KSrI+yhm9DRRrP2yZ/iO/HXr5/XfS+0+KmTRdHdmvRPk36TQbdahlf2IqXYQPtk6bm4BAIgKPnL5N5c4d4ioPhrc2OYLDur1JELSMzWh5r//JPr6MPrGIml1HjY3dticosfH14RFjOXAmR1DpV8na2ipVebycQAh58LayJjTD3K+iFWUq6r07evUsdwjQ3PJ+YHeVC1DI2OpE1zGoWE6utqKtoHnDwcy5NRtrZ2pmr6eckEOpxys6/tMkMlkEAia3xXBNHoHeKlNPHL65tujjzuMWN2xZnViqnQdGn3YhqurXGp2CLt7uoiXJp01fFbuGOboomIUd+ms+duXdt6uOs0baCmo6erpGxhOWD7jqt+KrYMOh9jRMCpNuezTZwFA/echhkH1D9g0I3uKvtOc3Qf1Z06YPS4yNj7SVaeehq5vMUF1UQAAgKStq61oOjHhXKiN9Dkrt14ESc28f+j0Gycmpdz7PEpmG4mekMlQJagCqN5KppAFgm9egK+uSUxDWwPyP+aLwbjmZ5yk02X8yvgxoQ/3h/0+a77uhQNjjZp6EmBUHQazbfXHXlioToECACBr62qr9Jl9fbuPplRb4tx6EsG/fPhYoW1Bb+6ZSNa2GbZ4SvLJBTceCod2qFHM6oxKzq0OO6k8f9/VYea04r8n9tov44jkHhma6UeVAlOiKcOn7KcFlaR2/X1snscti7vx/AO38OPrh5kfmvmhrywt5BZU4xaVVVEdhw/Rvhy9+MCdt/mFn97ll9bucpC0mQzlF5fPPsj7xHma9b45QVKpS8Bwk3ubQ/e/cxrtU6dNaT2H9Fc8u27ViQec/MKCd9mPXxMDNpqjV2/ByVVxXJd+NkoMd/c2F1dvf2o/sK+ufCahyCYBi8dTDize/qgCyBYOdgo39++49uJD/sf3BeUtOsVNY43auHMG/czsaTszK8hNb2hMu88Q58+HV228+PRdQeEnztOnHB4OgFGpyhVvnz4vbdooEC+9/3fciZtP37x7z8m+eejv1GK6qam6isw2Ihm0NYLHSaefffz45vHzfDHJiGnIu38x+eXHDy+fvP7WhQJM16V/l8//RMdefZOf/+Z+2osy4g2VnAf3X3HLBYr6Hc10xKWl8l+VTens7W10M3Zpwt3XHwu5H148fMEVS599OFERmSnXn3I+cjL+XrnjvtFAL5um9ZHEn64d2HfublZOXl7O0yt7j2XgJmZt6+mB4jiOAwZiQWVFVT3N14wPTMsg4fIDQNSBzI0qzgFjjO6ELzheiJmM3bR1lNKZ+cNdHR3d/MP2pRWKmpOpIHWpW/eveniuvCWgdguNW9u/PH6Gl1MPZ58tOWY2Juo1CqPsNGlun+Ldo11dvP/YkvqpGdnjJLNhYxwrCqmDxrhr/Xv0kqPutWDnEvvXsRP7O/XoNWjiqvM5RF7KPXwHaZRrePS3oeAkZj9PEx64+Lpr162+xpCqfrLFmBkDv+xdlfBWpNEvbLWf4ulZg3qxXXz/zDO3aasK0kWs/dZmZk3tGLRhuQtn05yY9Mp6GrrW56R2QQDHcUzXe+WOacZ3Vo5x79mjz5AZsTc+iHCcxBo8rnfpvhmb0quaUkjxF+6r23sXjhvU28XNd9bBL70it87ppii7jUC7//QZnV5ED3XuMyzkwINirO3w2b8ZpM4b6Ow2auGx5wLpUsuoScxoxOqNo9WSFwzu1XtE+NlcoYIiBXBR/t098/162drY9p1x3XjqvJFmTT796pxrXzcodAreHu1R+tcMb5ceTp7jlvyTycelzz4xjgOIuTc2Thzg4hG47ZPLyi3BnShNK4SoOD/7ytY5Af1dXT38F55T8IneNJFFwmt+nIiCgbr7zIXOH2P9ena2se0dlWVkqqcMeK3jIMk1MjQfhn7xDkHkDi99/+YLRUuTRuK9v709ZFHu2DM7h7VpgavTjVZ1dW7PRcqbryx1bPp8539Eo3+3GkGQbyrP2Ddr4dHXBSVC5TbmPYZGLfXRbSU/Sy7VW/vZRWntMKHw/+AOcQRBEDlDPUcEQRAZKGjOEUEQpC6KSPSDnt2CIAjyC0HBEUEQRAbK5cuXf3YZEARBWh0MXZBBEASpq3XcxIggCNLKoOCIIAgiAwqOCIIgMqDgiCAIIgMKjgiCIDLI+WG3SItKSUlJSEgAAH9/fycnp59dHAT5f/bfWsrD4XBSU1MBgM1mM5lMeSWblZUVExPD5/PrvuTt7e3j49OcxNPT05OSkoi/ORwOUWzJHwDg7u5ub2/fnCwQBKmr6cExLi6OCDR1MRiMsLAwGo0m89WfhcPhREREMBgMAMjNzY2IiJCOjzweLyoqKjc3187OLjg4uFEpJyYmZmRk+Pv7132JTqfT6fTmFDswMFBSZgBgsVgAkJ2dDQCS7bt3725OFr8oLpdbWFgIADo6Os2s5F8SXpZzP6PUhG2tW9/kmJhXkF+poa/VxN/X/K9r+rA6NTV15MiRdftfa9asyc3NjYqKkld8jI+PB4CAgIBmppOSksJgMCIjIwEgPDw8JSVFkqYkMjIYjKCgoCYkTqPRLC0tORxORkaG9HYiigEAm81u8glMhN01a9ZIJ1hre3OkpqZ26tRJTU2tmen8MDweLy4uTrqq7ezsgoKC0tPT6XS6paXlTyzbj1N1PXLgFOrhl1t6yw5+4tytAzseHvzo2sx26NJCUzRrzpHJZNb3QSTiIxGJmonoMbUc6cjYzIAeExMDAHWDIJfL5XA4je2QSqPRaESfsdZGHk8Ov+ybnp5++PDhgICAHj16ND81icDAQJnbm9nP5fF4oaGhNBpt2rRpTCaTTqenp6cnJCSEhoby+fy5c+c2LVkOh5Odne3u7t7AFvkRpi3szD7U5+zDmD6qko1lV6fbeV4NuJMe2RldC2gFWrARWjqoNZaTk1NycnJ4eDh8LRsRWeQVGQGgsLBQ5iRjYmKidI+vCZhMZlhYWN3tWVlZzUlWoqys7M8//0xNTQ0KCtLU1JRLmi0kLi6ORqNFRkZKGsve3p7L5R46dKg5yfJ4vISEhKysrKCgICLlulvkR/zx/UfBm7jF2/9wCbEkfpNKlL194a5XVRqfCtBDBFuHZvW316xZE1iHvEomd0wmMyIigsVisVgsBoNB9G2J+Ng6J0l/vKdPny5cuPD69eut9jIdj8cjpnelGyslJaWZkVEiIyMjNDQ0PT29gS1ygJd8+lTJcumau3nNuWKiqksuRMfkdnNlleUXVAIA/unQOEs9DaoiTbfDgEUXPooBQPh420hHCz01JUWanueWV5IYipfejnBsYz3tQgEOYu6N6JEORmpKNN2Ow//Mkjzmn5+VMNPDkk5VVmd0C1h7gyuGqpsh7VU9d+XjACB+u9FZlb3+tRgA8A/b3dW6rsoUvNg9ppuFgQZVQYHWpsOAhWfzvuf5XYmJibVGMzwe78SJE/KotR+tlXbf4+PjJR1PDocDAFFRUcR/GQxGk+cfmUwm8V5iKM3lcuPi4oKDg2k0GoqMBD6fv3fv3tTU1MDAQD09vZ9dnNqID0OtyRwnJyc5Lmzi8/mxsbHu7u6SeQzJlsGDB8vncyIuLCjEmBNW9ov3XrNn4YCZZvB6b3Ri25mnRiZ5HPhUKAY1ko7r/CN31zJUi1OXDfebvNL9+WYXyL13+Y19dNqNAWpl5QptSXcBAPDKrJ2jhu81jr60oZ8u/uHARN+owol7biXaKb49uXhsyHsAACi/vmDwpCSnLecze6s+3zd97JDxWuknA3o7qxxIvVfx20Dl4pvXH/Kf6N8rBVON8jspD/V7RbYnfd5796npwvSrvrQvD7ZP8p8wr9uLA4Pr+yl4AADg8XhJSUkZGRmSroZkzorFYv1yc8Fym6llMBjExdNfC4fDISYKEURa3b6zPHvT4iJuEUlT1y5wjtfrbbGp/IrbW7e+GDgn0FZXi1KYzxUDAEXf0qatrqZOe8/Jwztws7OrfytbUYdpoqdrYGZCpwAAVOX8PdF7aeWcE/vGmSkAXnDmYJLa2FXhg6wZxhbsQc4mxIidf2X3wUKvpRvGdjFhWHrM3xDc9sruI28Ue/brJbxxOaMKKm5fTm/XyfjulbuVIEi7lKrY28NOAQCApK5vYmjA6Ng/dHIv3t2bWd/4vSkajRYWFsblcokxmSQyBgYG/nKREeTVcxw5cqSHhwcAXLx4US4DHOm+IdFnlDnj1ljEOkcej8fhcIh5Rvh67QgNqwlUKnXEiBHOzs4Y1hp+SLQ2YnVEVlZW3aWdKSkpu3fvjo2NbWY7UqnUoKAge3t7yXyuZEtzkq0BL/5coqqlQdF0mfVbhOemuPakg8qBZwdokm9oqZV+KREDlD/eGzpr7cl0TglJRZEvtBXLHNPixbf+OVtlMrmzERUAQFzw4RNu1N+41lmNf8nLK9fr3q66WsgmZibY+3cfxJp9vXpOWX/hKU90McU8aD17X8jFDL7Whcv8PivZ1JpJ0HR0lPnl5d/+eiAmx6OioojTloiMv+gNC/LpORKRUfqPVohY55iVlSWJjGFhYWFhYbXmH//L7OzsVqxY0atXr9YZGQGARqPZ2dklJCTUndhKSkqys7NrZmS0s7OLjo6WjoN1t8iBsKSYR1VVwUCh06RpDpdC5iTZ/jGpswKQVFSopV+KcXHO7uBpl82WXed8KXl/OcSmvj4MRh8RdyFce7+vz8r75QAkPSMDjPPitaDWXpqGhrRPr95U15jo7cu3uIGxARmje/o65549ceRkso67Zx/PvpB08u/Es0XuQ6UuoUsSwQCH7+o7E/GRy+X+0pER5BUcJd+x8rp42hIk6xwjIyMZDAaLxSKmGpsfH52cnGSuAP+FqKqqTps2LTg4uJVfqgaAoKAgHo8XHh6ekZHB5XJ5PF5qaiqxCKFpa1QJNBpt5MiRxAR0fVvkBeeVluE0FRoGQDIcETrT3X3GXH9jEgBGU6UKS0p4OC4W4wC4qJJfUYVDA19VmLrD7CNHgkpXj5x1lgt074lDhPtnzdx/583HT3k5H8uIizbUPoGjdE4vmX0gLScvO2n1rNgc18Bh7UiAtfEa6foqJuSAivdgM2WHIQMrdoXsyPcc4dbcFa9EfPylIyPIa1gdExNDrF9JTEyUS4LSWnoqk4iPxORI08bXv/rtGfb29uPHj5f7IvAWum+HRqNFR0fHxcVJTxaz2exal7Abi8lk1rqjoe4WecHLy3lAU6FiAACqruGnXKtfwGgqNCj5Uoy1Hb9m2c0/ptsbfKggq2jpmfnqKdWbGqbRa/n+eTecfw/xStvjs/Xs5vmzV3pZBX0WUenMziPaqWAAKi6rTu7EgiP6Wf5WqdNpUMjxzYFtSQCA0QdN8J5z7vkw3/ZkIHf1G6Kz+bDHeLe6/cbGa7na+2Fa5PZBApvNbs43udy13O2DEoGBgWw2u+63ZUpKCpfLbdq0KXH7YH2nPY/H+y/fPsjlcgGAyWSi+WJE7v5zD55ISUkBACcnp5b4WouJial1+6CEm5tb01YgST94Qib04AkEaQn/reD4A9Q36/orLmVAkP8yFBwRBEFkQI/rQBAEkQEFRwRBEBlQcEQQBJEBBUcEQRAZUHBEEASRgXL58uWfXQYEQZBWh2JiYvKzy4AgCNLqUH6hn1VCEAT5YSgUSit9GDiCIMhPhC7IIAiCyICCI4IgiAwoOCIIgsiAgiOCIIgMKDgiCILIgIIjgiCIDCg4IgiCyICCI4IgiAwoOCIIgsiAgiOCIIgMKDgiCILIgIIjgiCIDCg4IgiCyICCI4IgiAwoOCIIgsiAgiOCIIgMKDgiCILI8I3HgGtpaf2YciAIgrQqqOeIIAgiAwqOCIIgMqDgiCAIIgMKjgiCIDKg4IggCCLD/wBrF9nNTHKzGwAAAABJRU5ErkJggg==" }, "2d33971b-509e-433b-809e-2f0861a13105.png": { "image/png": "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" }, "5aa6b072-c4d7-47de-9e75-0a107a37e2f2.png": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABP8AAAFkCAIAAADQZQkrAAAgAElEQVR4Aezdb3ATZ4Lv+7zYF3lxqtiqPVWZqnNrsr612Wiq2OhusSN22UtXecuqpYImtUHDpC4q5pQ01JYGz5TOEDw6VDhKzhJPCPHN2fHVgSE2JHYAj53AyMMyhiQIEseQAGISYzBgD0Y2drD8DxkLGgunb3W31JZaki2EDfrz7XLh7lY/3U9/nqaKH8/Tj56QWBBAAAEEEEAAAQQQQAABBBAodoEniv0GuT8EEEAAAQQQQAABBBBAAAEEJNIvDwECCCCAAAIIIIAAAggggEDxC5B+i7+NuUMEEEAAAQQQQAABBBBAAAHSL88AAggggAACCCCAAAIIIIBA8QuUaPodHBz8zW92Nze33Llzp/gbmTtEAAEEEEAAAQQQQAABBEpeoETT73vvNfzyl+5f/tLd3t5e8s8AAAgggAACCCCAAAIIIIBA8QsUSfq9ceNGaltND12NnG6ZOrFn6sSeyOmW6aGr2jGtrb9X029v75+0nawggAACCCCAAAIIIIAAAggUq0AxpN9Dhw65/tt/O3nypNpIM3cmp07sGXn7h8Oef9T9jLz9w6kTe2buTEqSdPbsuUKMvpFIpFifRe4LAQQQQAABBBBAAAEEEFg8gWJIv/v379fS771r50O/WqULvbrN0K9WiZc+XTzTRTpzMBh89dVXt2/fvkjn57QIIIAAAggggAACCCCAQBELFEP6lSRJHfl85/wRXdAdeds6vvdn43t/NvK2VffRnfNHCqtdu7u77XY76bewWo3aIoAAAggggAACCCCAQJ4IFEn6lSRJvPSpmm8nDvz3O+eP3B8fSiW+Pz505/yRiQP/XT2ysHqASb+pDcoeBBBAAAEEEEAAAQQQQCBLgSJJvzN3JkO/WhU+9Hra0JtqcX98KHzo9dCv/ll9Bzj1AG3P9u3b33zzzWAwOMceSZKCweCbyqIdpu45cOCAJEnt7e1VVVV2ZamtrU08m8/ne/PNN30+n1ZQXUk8obr+6quv2u32yspK9ULqmbVSgUBAPcBut7/66quff/659pFWPbWIz+errKykDznRh3UEEEAAAQQQQAABBBAoeoEiSb9T/j05dOTeu3Z+yr9n7jZWI2t3d7d2WOoeSZLUjlm73a4dpnXV1tfX2+12j8ezfft2tazdbg8EAuqRgUBAzbRaQXXlwIEDdru9vr5eza7bt2/3eDx2u33jxo3blSUx/aqX2Lx5c319fW1t7caNG+12e+IBkUhEHTWtnpYR1DptNhFAAAEEEEAAAQQQQKDoBYok/WbZ5ZvanPMWTM26qXvmSL+VlZUbN27UwnMkEqmtrVXjrjZ78+bNm+12u+6bh9WdWkjWLpHaZ9ve3q6mWe2EIyMjavGRkRHtlu12u9r/7PP5tCO1T1lBAAEEEEAAAQQQQAABBIpboEjS7+I1UmrWTd2jRdPUvl+73X7s2LHE6kUiEbVvVou7Pp/PbrfX1tZqhwWDQbvdvnnzZm2PdonU9JsadCVJOnbsmK77V6222pmceFrWEUAAAQQQQAABBBBAAIFSECD9ztPKqVk3dY8WTdOm39SOVnX4sRZ3R0ZG1HNqR6oHJA5d1i6hS79qTtbtTHuweonEV47nuXM+RgABBBBAAAEEEEAAAQSKSID0O09jpmbd1D1a2kybflMvoI1V1j5Sh0NrvcRpu3O1F4m1UonXVWul+zMxFasfJZZlHQEEEEAAAQQQQAABBBAoHQHS7zxtnZp1U/ckplDtdKnzYGkfqTNdJUZTdc+rr76qznGlzpKlHa+uzJF+N2/e7Eu3aIOrJUki/eo82UQAAQQQQAABBBBAAIGSEiD9ztPcqVlX7ZjVJrJSy6dm3dQ92pVSX/SVJEnr71WHPScG18RLJGZmLXXrdmoXSlwh/SZqsI4AAggggAACCCCAAAKlJkD6nafFU9Ov+sVFunSqDmbeuHGjdjot/aa+aqt+d5E2zlktokbiY8eOqZ9q7wDrTqgLuupXGdnt9sTpnbUiiSuk30QN1hFAAAEEEEAAAQQQQKDUBEi/87R4avpV+2arqqq0gBoMBisrK3VfoqulX3U8s3YZLSdrxdWP1Lmv1C8lSjszs3rCqqoq7VTqivplv2+++abuhLrDSL86EDYRQAABBBBAAAEEEECgpASKJP3eOX8kt2abt2Bq+tWmaK6qqvL5fAcOHKisrFQjaGLQ1dLvxo0b1SN9Pt+bb76pnlDXdaxWXp37ym6364ZVq59q3bxvvvmmz+fTvgo4Eomo3cWVlZXay7/19fWJleG939weD0ohgAACCCCAAAIIIIBA0QgUT/oNH6qeuTOZfcPM3JkMH6rOIf1KktTe3q5+Z68aZdWvJtJ1rmrpNxgMqulUPWDz5s1acNXVVv2SXt3X/CYek3hdn8+nfRSJRNT4rV5C/bO2tjaxN1hXPa0sKwgggAACCCCAAAIIIIBAKQgUSfqVJGl8789Cv1o1dWLPvBl45s7k1Ik9oV+tGt/7s3nbWA2Nad+q7VaWxISZeDYt/ao7g8Fgd3d36jvAiUXSvlGceIAkSZFIRL2ubr+6qX6Utus47fHsRAABBBBAAAEEEEAAAQRKRKB40u/MncnQr/552POPw55/HN/7s8jplnt95+/1nZ+5MzlzZ1Jdj5xuGd/7M/WY0K/+ed6cHAwGc+4y1aXfeZ8n9X3gOTp+5z0DByCAAAIIIIAAAggggAACCGQSKJ70K0nS9NDVsZ3/VQ23c/85tvO/Tg9dzYSi7o9EIuqLuGnnoJq7rPZdRHa7fd4jJUlSv+830xu/2ZyBYxBAAAEEEEAAAQQQQAABBOYQKKr0K0mS8jbv63NH3/Ch1+ft9a2trVWncd64cWOmsc1zsD5Q+tVe2U07FdbcV+FTBBBAAAEEEEAAAQQQQACBbASKJP2Kotj5dWfn152iKEqSdH98KHzo9ZG3rYkxeORta/jQ6/fHh7Jx8Xg8GzdurK+vzy36SpIUDAa3K8u8l9u8efPGjRuJvvNCcQACCCCAAAIIIIAAAgggkLNAkaTfo21Hf7PrN7/Z9Zvft/5eZ3Hv2vl7187rdubVZjAYzDlj59WNUBkEEEAAAQQQQAABBBBAIG8FiiT9qtFX/TNvrakYAggggAACCCCAAAIIIIDA4xIokvTb2tqqRt8PWj54XJRcFwEEEEAAAQQQQAABBBBAIG8FiiT9iqJ4VlnU937zlpuKIYAAAggggAACCCCAAAIIPBaBIkm/j8WOiyKAAAIIIIAAAggggAACCBSKAOm3UFqKeiKAAAIIIIAAAggggAACCOQuQPrN3Y6SCCCAAAIIIIAAAggggAAChSJA+i2UlqKeCCCAAAIIIIAAAggggAACuQs88S0LAggggAACCCCAAAIIIIAAAsUu8MQMCwIIIIAAAggggAACCCCAAALFLvDEURYEEEAAAQQQQAABBBBAAAEEil2A935zHzVOSQQQQAABBBBAAAEEEEAAgUIRIP0WSktRTwQQQAABBBBAAAEEEEAAgdwFSL+521ESAQQQQAABBBBAAAEEEECgUARIv4XSUtQTAQQQQAABBBBAAAEEEEAgdwHSb+52lEQAAQQQQAABBBBAAAEEECgUAdJvobQU9UQAAQQQQAABBBBAAAEEEMhdgPSbux0lEUAAAQQQQAABBBBAAAEECkWA9FsoLUU9EUAAAQQQQAABBBBAAAEEchcg/eZuR0kEEEAAAQQQQAABBBBAAIFCESD9FkpLUU8EEEAAAQQQQAABBBBAAIHcBYol/UY7PCvKyp5J/DE4mkJSX53V6GwTpfAhp3F9Yyh3qHQl01y0zLC6piuafHC726TsTKhDv7+lI+fK9Oy0Gtc19iddROzYKpg2tQ0sxm0mXUi3IfoqDWXPGGLLUoNxpcX5Rlu/qDtskTblq5t3dMXPHmrbYhbsdV0LffWEhotf6gF/h07VudeZTSaTaZnRVGFz7Zy79WcfD/Frn++ifD8PX4cHrHLy4RdrLEudvqmEnb111qWO5kwPcTRQs0rwtCcczyoCCCCAAAIIIIAAAo9boJjSr8md5l/bYngsLC5SeJDTb9qLJrdqPP1KYjgs10WSBhptq6oDupCcXGiuraFGh9HivZxwSLjNZRI8p8TZSyR8uJiruvwphXvbPKsM1p09i3lR7dyJVw/7X7MI6+u6EhOaduDDrTxs8gw1O5eZ3Udi/ycQvtjsXGl0tGQKjkmPR8dWwdESlquvPTwPdy85lib95ghHMQQQQAABBBBAAIE8Eij29Jum7zfc9b7bWiEIFWbzGlfdeSVa5NYic6TfkL9mvVkot1jXuep2upL6fqfaPBVGg8EorHY29+V2YTnsmt8IaIVDLU6jvns55TajgepV5uozSqGwz7nUYHtPDWA93hcEd3tuHaaJ+TNWncA2wehqEyUp1OSY7W8fa3YYla7CgUabyVXX5HFusFkrBMum5p6c/xdA0q4e7thhFdZ5A7PRN+X2JUkeCGByeXc6zCscjUNSxxaT9Y1G7yaHY51FqLDVtKtPQpqCD5t+v64xL3O1zdZNEof6Q+qm2ON7zWYuF8wVZovTK/cIJzwe/++vbKalZcYVZssbHVodxFan0e5t3uFyrLeay82O3QGl5cSu912WlYJ5tdWxo9m73ug8FJYkUX3UzfLTbnU3PUSn+JzpN3zK61qj/IVaZfO09Mj10fp+o4HqCrN7p9dlt9leMJvXV/szp37teWYFAQQQQAABBBBAAIHFECi59Cue8Agrnc198j/Rw5+4zSvd/oRY8mDEGdOv6N8iCJva5H/niz2NG0yGVfJwaC3ASO0eoeIh+n4lSWz3CLM1729cb7S9Jw+F1i6R7jbl0dHW3XKvrHjCbVlrs7h8cuALNTtWJGWzB0HQ8mesULjX564w2t6XK5M+/Q412gxGx3tKRprq8JSb3Cce5IJJx6pX7wjU2oS1NYGE/8dId/uSNNRoW2qy7Ywd2LHVZKjw+MfkM/a/ZzOuq+uXZdI8Hppq0sWz3xADNS8YTes8dYc6uoaS/peha4fFFOuvDgd2WExOn/zMzD4eocb1RrXvV6uDeMRpWGqtOa+c52KNZZlTbkX5f3ms3q9FSRL7W1zCUoOzVZTGmh3LbHUDSkUHfNWV3o6cH/U50m/I5zSZ3UeVUDvQ7FxpqTmflH5rKgwmZ3NI/j+OsL9KELb4kwiyZ+RIBBBAAAEEEEAAAQQeTqCY0m9Z0vKMSX7tMKXvt2OrSXitI4YW7apZ9RDpS33vN/7Sq/LbaNvTr3R8GV1HY//Il3PLQqdfSam564gS+C575dikpDgtI6W9TfGoy+RsDktS4A2Lq8XnXu3piEriEZdpg7wzp0XOn2UGo3GZ8rO0zLDS6t4de6k1Y/o12hqH1Kv1N66Lpbucr24sN5vLBdMqd2KnYtrbV9KvtS7e397xmjD7JLR7TMr/R6QtqKnmVEml0FSP/71q13qLYDQYy22unX55GLTciEbXkXgYHKizqVF2nvTrMr7gjXWYT/mcRvmO5Bqu8caGm0c7qlcq6XfK714pON72BfpybV7thi/WWAwGo8lkWhH/MRkNBrkzP9zqNK6O10cS/VtM8pvYCX2/NRVGOYori3jUpf5d0E7MCgIIIIAAAggggAACj0ygmNJvuldw9elXTmuGZYJQHvsxmUyu1lyzQaa+X3m/4DkVb8QTKbNezcab+DEP/rt/t9Vol2cdCrxhFqpi/WnxnJbhNseaHeVu/1SPd62tcSDU7LTWXBQ7XhPUfuMHr4Lci5w471SoxWlaVa11MGZOvw6l01nuHtb6NnO+usnZ3C+G/VvNpnXafFcZbn+o0WZ0aEG/4zVhdvR4rEXSF4yr5lRHXaFouP9Us3u1UXitQ5SfE4NxReLTaGvsm7fv12VcK3dTy4vYJqffXqXvWnkYlL39dWtjgVPsbfNudVrLjcYKm6epK9cHXZLkvl9HY19odjkj72kOyZc2LDVpf6GEFSZhqz8p/a5K+IvZ7jGtlP/PhQUBBBBAAAEEEEAAgUcvUGrpV+rYmpB5HtI7Y/oNVFck9P22OBZ85LNc8ZAyrvVyh6c8/jZvwsjnDLfZX7feUvNJo2ONPBK7Z6fVtsdfs8bq7c0ZIin9StGeurVGS23s/dJw4nu/A0ryDCnDj40LmX5jcz6LPXXrTbHR5lKGVlbSbzx4S+nSb/qCD5l+w5f9bWeS3nYNNTkMa+v6o101q03uT+J9v1ojzP7nyOz/Dmh1EI+kSb/hFsdsJI4GqsuVvl/thJIUOuO1mSw1FxN2PdBq5pHP8nvIa+r0s5xl6vs94lJfUH+gi3MwAggggAACCCCAAAILIlBy6Vd+Y7bc1aaMvBUHfNWbvB0594hlSr+S6N8UT2JTXXXrjfr0e8ojrHA/9OuP4bZNgnWDQ9CGvCak30y32VNrta6zmbcqY7/PVJvX2aypX9H0AE9WcvqVJPFMtXmZrU6J0+InblNFdYcc7sSePTaj+gU5SRF0Nt09wDVnD02+esjvrjBaa+VZoNLfftKl06fftAW15Dl75QdZC7W6TCabtz0257M44K9ZazRvk+vZ9bbFtKFReQdaCp3wut9Q3hWffTxkH3ksfWLLpku/0mWvxWir65Wt+1tcZqOSfr/22uw1scd7rM210lLz9YPUO/HYzOlXCvmcKyzV6pxhUz3Nr7kbvxaT+n6V93775f7ekK/SJGxVnojEk7OOAAIIIIAAAggggMAjESi59CtJ8Ul9ywVBm6I2N2s5/SZ+w7CyvtTWOCBJA23V6wTTCrN5ratuj1vQvfcb9ntWG40rrd7zuV04Vko85RGeMdjen+1XTMhpGW7zTLXwjDH2wvBUm2tZ2ey7r7nUJTl/ymcIt1UJpg3KF8GKPY0ui3m1zeF0VTd5ncuU132TIuiCpl9JEi96bcsEV2t/+lZOunT69Ju2YIJqLkby3MuHqp1rBJNRfjvaVGF1vR3/SuT4nM9CuWBe62pUZyBPeDx63nOYjCbzJt+f4t/knLbvV5LCAXkua8H8gs21s7kmNvI55H/baVEH+VdYXbsT5wV7wBuZI/1KkjLns1kZ/GxxvNEmB93Evt9Vgmun17XOYi43me01ia9nP2AlOBwBBBBAAAEEEEAAgYcSKJb0+1AIFEagiASiPd4XZgfeP+Yb02LwY64Hl0cAAQQQQAABBBBAQCL98hAgUPgC4TbXCrPnhDyIP3ym2rLM0RybVftx3xrp93G3ANdHAAEEEEAAAQQQ0ARIvxoFKwgUsED/kWpbhcm0Uh7PX30kNif0478f0u/jbwNqgAACCCCAAAIIIBATIP3yKCCAAAIIIIAAAggggAACCBS/AOm3+NuYO0QAAQQQQAABBBBAAAEEECD98gwggAACCCCAAAIIIIAAAggUvwDpt/jbmDtEAAEEEEAAAQQQQAABBBAg/fIMIIAAAggggAACCCCAAAIIFL/AE8dZEEAAAQQQQAABBBBAAAEEECh2gSd2siCAAAIIIIAAAggggAACCCBQ7AJPXGBBAAEEEEAAAQQQQAABBBBAoNgFnriZx8s3LAgggAACCCCAAAIIIIAAAiUpsOBR9YnRPF5GWBBAAAEEEEAAAQQQQAABBEpSYMGj6hNjebws+N1yQgQQQAABBBBAAAEEEEAAgYIQWPCo+sR4ni0LfoecEAEEEEAAAQQQQAABBBBAoKAFFiS25lH6LejGoPIIIIAAAggggAACCCCAAAKLKvCQGTgv0u+iAnFyBBBAAAEEEEAAAQQQQACBohHIOQM//vSbTRsUxKh0KokAAggggAACCCCAAAIIIPCQAtkkxNwC8GNOv3PfWFq1kpztjJtGAAEEEEAAAQQQQAABBIpWIG30mzst5hCA8zH9Jt55avOGWBBAAAEEEEAAAQQQQAABBIpIIDX3JabCtDG4wNJv2nvQblK7f12bDrMggAACCCCAAAIIIIAAAggUkYAu9GlhUIuHacPjgwbgx9n3m3oD2r2pd6sSaG16M2X5hgUBBBBAAAEEEEAAAQQQQKAABVLi3U0t+qlJUE2FWkhMzY8Fk35Tq67eVWLuvXnz5jfffDOkLIPKcoMFAQQQQAABBBBAAAEEEECg6ATUxKemv2+++ebmzZupGTg1RT5QAH5sfb+6emuBfmRkRE38au5NDL0DytLPggACCCCAAAIIIIAAAgggUEQCatZTE70Wg7/55hs1G46MjGiBURckCzj9pkbfgYGBYDB4/fr1vr6+a8ryp4SllwUBBBBAAAEEEEAAAQQQQKAABRKC3Z/UrNfX13f9+vVgMDgwMDA4ODg0NJQagIsk/Y6MjIRCoeHhYbXXd2BgQCrk5YH+E4KDEUAAAQQQQAABBBBAAAEEEgUGBga0ABwKhdQe4EJKv7q6qptqL7Yu+l6/fr2Qw6+U2GysI4AAAggggAACCCCAAAIIPJDA9evXdQFYTY5pQ2U2Z37U7/2mrejo6Ghix++NGzeuX7/e09ND+s2mCTkGAQQQQAABBBBAAAEEECg+gZ6enuvXr9+4cUMd/5yp+1fNmNncfh6lX3XM8+DgYH9/f29v76VLl0i/2TQhxyCAAAIIIIAAAggggAACxSdw6dKl3t7e/v7+wcFBNQCnHfxcSOlXN+x5cHDw+vXrV65c6ezsJP0W3xPMHSGAAAIIIIAAAggggAAC2Qh0dnZeuXLl+vXrWvoNhUKZBj9nc8LH3/erS78DAwN9fX2XLl06f/58Eaffzz777N13331dWd59993PPvssm9biGAQQQAABBBBAAAEEEECgRATOnz9/6dKlvr6+gYEBbfBz8aTfwcHBgYEBddjz2bNnizL9fvbZZy+//LI9ZXn55ZfJwCXy15jbRAABBBBAAAEEEEAAgXkFzp49qw5+Vr8AaXh4uKj6frWXfi9evPjFF1+kTb/d3d2XE5a0x+TDzrRteezYsZTYm7Tj2LFjaQuyEwEEEEAAAQQQQAABBBAoKYEvvvji4sWL2qu/RZJ+R0ZGhoeHb968qabfnp6erq6utOnX5/MlhUW7vb6+PtusGz1e+X888cSfJf48+fw730g9Nf/w52sO3pUmGtf8udn7Tbanm+e41Ofys88+01U+7WamHuA/bhee/LMnZ5e/ePr71leau1Kvk8ue5h8/9VzVyVxKUgYBBBBAAAEEEEAAAQQQWASBL774oqurq6enR5346ubNm8PDw5kmvsrm+nnx3m9i+g0Gg1evXr1w4ULa9Lt9+/a0iVG3MxAIpMmmcvr9zk8+Sv3k7sTIxF1p0dPvpk2bdPVMu/nyyy+nbTk5/a7c9kfts56Ttdanl1TUdmt7Hmalv6+v/2HKUxYBBBBAAAEEEEAAAQQQWEiBL7744sKFC1evXg0Gg4ODg6TftPnRXltbm5pxpUzpN03f78T5nT/5B0NZmeF73/v7dTWnJ+SzRa/t//k/fe+vyuSfv19X067sTHOZ2C5ds+s6fgcHBxMPGBwcTLyTtN2/+vQ7Pj5+4IdLvrvBFxrv/nfzkvIdsRjcU2teYpYz8Vc7hKd+uO3fN/xglfD9v376uZdqT4fGx0MnX/6bZzds37beYhb+9tmn/35Dw1dyRbS+X9+Pn/r+z3e88pLZvPK5p/9aePlgn/xx6I/vOL7/9H95+tm/FTbs2vbDv/j+tnOJ1WcdAQQQQAABBBBAAAEEEFhggRJKv6dPn06Nlln2/W7fvj21bPbp9+4fKsv+ck19z11JkiZ+/5Pv/eVPjtyW7v7hJ9/5v145L++TJv7wyrpfHJx7jLSu5ffu3ZuYb3Wfjo+PJ366d+/e1AP06bfn5A7L009ZG/rGM6Tfrh3Ck0vM208PjY+P9/s2/J9PrW+R0+8rf/Pk09Z3ukPj4+N97/zLU8/+Qh7wPJt+HU89+dcbmnvk6/9xu7BE6W3u3vWDJd/b4OsbHw91NzieffJJYYeSmVMryR4EEEAAAQQQQAABBBBAYEEETp8+Xcx9vzdu3FBHPnd2di5O+n0iafmz71R+JKW+93v8p98p+/nxWH6Onn9l6Xd+8gdJOvvK977zD5V7j18aURJwmnidtEvX3q+//npivtV9qku/r7/+euoB6nu/S/5iifyz5Mknljxr/tcdJ5Wu2fR9v107hCXCjtiLwX/csXKJ+f/rU9Lvkh++Kyfi8fHxk1XPPWVrTkq///r00//qi1394Ian/rryWGi82fbU0xvj03F1vPLcfyL9xoT4hQACCCCAAAIIIIAAAoskcPr06c7OTnXk840bN4pt5PPip9907/3qRz7f3b/2ySf/c1nZX8V+vvOd76w7II9zvvZRTeXaf/jef/7zsv97XY3/wUY+L0z61d77/WLb9//i+690xB6zzOnX/I4Sj8fHu3eUa+lX6QRWip6sem5JSvp99ufxoHtww9Ny+h1651+WPPc/Tscu1ldrXkL6XaS/4JwWAQQQQAABBBBAAAEEYgKk36xmvXrIkc/Hf1r2vapTST25iRvRifM715T9ZeXxaOJe/brumV3okc9Dx37+7JLyHeokWH2J7/1+tUNQ3/uV+34XJP2ON9uWzEbiL175Pn2/utZlEwEEEEAAAQQQQAABBBZagPT7KNLv3Y8qy/5q3cEBOdDe7dv/8vrXj09I195Z808/P/iNknjv+l/+3gOm34Wf9aqnYf13n/rBLnmuq6ED65/660qfPJx56HS1sOQ/KbNeLVz67a4RlvxN5bF++b3f5o3PLeG934X+i835EEAAAQQQQAABBBBAQCdA+n0U6VeS4nM+/1VZ2dJ/qtx7SZn/6lTN//MP3/tLZTj036155Q9zT3ol6VpufHw8y2882rRpU2pZdQ6qpG88Uie7+u56eYaqodM7rM89+zeC2fLDyn9/5Qd/obzuu3Dpd3zo5A7rc0/9l2ef+/sfvFy37QeMfE7bQuxEAAEEEEAAAQQQQACBhRMo9fTr8/kS547KtO7z+fQDkR/5dmqj67p/MxMIK/sAACAASURBVFU+7dcdpZ7tse3pVkZWK5NCP7Y6cGEEEEAAAQQQQAABBBAodoFST7+SJHVnsTzyqJvmgmkfxWPHjmUKver+Y8fiM06lLf+Ydg61Vj773R++I08fPXT6fwpL/vYV+auDWRBAAAEEEEAAAQQQQACBRRMg/abJmfm5K9Mz8Nlnn6UdAr1p06Y87vXt9m35wXPfferp7z797Mr1tR2xL0zKdI/sRwABBBBAAAEEEEAAAQQeUoD0m59RN02t5m7pzz77bO/eva8ry969e/M49859H3yKAAIIIIAAAggggAACCCyKAOk3Tc7Mz12L0v6cFAEEEEAAAQQQQAABBBAoDQHSb35G3TS1Ko0HkrtEAAEEEEAAAQQQQAABBBZFgPSbJmfm565FaX9OigACCCCAAAIIIIAAAgiUhgDpNz+jbppalcYDyV0igAACCCCAAAIIIIAAAosiQPpNkzPzc9eitD8nRQABBBBAAAEEEEAAAQRKQ4D0m59RN02tSuOB5C4RQAABBBBAAAEEEEAAgUURIP2myZn5uWtR2p+TIoAAAggggAACCCCAAAKlIUD6zc+oS60QQAABBBBAAAEEEEAAAQQWUoD0u5CanAsBBBBAAAEEEEAAAQQQQCA/BUi/+dku1AoBBBBAAAEEEEAAAQQQQGAhBUi/C6nJuRBAAAEEEEAAAQQQQAABBPJTgPSbn+1CrRBAAAEEEEAAAQQQQAABBBZSgPS7kJqcCwEEEEAAAQQQQAABBBBAID8FSL/52S7UCgEEEEAAAQQQQAABBBBAYCEFSL8Lqcm5EEAAAQQQQAABBBBAAAEE8lOA9Ktvl497xR81jS/fNVo0Pz9qGv+4V9TfJ9sIIIAAAggggAACCCCAQCkJkH71rV1k0VfN8D9qGtffJ9sIIIAAAggggAACCCCAQCkJkH71rV00Xb66G9HfJ9sIIIAAAggggAACCCCAQCkJkH71ra0LjUWzqb9PthFAAAEEEEAAAQQQQACBUhIg/epbu2jiru5G9PfJNgIIIIAAAggggAACCCBQSgKkX31r60Jj0Wzq75NtBBBAAAEEEEAAAQQQQKCUBEi/+tYumriruxH9fbKNAAIIIIAAAggggAACCJSSAOlX39q60LiAmz9tvZX4s4BnzuZU+vt8wO16ZXnAQgtz+MjIyGVlGRkZ0c4YiUS0dVYQQAABBBBAAAEEEEAAgXkFSL96omySZA7H1J3Vp7X/uHw3h/PkXER/nw+yXV9fb1eW+vr6Byn3sMdGIpHa2lr10uqftbW1kUikvr6+u7v7Yc9OeQQQQAABBBBAAAEEECglAdKvvrVzjpdzFwwMTuuvlG77l22Tc58n50/TXS2rfVr0fcQBOBKJVFZWbt68ORAIqL2+gUBg8+bNajVIv1k1HgchgAACCCCAAAIIIIBAXID0G5eI/845Xs5dMMv0++m1e3OfJ+dP4/f3YL910fdRBuDa2trNmzfrRjhr9SH9PlhDcjQCCCCAAAIIIIAAAiUvQPrVPwI5x8u5C2ZKv+qbwFolAoPTc58n50+1S2S/0t7evl1Z1NCr/qnuaW9vz/48ORw5MjJit9sDgUBiWS362u120m+iDOsIIIAAAggggAACCCAwrwDpV0+Uc7ycu2Ahpl+NJjH9ajsXdaW7u9tut+s6fhf1ipwcAQQQQAABBBBAAAEEiluA9Ktv37lDbM6fpqbfn7beSjzbT1tvSZKUV32/Gg3pV6NgBQEEEEAAAQQQQAABBApUgPSrb7jERLqA66np98pINDA4vb5lYn3LRGBw+spIlPSrNUbakc/qp+3t7XQLa1CsIIAAAggggAACCCCAQJYCpF891AIm3sRTpaZf9cL5/N6vRqO+66v+qe1c7JXa2tqqqird4OdIJFJVVfWIv3hpse+U8yOAAAIIIIAAAggggMAjECD96pETI+sCrmdKv1dGomqvr1qP/Bz5rDd6JNuRSGTjxo1VVVXnz58fGRmJRCKff/55VVWVx+PRReJHUh0uggACCCCAAAIIIIAAAoUtQPrVt98CJt7EU9WdjeivlG677mwksdQCrqe72jz7tm/fnvjGb+L69u3b5ym8EB9HIpHa2trE69bX1xN9F4KWcyCAAAIIIIAAAgggUHICpF99ky9g4NSdSh3kPPefuiILuKm/zyy2g8Fgd4YlGAxmcYKFOWRkZEStBbl3YUA5CwIIIIAAAggggAACJSlA+tU3+wIGzrw6lf4+2UYAAQQQQAABBBBAAAEESkmA9Ktv7byKrAtYGf19so0AAggggAACCCCAAAIIlJIA6Vff2gsYOPPqVPr7ZBsBBBBAAAEEEEAAAQQQKCUB0q++tX/UNJ5XqXVBKvOjpnH9fbKNAAIIIIAAAggggAACCJSSAOlX39of94pFFoB/1DT+ca+ov0+2EUAAAQQQQAABBBBAAIFSEiD9llJrc68IIIAAAggggAACCCCAQKkKkH5LteW5bwQQQAABBBBAAAEEEECglARIv6XU2twrAggggAACCCCAAAIIIFCqAqTfUm157hsBBBBAAAEEEEAAAQQQKCUB0m8ptTb3igACCCCAAAIIIIAAAgiUqgDpt1RbnvtGAAEEEEAAAQQQQAABBEpJgPRbSq3NvSKAAAIIIIAAAggggAACpSpA+i3Vlue+EUAAAQQQQAABBBBAAIFSEiD9llJrc68IIIAAAggggAACCCCAQKkKkH5LteW5bwQQQAABBBBAAAEEEECglARIv6XU2twrAggggAACCCCAAAIIIFCqAqTfUm157hsBBBBAAAEEEEAAAQQQKCUB0m8ptTb3igACCCCAAAIIIIAAAgiUqgDpV9/yx1kQQAABBBBAAAEEEEAAAQQKSkCf69Jtk371KsePH9fvYhsBBBBAAAEEEEAAAQQQQCBfBbIMcaRffQNmCacvxjYCCCCAAAIIIIAAAggggMDjEMgyxJF+9Y2TJZy+GNsIIIAAAggggAACCCCAAAKPQyDLEEf61TdOlnD6YmwjgAACCCCAAAIIIIAAAgg8DoEsQxzpV984WcLpi7GNAAIIIIAAAggggAACCCDwOASyDHGkX33jZAmnL8Y2AggggAACCCCAAAIIIIDA4xDIMsSRfvWNkyWcvhjbCCCAAAIIIIAAAggggAACDy0QiUQuX778+eefX758OcuTZRniSL96zyzh9MXYRgABBBBAAAEEEEAAAQQQeDiBY8eOVVZW2uNLVVVVMBic95RZhjjSr14ySzh9MUka/rKl4WRfVJKk4Ml9LacGZ1IPebA94sCXh3/b0HDwy+HIlY8afV+NS9Ld+MqDnSnh6AWqW8IZWUUAAQQQQAABBBBAAAEEFkDg2LFjdrt9+/bt3d3dwWCwvb1948aNlZWV8wbgLEMc6VffSPPAzYx+5durX/ad7JuRouHR4QlRPt1swhSHr/aNyoE4h0XsPd7Q9GlfZDoqzUQmbo5ORkm/OTBSBAEEEEAAAQQQQAABBApAIBKJVFZWbt++PbGuIyMjGzdurK2tTdyZuj5PiIsXIP3GJeK/54GT02+D79zgZHhy9mdSTEq4WvoVe483He9VEnH89Nn/jlw62nC4czKpAH2/SRxsIIAAAggggAACCCCAQJEIdHd32+327u5u3f0cOHDAbrfrduo25wlx8aNJv3GJ+O954JT0e7grOZQqZfUjn8W+k/sb9u7d29C476PLEUmSxKGvTh5u2dfYsK/Fd/yP/RFlaPTwmYNN7ZcunTyYPFh68tLRfQ3v7t3b0LDvdxlGPk/2nzvua9rX0LC/5fCnF4bvqjcgDnfJF2loaNj34eGTXcP66C0n8/YrV0/JxzQ2+U5eGJ6WogPtLfuP98bOIEnTfSebmtoHkhL98LmDTe1X+s4dP+w72NTU0vZlv3xLkiRFBr/y++QLNjYdPPplX1jZKfYe33f4qz9dOHnE19LUdPD4heGJ/i+PH/Z92NT0+/Ze9ZgMIOpZ+RMBBBBAAAEEEEAAAQRKSqC9vT1tyvX5fGn3J+LME+Lih5J+4xLx3/PAZZ9+ZyRp9Jyv8aNY3+/kpY+afKeuyeOXo+G+9t/ta+uWI/TouYMNLYdPXR2N3E1Km5KU0PerdflqKzOjX/2+6fC5wUhUksTRK/6WppN9ctAdOXdwf9uFUXlVHLnwUYvv3Ej8xtTfwZP7Gpt8n/dOiEo1DjYcPDcqRYe//HDfR1djeTZ6/WRTy6nB5OrI9dzv+zKoHDNx4XDjwS+H5Yv0fdq076MLo3claXqy99OWfR9dkY+Y7j3euO/gp1cmZyTpbu/Jpoam359S4nLkykf7Wk4PynXJAJJcXbYQQAABBBBAAAEEEECgJASCwaDdbg8EArq7ra+v37hxo26nbnOeEBc/mvQbl4j/ngcu1/Q78fXhho+uaD2xk11tDW2XJtX06zs3mmaKrDnT780v5byrBdSRcwf3KUOsh0617D9+JU3PdPz2gif3qRdWdsi1+v1XE0o1YsFViva3N6nRNl5G/i2n38MXJtRdM8NfHmw4/ifl8tOiOB07MKoN+ZbTb9OpG+r+yQttDQfPyFlZPk/A1/Cx7JAJRD2MPxFAAAEEEEAAAQQQQKDUBDZv3vzqq69GIrFuOUmS1OHQ9fX1c1PME+LihUm/cYn473ng5PS7d++7ST8Nh+UAqR/5nNz329++Tz9X1odfDs8oqVJJg/Hra7/nSr9iz3F5UHXiolZiZvLKpwflIc0ftX95sU/uktUtwZP7mtr742E7+qfjDb9Vpqce/8q3T4nj0/3tvz2o7zFW06/2CvPM6LnfNRzvkbN8dPTKqY8PH2xpafmwpaVp3171bHL6lTuVlSXhRhJCbyYQXX3ZRAABBBBAAAEEEEAAgRIRCAaDGzdurKqq8vl8n3/+ufrGr91uP3/+/NwC84S4eGHSb1wi/nseOKXv13emf2J8YvZnUs6B86Tfz/fFvg8pfiH1t9ynqqXKpI8SQqM24Dm+IqffzF+qJE4M9nZ9efJIU8NvP7oSf8k2dm45/c5+G9Ns+pUmLxzZd7hrUn4HOF1fdFI9tfQbHTz1YYPvy355ALY82XX7vtn065sn/WYASTJgAwEEEEAAAQQQQAABBEpJYGRkpLa2Vv26340bN/p8vkAgYLfb5+7+nSfExQFJv3GJ+O954HIe+dx5uMH31ewI57sRNTEmpcp4HZTfc6Vf6eaXLY1tl6biBaKRiNrNOxMVtfmnZyYuHE6ZNVoe+ay+myuXlYcfKx3X8vRVlz/a1/bVpc9bDn8dG+AcP7v8O6meWvoNXzjcqI2Hlib+6Iv1JMt9v/Ok34kMIIkXZR0BBBBAAAEEEEAAAQQQqK+vnzsAzxPi4oKk37hE/Pc8cA+Ufse/8jX6zo2I0agkhS+17W/66OKoOCNFJ/u/PLzP90d5ZHBSqozXQfk9Z/qVZ71qOPhp78S0JE1P9H5+cN9R+S3iyYtt+3yn+sJyV2w03Nv+YdPJa9q7xspZ5Vmv9h3+sl+efWuq/9TvGtRqyJ/d7T2+f9++psMXdN3FSrmkemrpV57buen41UlJik4OnDt51Ne0T5k7Oov0mwlEuRp/IIAAAggggAACCCCAAAKzAnMH4HlCXPw0pN+4RPz3PHAPlH5nRi981NTQ2NTWKfemRuLfeNTQdPCjL/vk/Jlz+pXnTO6LfePRviaf/6t+tR94ZrLvzEe+3yrfeJTwvUrxm5Oi10/uO/jllcvtsW88+vTSaHzOKnkC55P7GpQUrR2vraRPv1J04vJJX5PyrUufXxmNDH7p27fvw1P9kfn7fjOBaFdkBQEEEEAAAQQQQAABBBDQBNTJn0dGdN9qI38+T4iLn4L0G5eI/84SLn54Mf2euHCk6Xj8e4+K6ca4FwQQQAABBBBAAAEEECgCgbTRl/Q7Mjw8fPPmzRs3bgSDwatXr3Z2dp4+fTqb9i7N9BsVI4NftzUd/FL3Nb/ZiHEMAggggAACCCCAAAIIIPAYBbIMcfT96tsoSzh9sYLell/fbdj3u+OXRtS5mwv6Zqg8AggggAACCCCAAAIIlJZAliGO9Kt/LLKE0xdjGwEEEEAAAQQQQAABBBBA4HEIZBniSL/6xskSTl+MbQQQQAABBBBAAAEEEEAAgcchkGWII/3qGydLOH0xthFAAAEEEEAAAQQQQAABBB6HQJYhjvSrb5ws4fTF2EYAAQQQQAABBBBAAAEEEHgcAlmGONKvvnGyhNMXYxsBBBBAAAEEEEAAAQQQQOBxCGQZ4ki/+sbJEk5fjG0EEEAAAQQQQAABBBBAAIHHIZBliCP96hvnOAsCCCCAAAIIIIAAAggggEBBCehzXbpt0m86FfYhgAACCCCAAAIIIIAAAggUlwDpt7jak7tBAAEEEEAAAQQQQAABBBBIJ0D6TafCPgQQQAABBBBAAAEEEEAAgeISIP0WV3tyNwgggAACCCCAAAIIIIAAAukESL/pVNiHAAIIIIAAAggggAACCCBQXAKk3+JqT+4GAQQQQAABBBBAAAEEEEAgnQDpN50K+xBAAAEEEEAAAQQQQAABBIpLgPRbXO3J3SCAAAIIIIAAAggggAACCKQTIP2mU2EfAggggAACCCCAAAIIIIBAcQmQfourPbkbBBBAAAEEEEAAAQQQQACBdAKk33Qq8X3d3d2XE5b4bn4jgAACCCCAAAIIIIAAAggUmADpN2OD+Xw+e/JSX1+f8eiUD7p2WGy7+1N2577Dv8Vkebtr7vILftG5L8enCCCAAAIIIIAAAggggEChCJB+M7bU9u3bk8Nv+q1AIJDuFD3eNRbvxXSf5Lovi/S78BfNtbKUQwABBBBAAAEEEEAAAQTyS4D0m7E9sky/tbW1aU4xUGdbVR2IJnzSV2c1ufyivEc84TYZLDVqNg41O0xOX1gKnahxvmAWKszmCqtrd0dYkqRooHqV2bO7xrZScB0RZ9PvWEf1asHxfo9ysoRLpF404UNWEUAAAQQQQAABBBBAAIFSFiD9Zmz9LNPv9u3bU08RanIIWzuS0mm0q2a1ufq8fGxgh8W6zmp7LyQn4SMuk70xNNTsMFmqT8mZVwq1uctN7qNhSS5iFJyNasyNpV+xq269YNsZSDq5UoM0F02tGXsQQAABBBBAAAEEEEAAgZIUIP1mbPaHSL9hX6XgOqrPpx3bzFb5TeD+unWOuiPVFpcvLEkdrwnW3f3hVqfxBW9PvK+4Y6tg2tohRbu8q43OQ0okliQ5/e5oa3aZLduUnmF9xdNfVH8U2wgggAACCCCAAAIIIIBASQqQfjM2e+7pd6rNtVIezKxbxE/cgtMXDjU71tR0Tfndqz0dYo/3BXkIdP97NuP6RrkvWFm63jYbXW2inH5N7hOxnf4tJuMyk3GpybanJ7Yr8VeGiyYewjoCCCCAAAIIIIAAAgggULICpN+MTZ9z+hXbPYK9WYuysxcI+5zl7rZWl3lrhySFmjdYaz5pdFTIrwfLfb+rvV2zfb8m4TW17zcp/Qqb2vov1tlWWGu+1ncsZ7zo7OVZQwABBBBAAAEEEEAAAQRKV4D0m7Htc06/gW1m256033UUarRbbOvMrla5X7hnp9W63mbeosyEFWp2au/9DrW5ygXPCVEZ+ZyUftVvPOpvcphWVetGP2e+aMYb5AMEEEAAAQQQQAABBBBAoHQESL8Z2zrH9CtPVWXxXk5/2p6dVoPB1jikfHqqWnjG6DoSGyEdOuF1vmA2rzKbV1nd7wXkvSkjn+Pf9xvyuQShqm22e3nOi6avCnsRQAABBBBAAAEEEEAAgVISIP1mbG2fz5f+G36T9/p8voyn4AMEEEAAAQQQQAABBBBAAIH8ECD9ztUO3Vksc5XnMwQQQAABBBBAAAEEEEAAgfwQIP3mRztQCwQQQAABBBBAAAEEEEAAgcUUIP0upi7nRgABBBBAAAEEEEAAAQQQyA8B0m9+tAO1QAABBBBAAAEEEEAAAQQQWEwB0u9i6nJuBBBAAAEEEEAAAQQQQACB/BAg/eZHO1ALBBBAAAEEEEAAAQQQQACBxRQg/S6mLudGAAEEEEAAAQQQQAABBBDIDwHSb360A7VAAAEEEEAAAQQQQAABBBBYTAHS72Lqcm4EEEAAAQQQQAABBBBAAIH8ECD95kc7UAsEEEAAAQQQQAABBBBAAIHFFCD9LqYu50YAAQQQQAABBBBAAAEEEMgPAdJvfrQDtUAAAQQQQAABBBBAAAEEEFhMgdJKv9dZEEAAAQQQQAABBBBAAAEESlKgtNLvYv4/AudGAAEEEEAAAQQQQAABBKTr16+jkJ8CpN/8bBdqhQACCCCAAAIIIIAAAgUpQPrN22Yj/eZt01AxBBBAAAEEEEAAAQQQKDwB0m/ethnpN2+bhoohgAACCCCAAAIIIIBA4QmQfvO2zUi/eds0VAwBBBBAAAEEEEAAAQQKT4D0m7dtRvrN26ahYggggAACCCCAAAIIIFB4AqTfvG0z0m/eNg0VQwABBBBAAAEEEEAAgcITIP3mbZuRflOapq/Oaigre0ZwfxKOfXbZazGUWd7uSjmUHQgggAACCCCAAAIIIIBAkkDepd+LNZalTt9UUiUfZKPf39IR0hW4WGN5pkzY2iEm7j9TbX4m+9zUX7fO6GwVpWigZpXgaZckSQzU2oRlJssbHeFDTuP6Rv1FE6+lrU/5nEZb44C2PdcK6TdFR02/ZWWG1TVdamOSflOQ2IEAAggggAACCCCAAAJpBYot/Q402lZVB6LJ93qxxrJCEFa622ZDtdix1SysNGXdaxhPv5IkjoXFqCRFe7wvGF1HlAwmhsPhpGSdfPmELdLvyMjI8PDwzZs3b9y4EQwGr1692tnZefr06QSkzKtK+hXWWE3PGG3v9cvHJabfcKBuk1VYZjAsNZnt1W3K/zH4t5jKDDZvq9dRYTQYBVttR097jbru2BmINdpQh7fSIhgNhmVm27a2ft3Tk7k6fIIAAggggAACCCCAAAKPRiCiLA95rUJJv6FPahyrBaFcEMqt7ia140/set9trRDMFYJQoeycavNUGA0Go7Da2dyXAHOxxlLh9mwQnIfiA2an2tzlDvcmczz9hgN7XPKpVpnNLzhqPlH7ccWu912WlYJ5tdWxra56bWLfb39zpdlkKDOuNFt3BGb7fsUe32s2c7lgrjBbnN5YH3S037fVKqw0W9Y4PO/VOOj7fcj0a9nhq1tvKFvhahtLTL+if4tQ9ozgagoEWt3mZ8qMlb6wJHVsNZU9YxQ21LR90uhcWVb2jMm8odr3SaOrvKxsqa1xSJKk/rp1hjKjteaTrq4jHovBYN3Zk/DssIoAAggggAACCCCAAAKPWSASibyqLJFI5GGqUhjpN9zmMgnuE3J2Fc9UW4xKbBlrdiyz1amjiAd81ZXejilJavcIFen6fiuq/a0uwd6s5tpwq1Nw+dpeE9T0G/7ELZS72uQoJIVPVVuWOZqHJKmvzrbM6r0o9w+G2z1mgyFp5HO0y7va5D6hFImPfO7aYTGtr+uSe5jDgR0Wk9MXkiQ5G6+q7lDq3lVrNRgY+fxwfb/mHV3i+Rqzocz8RkBM6PsVw+HQmNIHH+3wmMrKVtd0RaWO10xlz5g87XIrykm4zOg6Kq8HtslRufqM3MxWQ5lhgxyVJam/cZ1BLfgwf6koiwACCCCAAAIIIIAAAgslEAwGX331VbuyvPrqqw8TgAsj/UqSOCXGhqlG/W6Tufq8JE353SsFx9u+QF+8R1eaK/0Gwn53ubVO7hMONW+QJ07q2BZLvx1bTMJrHbHWiXbVrJa7eeXU+oI31g0Y7apZNV/6lY+Jj4WWJGmgzrbM6QtL/i0mYVsgdvKBOttS0u9Dp19JCrdtMpUttdYd9Vrjs171t1Y7VpmMSw0Gg6GsrKxslZZ+LTUXZf/AG+ayZ5RHR5K63raUPSN4TknSefn977JnDIalys8zZWVLXW2xZ22h/sJyHgQQQAABBBBAAAEEEMhFIBgMVlZWqtH34QNwgaTfUMdut2OtxbrWal1rNi2NRRixt8271WktNxorbJ6mLjkEZ+77DUTFwDazpbZLGmi0VXg6RCmefkVfpVHeH1v6G9cZbe+H+t+zJcxl1V+XNPJZklL7fqMdnhUG4wp1eLb8p8lka+xLPnmYWa8e+r1f8w6lqQYabcYy41prbO4yWbasTO1kF/1uU9bpN9b329jT19+v/gyECL/xvwz8RgABBBBAAAEEEEDgsQlEIpHa2trtKcuBAwdyq1NBpF/xqMtU7vIpI5MlOdrE0q92y6EzXptJ6eGbK/1K0sUay6pq306r+Q25MzaefuUhsbq+X9cRMdziSOj7DVRXZNH3u9rk/kSfnPxVxtm+3746K32/D/nebyz9SmLXDovSyavM3D3W7FhaVlbh9n0daNvhEJaVlZlczb1hZeTznH2/Uk/dWkPZMlv1kUCgvdG9zmLb5k8YTKA9Y6wggAACCCCAAAIIIIBAYQsURPoNNTkML3i75Ll4w117nGajMmT1a6/NXqO8TytJY22ulZaaryXplEdY4fbrEqg865X6MnBP3VpBWGnxKiNhtfQrqu/9Ku8Eh09Vm9UXdnu9VmPsvd/QUbd56XzpVxlOa9rQ2KNcPXTC636jLSRJoRaHcZVHqWe4Ywfv/S5U36/8MPjdK+Uxzsrb2+HATod5mcFgMjt3dnS1OIWlBuOGxt/J7/3OnX4lacBf47SYlhrKlposzhp/dl9IVdh/76k9AggggAACCCCAAAKlJ5CP6Vd+DVP7MZh3BKRwh3e92VRusa51VB/p8r9mNlU4G3tD/redFnkWaHnOZ9fugNxjF/Z7VhuNK63e8wltOZt+pdD7NuPaOuXLcmb7fuVJquQ5n83mCrN5jdN7Kjbnc2CP07LCJFRYHNsaa9Yb5Smjte/7TR35LE/JFZvzWSgXzGtdjeeVPkSxp7nKKpgE82qbu8nr1GbqSqhgApfpzQAAHHBJREFU2lW+7zctCzsRQAABBBBAAAEEEEAAgVwE8i795nITxVmG9Fuc7cpdIYAAAggggAACCCCAwGMRIP0+FvZsLkr6zUaJYxBAAAEEEEAAAQQQQACBrARIv1kxPY6DSL+PQ51rIoAAAggggAACCCCAQJEKkH7ztmFJv3nbNFQMAQQQQAABBBBAAAEECk+A9Ju3bUb6zdumoWIIIIAAAggggAACCCBQeAKk37xtM9Jv3jYNFUMAAQQQQAABBBBAAIHCEyD95m2bkX7ztmmoGAIIIIAAAggggAACCBSeAOk3b9ustNLvcRYEEEAAAQQQQAABBBBAAIGSFCit9Pt3/6tvWc3VZW9d4QcBBBBAAAEEEEAAAQQQQKBUBGqu/t3/6iut9Lv8fw+bvN/wgwACCCCAAAIIIIAAAgggUFICy//3cIml350jy/lBAAEEEEAAAQQQQAABBBAoPYESS7+7RpfzgwACCCCAAAIIIIAAAgggUHoCpF/yMAIIIIAAAggggAACCCCAQPELkH4ztvFvv74TGJye9+e3X9+hPxkBBBBAAAEEEEAAAQQQQCDPBUi/GdOvmnvrzkbm+FGPyfM2pnoIIIAAAggggAACCCCAAAKk37nSb93ZyNyPSN3ZSGBweu5jHumnLZHL0em39mS8Ka0yz7dPi8ORl3bPf6RWJO2Kp3dmsPOWUHrvDKTVYCcCCCCAAAIIIIAAAggkCeye2Dvy7dnPxpJ2Pqb4QPrNGP8Cg9Nq+pUyLMt3jRZu+l1eP/ZiwwI8gqTffPhrTB0QQAABBBBAAAEEEMhTAdLv+MItYynL6OjoyMjI8PDwzZs3b9y4EQwGr1692tnZefr06Qd6IB4+/b549E7H+Mzo7ZnRyaj/1K2KXaPC7+5cvjO9q0WO3MKhyOU70b2HRpfvGnP/cfpaZGY0MjN6a3r/H5RQ2hy5LN7bf0Y8ezM6GLl/9sykOyB2Kuv+9glh1+jzHdPizbt7r0x3DkcHb0c7vpDPvzyh7zf16om3r/X9pjlP49TZ6fsftMb/X+DQnWvT02/tv/XBrRn/uYj/xvTl8ZnRMbG6WT5ATr9XIx/ciI7emZmcnN5/dAESdWI9WUcAAQQQQAABBBBAAIEFEhir/EK8NqkklNtRv5ogdo1VnhEv35Z3Do7d23sk9u/5F4/dPXtrZlKcmRyP73z31q97o4O3Z+Sfm+JbH8pxoKJdTiW/vnhPjSpnA2E5lewa2/DFPTng3Ip2dkdax9S+37RXj4eOXaPCh1NHh++PRmYm78xcvjL143eUjw5Mtt6cmYzcHxwWd50RRyfvVsr7x34RuHft9szgpBygPjgu56NsiOj7zcj0sOn3wNRZccbvl1tCaJ46e+f+B4fla20IREdvTL30zsSumzOXzymfHhVHxem3mmKfirfubnhndHlT5PLMzNlT8gEVH4uT0ZmO9onlu0af99+bVJr8+fZpaeZ+qxKV5SA9Hd37YUL6zXB17ZmYTb9pzjNW3Tcz2h1Wn6ENX0cng7eff+fWB7e+nQxOvaQ8bW/1zwx2yQOePb3fSpF7v5bz/NiGQFSMPY4ZVbUKsIIAAggggAACCCCAAAKPVEDu5YruVbvimqda+++635WzxuidaeXf86MvHhdHI6Ln3dHlcpqItio9Wy+135uMiO49o7+4eH9yKPLjevlf/pVfR8WxOxt2j1acnBaj0Q+UzCy03h2cnn6rUUkl09H9rXKQfv5jcXBGkkc+p7v67O3vnth189vBLqVLr/G2P/JthzxYeszTOzMZnHpx9+jyxsnWsW8lNQodFycj96qVAPX8Ufmiv1bWZ8+WIQyTfjPmtIdMv89/Nh3LsQq93EeqxMXl70zsvTnT2R8dvRmJ/X/G7tGKd2P/xSIcvjsoip56Jf1Gp3+9T6neh5Fr0em3GuR14Xd3rikHyPFVi5q7b+0f//Zs+5jW95vx6vHnIDH9pp6n4pg4ekf07Bld/s6tD8Zn/MfH5JVb33acjNWzsvP+5LVJJf3OTPbKK/Kj1hS5HI3uVfqE533yOAABBBBAAAEEEEAAAQQeqcCeSX9kprNr6hctY1pnqbt3ZvRK/N/z79z6YHLG//GonCbG5XArV2/32PONY4L80WwcUP/lv6tptOLkPfHWHbn3btfo8nenzkbldC1nDa24UlBOv+munnj7wp6xCjlay+n6rRvfXgtMLH/nVuvktx1+defoi1/EEpBHV+db2b5XTPqNUSa6q+sPmX5fOhOVZpTBzOqQ5jszo1djT9XzJ++J0kyHP5Yklzfc2nV1+vJ49NpY9NqtGXF6Nv2+9a5SPXk8871q9VE4lJB+tWmrdk/sHf728pkJLf3OcXX17pLSb+p53gm33p7pODkm//9NRHTXKzH41oz/eIyrsvO+GE+/sVQfe9zvf/C7jKSpyOxBAAEEEEAAAQQQQACBRyZQcej2/t7pa5FvRWXk8/O7xt7ql6Tp2dgyKc50tI+9dCaqnyL3ncmjd2aOHov/U18OuvK//OX0Oxb5sZqT9yjp98PRl84lFE947zfl6vGzKX1pP/bf7RhWMtFYdHRaUtLvpP/OzNE/xA4TjovKMNixt/q/nZ15V4lCnV/I42Tn/SH9ZjTSpd/b4swv2ybXt0zcFmfUabDmnvWq4rNpcexO7DlIbIl3J1tv3fd33Ru8JY80WL5r1H1lRh5CoEzULBy5O5p9+r2ljnpXo6nyHx7x934zXj1ek6T0m3qeXaNyvu2f8nTdH1SHQMt9v+nT72Q81dP3O+/fNw5AAAEEEEAAAQQQQCAfBF78w53LojzXj/vq7DuPWsXksKBlhN1jL3048fye5L7fZnnUZ6zvNyX9ylMLzfb9hltv6/tmtatrV1zeFOmM3j96bFzplB779ZDa9yv3yWk9cC+eivX9untnZjNI8hjV2RPGg0/iHtJvVun36kj0X/aNq3AVe8aujkQlSZo7/S7fJ7/r23pMKfXurV1Xxb3ye79j7iv3B69MPr97zHNtRl7ZNVbd9+3o1Un57fA9t37de1+MTstdvvIoYmUlNpdVmr5f+b1fZSx+xeG716aju5oT3vtNf/XRFw/ffuuo8v5w/BuPYu8P686za3T5h5Fr8n8Cxae/yph+v5Vui9UHZMYfn0n4S5LuaUt88lhHAAEEEEAAAQQQQACBRykgtN7pvHnX3agkoH23O5R/6svv/UbuqZMQCS1TrX133A2jy5umzor3j34sZ9GXTiovRb6b/N5vZ3RyWO7yTdv3u/zQnWvR6AfKe78v+mPv/aa9+uztK0V2Ka/vvnj0TucdtXd3rDo4M9o7+fzu0eUN4Q9GYu/9VsjvJ99TM8jzx8RBcfot9Y3R+TII6Xf+9Psfl+9W7ImPUo6D/sflu/Ok312js7MuR+53Xrz943dG5ba5LXqUN3iXKw/c0WNjFa2Rs5PyvNDXboq/Pjz5wdjM6MidX6i9uHOPfB6R53y+dmtmMhLtUOaU1kY+L0939eW7Rn/RPSMGb8tTRiekXzH1PPL4fvm9c2n2/2wy9P1em7nWLc/5fG1SnvNZmyNu9jmOi7EHAQQQQAABBBBAAAEEHqfA7nFP5/Sg+mLm7WhHIPy8/G91Zc5ndSLoyejRDmXeqV2jL30cn/P51vT+o0qXntxXF5/zeeiu+hUw6dPvrrHKc9ODd+SM09kd+eCmMkVR+qvH49juieor8vfIDI5Fz3ZOVrbfGxXv+z+bEFqm/GPynM9yVjpzbzLWIz32i3P3rk0qcz6PT+9XexyzyB2k3zh3CpY28nmOB7TubESNwXMcs0gfafH1Ic+f+TzyzM+Xz2U1gP4h60BxBBBAAAEEEEAAAQQQQCC9gPpS8S61nzk+F1dKfEtfNvkw0u9c6VcNwHVnI5l+sknI2TRDDsdkTq0Z7yjtVTKd5/mjd69F7lWr4yKSH5q052EnAggggAACCCCAAAIIILCwAvLXr96MbJBn4Z34dX/C9NQ5JRTSb8as+G/+25lCb+L+n7beWtgGzvJsmVJrlsW1w9KcRx7zLI+m/uDj2KvO2sGsIIAAAggggAACCCCAAAKPTqAhvDcoj4gejcxcC0Z+ob5DmlP0Xb5rlPSbMf0+uhbNtfGoIQIIIIAAAggggAACCCCAQJYCpF/SLwIIIIAAAggggAACCCCAQPELkH6Lv42z/I8QDkMAAQQQQAABBBBAAAEEiliA9Ev6RQABBBBAAAEEEEAAAQQQKH4B0m/xt3ER/+cNt4YAAggggAACCCCAAAIIZClQWulXYkEAAQQQQAABBBBAAAEEEChJAdJvSTY7N40AAggggAACCCCAAAIIlJgA6bfEGpzbRQABBBBAAAEEEEAAAQRKUoD0W5LNzk0jgAACCCCAAAIIIIAAAiUmQPotsQbndhFAAAEEEEAAAQQQQACBkhQg/WZs9qmjb95q+Mm8P1NH38x4Cj5AAAEEEEAAAQQQQAABBBDIDwHSb8Z2uNXguNXgiJzcOcePekzGU/ABAggggAACCCCAAAIIIIBAfgiQfjO2gxp9M36sfBA5ufNWgyP9MdE211Jz9fnED3u8LxgcLeHEXUnroY7mT/rlPdFAzSrB0y6v9hxtDozJK+FDTuP6xlBSgQwbUz6n0dY4kPTpAxRPKqff8G8xWd7u0u9lGwEEEEAAAQQQQAABBBBII9Bft87obBXTfPLId5F+M5Jr6Xf0355L+yNJ0sKm33Cr01TlVyskjoXFqCRFu2pesNb1yvseIL6mS7+SGA6HF+CZI/1mfGL4AAEEEEAAAQQQQAABBPQCpN/xBVvGUpbR0dGRkZHh4eGbN2/euHEjGAxevXq1s7Pz9OnT+oaYc3tR02/HFpP1jUbvJodjnUWosNW0h6VTNRaTocwomNd7u+6qfb/9zS7B+IzBVG5xHwnPpl+xx/eazVwumCvMFqe3Q+0Ojvb7tlqFlWbLGofnvRpH5r5ff5XJ+lpddaXDttZiXu30nglLYz7nMkvNxTjHZa91mdM33FWz2ux5r87tdNheMAtrPW1KZ7KcfrfW1Tgt5pUm0yqH91Tmruz4+fiNAAIIIIAAAggggAACeSAgdr3vtlYI5gpBqLC6m7qUzrGwulOoMJvXuOrOx/55H2r3OlcLJpNJeMFVd0bZOdXVvMVmLjebK8zm9R5fr1xabHUa7d7mHS7Hequ53OzYHVDOKXa977KsFMyrrY5tddVr1b7ftFefVRF7fZ71ZmGlIKw0217z9UeVj0L+6vVmU7nZss7d+L5bWFXTJe8PB/a45BtZZTa/4Kj5JKsBspIk0fc7y61bW9z0u9VkqPD4lSHN/e/ZjOvq+iWp622LUe371UY+i21Oo77vt2uHxbS+rmtKafUdFpPTF1J7hldVd8iPpdhVazUYMo589m8xGsrd6qVDLQ7TqppAVGzbZDJvU59UqWenxeRqC0e7vKsNgssXUh4vX6XJvEMe8CwXX+lq7hMlSezZbTPGnj8dHpsIIIAAAggggAACCCCQZwJjzY5ltjr1BckBX3Wlt2NKEk94hJVO5Z/3UvgTt3ml2z8lSSGf02SpVjq6QodcwkpPhygG3jCbNjT2K5m3a6fVuMbbI0niEadhqbXmvJJ5L9ZYljl9YUnqq7Mts3ovyjvD7R6zwSCPfE539QSgULPdaNmhRJIxv7vc6DoSliTRv8UkRxL5RB01a4wGJX2EP3EL5a62Ibl0+FS1ZZmjWVlPOFv6VdJvehdJkhY3/b4mCK91xK7d7jFVVAei2aXfaFfNKqPriPJ4SZI0UGdTnjD5sdgWiJ1woM62dI70azJtjV861Owwyn8BxHaPoD7o0R7vC4L7E1GS0+/shbretqijsv1bTKYt/tjlhxptS+N/fzJC8gECCCCAAAIIIIAAAgjkgcCU371ScLztC/TNjt/s2GqaDSZy1jC5T0jhVqfxBTncKosYHpPTQVIMGWq0GW2NQ5J4xCUfqfbTyi9gWuv6lHc2teJyQSX9prt6EoqovPsp7wrLJ9rdL0+HVGF0fRILH6Emh5p+O7Yk13l1tu8Vk36TwBM3FiD9GoXqMwmnjPZ4V8dmvep4TTC/EQ+r7R7hAdJvh2eFwbhCEMpjPyaTrbFP9FUaLbXxyajkp2Wu9GvWpq2SH1CL96I8z1Z1hUn+/5WLNZZyT4cov3LsXS0/+uqi9UsnvferFU+4S1YRQAABBBBAAAEEEEAgPwXE3jbvVqe13GissHmausKS6Ks0GJYlhguTqzUsj07VTbgb7fCsEDyn4relBoHLSvpdK49jlZf4wNXk4v11sZHPUsrV42dTfvcfrXGtt1rWWK1rreZlBiX9yhedjVSfuE1y329y9pH6G9cZbe9nNfiZ9JsknrihS79jb/7jve7j0W+6x978R3USrPlmvQpUlxudrbP/rSKF21zLYjM5P0T67apZbZL7ZpMXf5Vxtu+3r86aZd+v+n82yuCHrlqLsdLXscNiVvuQM6ff2f8cSiieXB22EEAAAQQQQAABBBBAIH8FQme8NpM89U/H1oRuuXh95b7f1V7lDVs51IZ6+8N3k/t+BxL6flPSb7jFMdt1LHezKX2/8ZNLkqRdfXbfULPDaKluV9NTuHlDrO+3umI2+8z2/er6qxOGrM6eMN0a6TedirIvMf1O7F57f+KGeujM3fDE7rWj//bcPOlXkuTR8BWu5q9D8juyoUDzJrNxTewZSpt+e2otRmWc/Ow3HoltLqO55mv5ytqsV/Ig5A2NPUr+DZ3wut9oC0lSqMVhXOVR3vsNd+zQ3vsN93zi8yvvo2vF1fd+5TKSJP+vzGr1xXF5dL51mWBeaVEvl7nv12iocKcprurwJwIIIIAAAggggAACCOSnwNdem71GiQySNNbmUv7lL78CGX+HVhzwVW/yygcMNTtMZs8JOYuGjrjVdyRj7/3Kg5zlmYZMytRF8sjnlPQr9Xqtxth7v6GjbvNSJf2mu/qsU69X7sBTXt8NnfI6VhqUr1kNt7lMwha/XI9woGZd7L1fUX3vV0k04VPVZnUmpNlzZVwj/Wak0dLvbd/WmbsJXbhKidu+rfOmX0kKdexx21aZjAaDcYXZtqUuNj+zJKVNv+J5r9VkNK3y+Ke07/sN+TYJxmWC470eLb5K8TmfhXLBvNbVqE7LJvY0V1kFk2BebXM3eZ2x19l7vGsM6jAArXh80marZZUgrHJqs7pJUqhxvcGQMEA//cjnKpN1W2ONM7V4Rkk+QAABBBBAAAEEEEAAgTwQCPnfdlrUNygrrK7dASXkxOd8LheEVTZPi9rLJoVO1DiUOZ9Nq52x73lR53yukOd8tmyoVr8RJn36lcTAHqdlhUmosDi2NdasNzoPhSUp7dU1lVDba1ZhhWBZY3PW+rsOuQST2d0akvp87jWCqdxitXua33OZYl136pzPyuzTa5zeU1kNe2bOZ806zYqWftN8Ft8VOblTjcHxHQXwO+nF3aT6im2bBNt7sUH7SZ+wgQACCCCAAAIIIIAAAgg8VgE5aSsTTedcC/p+M9LdanDcavhJ5OSuOX6UA3ZmPEVefpAp/YZPVVvLXW3KlzDlZcWpFAIIIIAAAggggAACCJSWQM9Oq2l9ndwfHe1vrjQJ2+T5eXNeSL8Z6e5+5Yuc3Dnvz3Rf4rTOGc+WPx+kS7/9jXaTqdxW057tmIH8uR1qggACCCCAAAIIIIAAAkUrEA7UuSzCCkFYKVhddepY7ZxvlvSbMx0FEUAAAQQQQAABBBBAAAEECkaA9FswTUVFEUAAAQQQQAABBBBAAAEEchYg/eZMR0EEEEAAAQQQQAABBBBAAIGCESD9FkxTUVEEEEAAAQQQQAABBBBAAIGcBUi/OdNREAEEEEAAAQQQQAABBBBAoGAESL8F01RUFAEEEEAAAQQQQAABBBBAIGcB0m/OdBREAAEEEEAAAQQQQAABBBAoGAHSb8E0FRVFAAEEEEAAAQQQQAABBBDIWYD0mzMdBRFAAAEEEEAAAQQQQAABBApGgPRbME1FRRFAAAEEEEAAAQQQQAABBHIWIP3mTEdBBBBAAAEEEEAAAQQQQACBghEg/RZMU1FRBBBAAAEEEEAAAQQQQACBnAVIvznTURABBBBAAAEEEEAAAQQQQKBgBEi/BdNUVBQBBBBAAAEEEEAAAQQQQCBnAdJvznQURAABBBBAAAEEEEAAAQQQKBgB0m/BNBUVRQABBBBAAAEEEEAAAQQQyFmA9JszHQURQAABBBBAAAEEEEAAAQQKRoD0WzBNRUURQAABBBBAAAEEEEAAAQRyFiD95kxHQQQQQAABBBBAAAEEEEAAgYIRIP0WTFNRUQQQQAABBBBAAAEEEEAAgZwFSL8501EQAQQQQAABBBBAAAEEEECgYARIvwXTVFQUAQQQQAABBBBAAAEEEEAgZwHSb850FEQAAQQQQAABBBBAAAEEECgYAdJvwTQVFUUAAQQQQAABBBBAAAEEEMhZgPSbMx0FEUAAAQQQQAABBBBAAAEECkaA9FswTUVFEUAAAQQQQAABBBBAAAEEchYg/eZMR0EEEEAAAQQQQAABBBBAAIGCESD9FkxTUVEEEEAAAQQQQAABBBBAAIGcBUi/OdNREAEEEEAAAQQQQAABBBBAoGAESL8F01RUFAEEEEAAAQQQQAABBBBAIGcB0m/OdBREAAEEEEAAAQQQQAABBBAoGAHSb8E0FRVFAAEEEEAAAQQQQAABBBDIWYD0mzMdBRFAAAEEEEAAAQQQQAABBApGgPRbME1FRRFAAAEEEEAAAQQQQAABBHIWIP3mTEdBBBBAAAEEEEAAAQQQQACBghEg/RZMU1FRBBBAAAEEEEAAAQQQQACBnAVIvznTURABBBBAAAEEEEAAAQQQQKBgBEi/BdNUVBQBBBBAAAEEEEAAAQQQQCBnAdJvznQURAABBBBAAAEEEEAAAQQQKBgB0m/BNBUVRQABBBBAAAEEEEAAAQQQyFmA9JszHQURQAABBBBAAAEEEEAAAQQKRoD0WzBNRUURQAABBBBAAAEEEPj/269jEwAAGIZh/3/dH0yXgA4IFHUyAQIEsoD6zXSGBAgQIECAAAECBAgQIDAjoH5nXuVQAgQIECBAgAABAgQIEMgC6jfTGRIgQIAAAQIECBAgQIDAjID6nXmVQwkQIECAAAECBAgQIEAgC6jfTGdIgAABAgQIECBAgAABAjMC6nfmVQ4lQIAAAQIECBAgQIAAgSygfjOdIQECBAgQIECAAAECBAjMCKjfmVc5lAABAgQIECBAgAABAgSygPrNdIYECBAgQIAAAQIECBAgMCOgfmde5VACBAgQIECAAAECBAgQyALqN9MZEiBAgAABAgQIECBAgMCMgPqdeZVDCRAgQIAAAQIECBAgQCALqN9MZ0iAAAECBAgQIECAAAECMwLqd+ZVDiVAgAABAgQIECBAgACBLKB+M50hAQIECBAgQIAAAQIECMwIqN+ZVzmUAAECBAgQIECAAAECBLKA+s10hgQIECBAgAABAgQIECAwI6B+Z17lUAIECBAgQIAAAQIECBDIAuo30xkSIECAAAECBAgQIECAwIyA+p15lUMJECBAgAABAgQIECBAIAuo30xnSIAAAQIECBAgQIAAAQIzAup35lUOJUCAAAECBAgQIECAAIEsoH4znSEBAgQIECBAgAABAgQIzAio35lXOZQAAQIECBAgQIAAAQIEsoD6zXSGBAgQIECAAAECBAgQIDAj8F6/B1QLXwLxCP9dAAAAAElFTkSuQmCC" }, "c448a783-da5a-499b-a52d-62be28a72438.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "## Files 📂 and Running Sessions 🏃‍♀️\n", "\n", "Jupyter Notebook lets you navigate the files in a separate browser tab. \n", "\n", "Go ahead and click on the Jupyter icon in the top left corner!\n", "\n", "![image.png](attachment:212ecd19-156e-48dd-99c7-e2ee7457de6f.png)\n", "\n", "It will open a new browser tab with the listing of the files on the server:\n", "\n", "![image.png](attachment:5aa6b072-c4d7-47de-9e75-0a107a37e2f2.png)\n", "\n", "It also shows the list of running sessions and terminals in the `Running` tab:\n", "\n", "![image.png](attachment:c448a783-da5a-499b-a52d-62be28a72438.png)\n", "\n", "Alternatively it is also possible to access this page using the command in the `View` menu:\n", "\n", "![image.png](attachment:2d33971b-509e-433b-809e-2f0861a13105.png)" ] }, { "attachments": { "72f98bea-d61c-40cd-8f56-29df50ae5f8d.png": { "image/png": "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" }, "86ac8b15-8a6b-4d4d-b315-0c8a73870e3b.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "## Editing Files 🖊️\n", "\n", "Jupyter Notebook also has support for editing files. Double-click on a file (or `Right Click > Open`) to open the editor:\n", "\n", "![image.png](attachment:72f98bea-d61c-40cd-8f56-29df50ae5f8d.png)\n", "\n", "![image.png](attachment:86ac8b15-8a6b-4d4d-b315-0c8a73870e3b.png)" ] }, { "attachments": { "88ef6621-8ef1-4174-939c-3dcd8d9166ef.png": { "image/png": "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" }, "9016e117-00db-490f-80c4-fa3ed6766d0f.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "## Terminals 🖥️\n", "\n", "To create a new Terminal, select `File > New > Terminal` in the menu:\n", "\n", "![image.png](attachment:9016e117-00db-490f-80c4-fa3ed6766d0f.png)\n", "\n", "The terminal opens in a new browser tab:\n", "\n", "![image.png](attachment:88ef6621-8ef1-4174-939c-3dcd8d9166ef.png)" ] }, { "attachments": { "72198f40-0581-4a18-bc23-8b4674351a97.png": { "image/png": "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8WnDtOz0vaw17i9bbRavMjLOzDt1b9ZuOrdi6tOcxTX7nveNqWFXuU8LyXnO4nK+sXYlXXwe+RuKDkAABEAABEAABEAABEBAFlTOcqjEYKQwUnU8RB5fDiON/DF/egfSSDtfD/PTb4c7gAAIgAAIgAAIgAAIgECUBM4ipD3fRwEjhZFGOTAH7g0jHUAy/ASMdDgXnAUBEAABEAABEAABELiUBGCkg2/LmZg8fPjwyZMnz549e/HixcuXL1+9evX69es3b968ffv23cDxzXscf/fNN98MXPju7du3b968ef369atXr16+fPnixYtnz549efLk4cOHgw/wUZ6Bkb7n2wojfU9QaAYCIAACIAACIAACIHAZCJzJvtSEUSNFjVQdD5HHMNLIEaMDEAABEAABEAABEAABEBg5ARjpIPIzMUGNdBBgJGdgpJFgxU1BAARAAARAAARAAARA4EIJnMm+1ExRI0WNVB0Pkccw0sgRowMQAAEQAAEQAAEQAAEQGDkBGOkg8jMxQY10EGAkZ2CkkWDFTUEABEAABEAABEAABEDgQgmcyb7UTFEjRY1UHQ+RxzDSyBGjAxAAARAAARAAARAAARAYOQEY6SDyMzFBjXQQYCRnYKSRYMVNQQAEQAAEQAAEQAAEQOBCCZzJvtRMUSNFjVQdD5HHMNLIEaMDEAABEAABEAABEAABEBg5gQ820t/97ndffvnl119//c0333z77bd//vOfv//+e9d1/zc4fjjvY2RszsQENdIRvS8w0hGBRjcgAAIgAAIgAAIgAAIgMEICZ7IvNa+///u//8d//Md/+qd/+pd/+Zdf/OIXv/zlLzc3N/9VOf7PeR9q75HGZ2ICI430vejeHEbaZYEIBEAABEAABEAABEAABD4WAmeyL/Whb9269Q//8A93797953/+542NjV/84hf379//pXIUz/tQe480PhMTGGmk70X35jDSLgtEIAACIAACIAACIAACIPCxEDiTfakP/etf/3p3d/fRo0dPnz7d39+v1+sHBwd/+MMfvgyO5yccX33oofYeaXwmJjDSSN+L7s1hpF0WiEAABEAABEAABEAABEDgYyFwJvtSH3pnZ+e3v/3tF1988fz588PDwz/+8Y9ff/31q1evXgdH84TjzYceau+RxmdiAiON9L3o3hxG2mWBCARAAARAAARAAARAAAQ+FgJnsi/1oXd2dn73u9998cUXX3311cuXL4+Ojnwd7XjoUPF8+xMOtfdI4zMxgZFG+l50b345jNRtbGfseU7HYrExwmatzGbd7ebYH5WvU+2zmhCiE/S3iOL3d0UrTuiVQrNz81Y1M8VSO0I8z+nEKg1m/K6aXzG1OInFYmSCG9dzle7FnbsMD2o3OV2uDH8NZ0EABEAABEAABEAABEAgjMCZ7Eu9WaVSefLkSb1ebzQavo42m803b950lPPd+x3fvPeh9h5pfCYmMNJI34vuzS+DkdbvmpTq6c1a0xXCbdY20wal5r1GN8veqCOinaD39Uh+a9wxtNVCZlbPHgT3P91InUpqinA7V3nuCCGc55X8VU6m0pXj4PJTf8JIT8WDF0EABEAABEAABEAABEIInMm+1Hudl5H63vo+Wqr2Hml8JiYw0kjfi+7NL95InZJNqbXZUz109orFPe/Mca1w3eAJzic5X0gVD2QhsiOinUAc1/LXdB5nLM74YqZ8JB+wfI3qK7n0kmnMaXzayu5JMxRH5cyixhKcJ5gWtBSHwclJzbxRarS6fNpRq56d1bP7orFuaDerwcnTaqT123psJlNTC6etenmjXPeyaD7IWDOcTXI+qdtrFe+ccPay1hRjU5q+lMldD2qkbr24YvAE45Ncs7LvX2UdeAacAAEQAAEQAAEQAAEQ+BsicCb7Urn853/+5+PHj589e/bixQt/Eenr16/9Mqk/X7dTLPWD0IppqJSqvUcan4kJjDTS96J784s30t0UG7dLwyuHbnWV08V8Q3qdW7utk9lsfZiR1m9rZD4nTbLVLFiUrcj5ruXrJJZIlt/Jh21umHQqU22J6ipn18ueJzrVNTu50RCikZsn2qqnhW49t0CN9XoXkBe5u2m+kJdF22bBnExVfM88rUbazC/EtNv992nf9qhgUi2967tpKZmgyW1HtGqZKWLe9SrDR0U7HvNn7dZuanQhV5N8nOpNjVrFHnfvSxS/ggAIgAAIgAAIgAAIgIBH4Ez2pTJ7z3WkfV769u3bk9QURuoT+LtvvvlmkNHbt2/fvHnz+vXrV69evXz58sWLF8+ePXvy5MnDhw/Vd+Ujji/cSN1tmyTS1cGypBC+pNlbQZ3xKG8QI380rEbact2gVWPdIIsFxxPX7lLMZsEkRu5QFjnJdDL/wJsh7L+vh+3b+r859y0ptz1vuVO6xq0N3wSdks3tLU8mTzPSenYmZt4bLo/OpkVmsvXgkSvLTOYpF6OanVWq5etUnvQ0tUvgMGeMW0W/otqTIX4BARAAARAAARAAARAAgR4CP8VI32ev3b79jTqCOuhcMFIYac/Q7Pvlwo1U7KYYOaFG2qqkJlhqN0j5uGgRLbs/xEjd/WJ6ydBndX1O1xIkFhgp9zZAktf71z6VRdTqvbS9wCmh2lKmfCjE04wWi9EEY/6fOKUzmVqgi/JaabOxGCFk3PszFiP+/kanGalXI+30HjyB/7NxxyAL+Y6t1j7jxC65jzPej3bTqr+zkSQQIxNBbglGqZF/3ns7/AYCIAACIAACIAACIAACAwQ+2Ej/4z/+47e//e3+/v6XX37ZaDT87Xb9L4B55R3+t8B0tt4dnNB7VikdyD2qE2diglm7Ub0Nffe9eCM9LtmU9JUTnQeZ1HrV6a8QnlQjrWdniH6rvWazvqYPqZH69dVD5emP68VrnCwVHfmSWfAm9yovd8PGusGu+RN9vZNuJZXQcwdCnGakQq4jnUpX1dnIrXphJV06FLJGOp3tSG9l2Ztm/Dynj3VqpG75WlAjnabJz4P6bzcpRCAAAiAAAiAAAiAAAiBwGoEz2Zd6owcPHvz3f//306dP6/X68+fPX7x4cXh4+PLlyz/+8Y9H3vF1cPiCqn43jLrQtM9LT6mUqr1HGp+JCYw00veie/OLN1Ih5F67REveqzYcIY6b1fspnTLb2+uovY5UVizd2i2devNpOxsatYNWNZ2g9qY3mfWwlJ6jMa8C6a8jLXm1SFmWnM7UWk7pum5veOtShVu/rUsjletIqdEWWqe6lkxtKOs/W7XMNEs+UJ3QrawwfrN2upEKp5KeirEr2dJ+0225zkE5t8TIbEY6qlzrGqwjPSrZCZZ64IpWNT3ZXkfqPi9YnXWkn2l0Me9/GU7zQTa56j9Q9x1EBAIgAAIgAAIgAAIgAAKDBM5kX+rl//7v//6b3/zmyZMn+/v7BwcHz58//+qrr168eNEIjkPveOkdf/QO9TtLT/qeGBgp1pGqw6wbXwYjFcJtbGftOe/7SAnVFpK5nWAhp7/XrtyTlmuLssA4dK/d+kZSizM+oxtXc9W9nDFBtdXKv12n2nIuY+ma3MDWyj2Syuo+LSTnOYvLebDalXTRnwHb3mtXbtWrLfXsZ+vupFg8qVRIZQLuborFU5Xj0/bale387yOdkN9HShO6dbNYC5aANh9krRnOpzif0pN3qv5pZydjTlKa4LqVyd/Q6PWy11l7r12WYHzOzntPIc/jAAEQAAEQAAEQAAEQAIGTCXywkf7617/e3d199OjR06dP9/f36/X6wcHBH/7why+Dw3fUjqb6FdSjoyN/Zq/65aVqmRRGCiMdPlovh5EOz+0nnu2UUn/ifXA5CIAACIAACIAACIAACPzsCHywkf7Xf/3X/v5+o9F4/fr127dv//SnPzmO8+23334XHMfK8Wfv+Mtf/vL27du+r4rp230XRgojHf4/EYx0OBecBQEQAAEQAAEQAAEQAIGfM4EPNtJardZoNN6+ffvdd999//33P/zww48//vjXv/61Iw5Dqbx7967RaKhSetK3lQ6q6dAbRnHyTEywjjSKt2DIPTsD669//euPP/74ww8/fP/99999993bt28bjUatVhtyzc/kFGqkP5M3CmmCAAiAAAiAAAiAAAicP4Ez2Zfa/YcZabPZ/PLLLw8PD7/++uvXr1935u6qE3f9GEbawwTfR/oRG6n6/xViEAABEAABEAABEAABEPibIjBiI/3666+/+OKLFy9edMqknS2OegTs3TsYaQ8QGCmM9G/qLyY8LAiAAAiAAAiAAAiAwN8IgREb6cuXL//nf/7n+fPnL1++9MukMNI+98Y60uH/68FIh3PBWRAAARAAARAAARAAARD4ORMYsZE2Go3f//73BwcHh4eHR0dHr1+/hpHCSN/rfyAY6XthQiMQAAEQAAEQAAEQAAEQ+FkR+GAj3djY+NWvflUul3d2dh4+fPib3/zmv7zjv4OjOuzY29t78uRJvV5vNBow0j4X9X9FjXT4/0Aw0uFccBYEQAAEQAAEQAAEQAAEfs4EPthId3Z2fve7333xxRdfffXVy5cvG41G5ytJ/+AdwfeSdn9+9dVXv//97x8/fvzs2TN/x91Xr16dtLnRoK2NDPOZmGCv3RG9LzDSEYFGNyAAAiAAAiAAAiAAAiAwQgJnsi81r8ePH3/55ZevXr3605/+9N1333377bcdtzzlC1329/d9j/U3N4KRDoo3aqTqMOvGMNIuC0QgAAIgAAIgAAIgAAIg8LEQ+GAj7fv2lz//+c/ffPPNn/70p/8bHEPv/MUXX8BIBy1UPQMjHf7/Fox0OBec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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "## Command Palette 🎨\n", "\n", "Jupyter Notebook includes a command palette, just like in JupyterLab.\n", "\n", "Hit `Ctrl-Shift-C` or `Accel-Shift-C` to activate it. Or via the menu with `View > Activate Command Palette`:\n", "\n", "![image.png](attachment:72198f40-0581-4a18-bc23-8b4674351a97.png)\n", "\n", "Using the palette is very convenient and can give a significant productivity boost over time!" ] }, { "attachments": { "9c47f73c-24f2-4c1a-aa3a-52e231144057.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "## Themes 🌈\n", "\n", "Since Jupyter Notebook v7 is heavily built on top of JupyterLab, it also has support for a Dark Mode! 🕶️\n", "\n", "Go to `Settings > Theme > JupyterLab Dark` to select the theme:\n", "\n", "![image.png](attachment:9c47f73c-24f2-4c1a-aa3a-52e231144057.png)\n", "\n", "New themes can be installed using the federated extension system. These themes will be compatible with both JupyterLab and Jupyter Notebook." ] }, { "attachments": { "ac1323eb-c6e0-4b7c-80f3-7bf5f84adf98.png": { "image/png": "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" } }, "cell_type": "markdown", "metadata": {}, "source": [ "## Zen Mode 😌\n", "\n", "This is an exclusivity in Jupyter Notebook v7 😎\n", "\n", "Activate the palette and choose `Toggle Zen Mode`. The interface will focus on the notebook and the notebook only!\n", "\n", "![image.png](attachment:ac1323eb-c6e0-4b7c-80f3-7bf5f84adf98.png)\n", "\n", "Press `Escape` to exit, or re-run the `Toggle Zen Mode` command from the palette." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Third Party Extensions 🧩\n", "\n", "Jupyter Notebook v7 supports third-party extensions developed for JupyterLab 3.0+, using the new distribution system. These extensions can be installed via `pip`.\n", "\n", "For example the extension to enable Jupyter Widgets rendering in both JupyterLab and Jupyter Notebook can be installed using the following command (run the cell): " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install ipywidgets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now reload the page and resume from here. In the next section we will be able to create and use Jupyter Widgets!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Widgets\n", "\n", "Now let's instantiate a new widget:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "from ipywidgets import IntSlider\n", "\n", "slider = IntSlider()\n", "slider" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "slider" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rich Display\n", "\n", "Just like in many Jupyter Frontends, Jupyter Notebook supports rich display rendering. For example:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from IPython.display import Latex\n", "\n", "Latex(\n", " r\"\"\"\\begin{eqnarray}\n", "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\\n", "\\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n", "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n", "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0\n", "\\end{eqnarray}\"\"\"\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Matplotlib figures:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "x = np.linspace(0, 10, 100)\n", "\n", "plt.plot(x, np.sin(x))\n", "plt.plot(x, np.cos(x))\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Or even HTML:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from IPython.display import HTML, display\n", "\n", "s = \"\"\"\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
Header 1Header 2
row 1, cell 1row 1, cell 2
row 2, cell 1row 2, cell 2
\"\"\"\n", "h = HTML(s)\n", "display(h)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## That's it!\n", "\n", "Hope you enjoyed the tour. If you have more question or any other issues, don't hesitate to go to the repository on GitHub!\n", "\n", "https://github.com/jupyter/notebook" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.2" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: binder/postBuild ================================================ #!/bin/bash set -euo pipefail python -m pip install -e ".[dev,test]" jlpm develop ================================================ FILE: buildutils/package.json ================================================ { "name": "@jupyter-notebook/buildutils", "version": "7.6.0-alpha.4", "private": true, "description": "Jupyter Notebook - Build Utilities", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "main": "lib/index.js", "types": "lib/index.d.ts", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js" ], "scripts": { "build": "tsc", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "watch": "tsc -w --listEmittedFiles" }, "dependencies": { "@jupyterlab/buildutils": "~4.6.0-alpha.4", "commander": "^6.2.0", "fs-extra": "^9.1.0", "semver": "^7.6.3", "typescript": "~5.9.3" }, "devDependencies": { "@types/fs-extra": "^9.0.10", "@types/node": "^22.13.4", "@types/semver": "^7.5.8", "rimraf": "^3.0.2" } } ================================================ FILE: buildutils/src/develop.ts ================================================ /* ----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ import commander from 'commander'; import fs from 'fs-extra'; import path from 'path'; import process from 'process'; import { run } from '@jupyterlab/buildutils'; commander .description('Setup the repository for develop mode') .option('--overwrite', 'Force linking the notebook schemas') .option('--source', 'The path to the notebook package') .action((options: any) => { const { overwrite } = options; const prefix = run( 'python -c "import sys; print(sys.prefix)"', { stdio: 'pipe', }, true ); const source = path.resolve(options.source ?? process.cwd()); const sourceDir = path.join( source, 'notebook', 'schemas', '@jupyter-notebook' ); const destDir = path.join( prefix, 'share', 'jupyter', 'lab', 'schemas', '@jupyter-notebook' ); if (overwrite) { try { fs.removeSync(destDir); console.log('Removed previous destination:', destDir); } catch { console.info('Skip unlink', destDir); } } console.log('Symlinking:', sourceDir, destDir); fs.symlinkSync(sourceDir, destDir, 'dir'); }); commander.parse(process.argv); ================================================ FILE: buildutils/src/ensure-repo.ts ================================================ import * as path from 'path'; import * as fs from 'fs-extra'; import { writePackageData } from '@jupyterlab/buildutils'; /** * Ensure the application package resolutions. */ function ensureResolutions(): string[] { const basePath = path.resolve('.'); const corePath = path.join(basePath, 'app', 'package.json'); const corePackage = fs.readJSONSync(corePath); corePackage.resolutions = {}; const packages = Object.keys(corePackage.dependencies).concat( corePackage.jupyterlab.singletonPackages ); packages.forEach(async (name) => { let version = ''; try { const data = require(`${name}/package.json`); version = data.version; } catch { const modulePath = require.resolve(name); const parentDir = path.dirname(path.dirname(modulePath)); const data = require(path.join(parentDir, 'package.json')); version = data.version; } // Insist on a restricted version in the yarn resolution. corePackage.resolutions[name] = `~${version}`; }); // Write the package.json back to disk. if (writePackageData(corePath, corePackage)) { return ['Updated dev mode']; } return []; } if (require.main === module) { void ensureResolutions(); } ================================================ FILE: buildutils/src/get-latest-lab-version.ts ================================================ import * as fs from 'fs-extra'; import * as semver from 'semver'; function convertPythonVersion(version: string): string { return version .replace('a', '-alpha') .replace('b', '-beta') .replace('rc', '-rc'); } function extractVersionFromReleases( releases: any, versionTag: string, currentVersion: string ): string | null { const npmCurrentVersion = convertPythonVersion(currentVersion); const isCurrentPreRelease = semver.prerelease(npmCurrentVersion) !== null; if (versionTag === 'latest') { // Find first version that is newer than current and matches pre-release criteria const release = releases.find((r: any) => { const version = r['tag_name'].substring(1); // Remove 'v' prefix for semver const npmVersion = convertPythonVersion(version); return ( (isCurrentPreRelease || !r['prerelease']) && semver.gte(npmVersion, npmCurrentVersion) ); }); return release ? release['tag_name'] : null; } else { // Find exact version match const release = releases.find((r: any) => r['tag_name'] === versionTag); return release ? release['tag_name'] : null; } } function extractCurrentJupyterLabVersion(): string { const toml = fs.readFileSync('pyproject.toml', 'utf8'); const match = toml.match(/jupyterlab>=([^,]+)/); if (!match) { throw new Error('Could not find JupyterLab version in pyproject.toml'); } return match[1]; } async function findVersion(versionTag: string): Promise { const url = 'https://api.github.com/repos/jupyterlab/jupyterlab/releases'; const response = await fetch(url); if (!response.ok) { const error_message = `Failed to fetch package.json from ${url}. HTTP status code: ${response.status}`; throw new Error(error_message); } const currentVersion = extractCurrentJupyterLabVersion(); const releases: any = await response.json(); const version: string | null = extractVersionFromReleases( releases, versionTag, currentVersion ); if (version === null) { const error_message = 'Invalid release tag'; throw new Error(error_message); } return version.substring(1); } async function getLatestLabVersion(): Promise { const args: string[] = process.argv.slice(2); if (args.length !== 2 || args[0] !== '--set-version') { console.error('Usage: node script.js --set-version '); process.exit(1); } const version_tag: string = args[1]; try { const result: string = await findVersion(version_tag); console.log(result); } catch (error: any) { console.error('Error:', error.message); process.exit(1); } } getLatestLabVersion(); ================================================ FILE: buildutils/src/release-bump.ts ================================================ /* ----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ /** * Inspired by: https://github.com/jupyterlab/jupyterlab/blob/master/buildutils/src/bumpversion.ts */ import * as utils from '@jupyterlab/buildutils'; import commander from 'commander'; import { getPythonVersion, postbump } from './utils'; // Specify the program signature. commander .description('Update the version') .option('--dry-run', 'Dry run') .option('--force', 'Force the upgrade') .option('--skip-commit', 'Whether to skip commit changes') .arguments('') .action((spec: any, opts: any) => { // Get the previous version. const prev = getPythonVersion(); const isFinal = /\d+\.\d+\.\d+$/.test(prev); // Whether to commit after bumping const commit = opts.skipCommit !== true; // for "next", determine whether to use "patch" or "build" if (spec === 'next') { spec = isFinal ? 'patch' : 'build'; } // For patch, defer to `patch:release` command if (spec === 'patch') { let cmd = 'jlpm run release:patch'; if (opts.force) { cmd += ' --force'; } if (!commit) { cmd += ' --skip-commit'; } utils.run(cmd); process.exit(0); } // Make sure we have a valid version spec. const options = ['major', 'minor', 'release', 'build']; if (options.indexOf(spec) === -1) { throw new Error(`Version spec must be one of: ${options}`); } if (isFinal && spec === 'build') { throw new Error('Cannot increment a build on a final release'); } // Run pre-bump script. utils.prebump(); // Handle dry runs. if (opts.dryRun) { return; } // If this is a major release during the alpha cycle, bump // just the Python version. if (prev.indexOf('a') !== -1 && spec === 'major') { // Bump the version. utils.run(`hatch version ${spec}`); // Run the post-bump script. postbump(commit); return; } // Determine the version spec to use for lerna. let lernaVersion = 'preminor'; if (spec === 'build') { lernaVersion = 'prerelease'; // a -> b } else if (spec === 'release' && prev.indexOf('a') !== -1) { lernaVersion = 'prerelease --preid=beta'; // b -> rc } else if (spec === 'release' && prev.indexOf('b') !== -1) { lernaVersion = 'prerelease --preid=rc'; // rc -> final } else if (spec === 'release' && prev.indexOf('rc') !== -1) { lernaVersion = 'patch'; } if (lernaVersion === 'preminor') { lernaVersion += ' --preid=alpha'; } let cmd = `jlpm run lerna version --force-publish --no-push --no-git-tag-version ${lernaVersion}`; if (opts.force) { cmd += ' --yes'; } // For a preminor release, we bump 10 minor versions so that we do // not conflict with versions during minor releases of the top // level package. if (lernaVersion === 'preminor') { for (let i = 0; i < 10; i++) { utils.run(cmd); } } else { utils.run(cmd); } // Bump the version. let pySpec = spec; if (spec === 'release') { if (prev.indexOf('a') !== -1) { pySpec = 'beta'; } else if (prev.indexOf('b') !== -1) { pySpec = 'rc'; } else if (prev.indexOf('rc') !== -1) { pySpec = 'release'; } else { pySpec = 'alpha'; } } else if (spec === 'build') { if (prev.indexOf('a') !== -1) { pySpec = 'a'; } else if (prev.indexOf('b') !== -1) { pySpec = 'b'; } else if (prev.indexOf('rc') !== -1) { pySpec = 'rc'; } } else if (spec === 'major' || spec === 'minor') { if (prev.indexOf('a') !== -1) { pySpec = `${spec},beta`; } else if (prev.indexOf('b') !== -1) { pySpec = `${spec},rc`; } else if (prev.indexOf('rc') !== -1) { pySpec = `${spec},release`; } else { pySpec = `${spec},alpha`; } } utils.run(`hatch version ${pySpec}`); // Run the post-bump script. postbump(commit); }); commander.parse(process.argv); ================================================ FILE: buildutils/src/release-patch.ts ================================================ /* ----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ /** * Inspired by: https://github.com/jupyterlab/jupyterlab/blob/master/buildutils/src/patch-release.ts */ import * as utils from '@jupyterlab/buildutils'; import commander from 'commander'; import { getPythonVersion, postbump } from './utils'; // Specify the program signature. commander .description('Create a patch release') .option('--force', 'Force the upgrade') .option('--skip-commit', 'Whether to skip commit changes') .action((options: any) => { // Make sure we can patch release. const pyVersion = getPythonVersion(); if ( pyVersion.includes('a') || pyVersion.includes('b') || pyVersion.includes('rc') ) { throw new Error('Can only make a patch release from a final version'); } // Run pre-bump actions. utils.prebump(); // Patch the python version utils.run('hatch version patch'); // Version the changed let cmd = 'jlpm run lerna version patch --no-push --force-publish --no-git-tag-version'; if (options.force) { cmd += ' --yes'; } utils.run(cmd); // Whether to commit after bumping const commit = options.skipCommit !== true; postbump(commit); }); commander.parse(process.argv); ================================================ FILE: buildutils/src/upgrade-lab-dependencies.ts ================================================ import fs from 'fs'; import path from 'path'; const PACKAGE_JSON_PATHS: string[] = [ 'app/package.json', 'buildutils/package.json', 'package.json', 'packages/application-extension/package.json', 'packages/application/package.json', 'packages/console-extension/package.json', 'packages/docmanager-extension/package.json', 'packages/documentsearch-extension/package.json', 'packages/help-extension/package.json', 'packages/lab-extension/package.json', 'packages/notebook-extension/package.json', 'packages/terminal-extension/package.json', 'packages/tree-extension/package.json', 'packages/tree/package.json', 'packages/ui-components/package.json', 'ui-tests/package.json', ]; const DEPENDENCY_GROUP = '@jupyterlab'; interface IVersion { major: number; minor: number; patch: number; preRelease?: string; } function parseVersion(version: string): IVersion { const match = version.match(/^(\d+)\.(\d+)\.(\d+)(?:(a|b|rc)(\d+))?$/); if (!match) { throw new Error(`Invalid version format: ${version}`); } const [, major, minor, patch, type, preVersion] = match; const baseVersion = { major: parseInt(major, 10), minor: parseInt(minor, 10), patch: parseInt(patch, 10), }; if (type && preVersion) { return { ...baseVersion, preRelease: `${type}${preVersion}`, }; } return baseVersion; } function getVersionRange(version: IVersion): string { const baseVersion = `${version.major}.${version.minor}.${version.patch}${ version.preRelease ?? '' }`; return `>=${baseVersion},<${version.major}.${version.minor + 1}`; } function updateVersionInFile( filePath: string, pattern: RegExp, version: IVersion ): void { const content = fs.readFileSync(filePath, 'utf-8'); const versionRange = getVersionRange(version); const updatedContent = content.replace(pattern, `$1${versionRange}`); fs.writeFileSync(filePath, updatedContent); } async function updatePackageJson(newVersion: string): Promise { const url = `https://raw.githubusercontent.com/jupyterlab/jupyterlab/v${newVersion}/jupyterlab/staging/package.json`; const response = await fetch(url); if (!response.ok) { const errorMessage = `Failed to fetch package.json from ${url}. HTTP status code: ${response.status}`; throw new Error(errorMessage); } // fetch the new galata version const galataUrl = `https://raw.githubusercontent.com/jupyterlab/jupyterlab/v${newVersion}/galata/package.json`; const galataResponse = await fetch(galataUrl); if (!galataResponse.ok) { const errorMessage = `Failed to fetch galata/package.json from ${galataUrl}. HTTP status code: ${galataResponse.status}`; throw new Error(errorMessage); } const newPackageJson = await response.json(); const galataPackageJson = await galataResponse.json(); for (const packageJsonPath of PACKAGE_JSON_PATHS) { const filePath: string = path.resolve(packageJsonPath); const existingPackageJson = JSON.parse(fs.readFileSync(filePath, 'utf-8')); const newDependencies = { ...newPackageJson.devDependencies, ...newPackageJson.resolutions, [galataPackageJson.name]: galataPackageJson.version, }; updateDependencyVersion(existingPackageJson, newDependencies); fs.writeFileSync( filePath, JSON.stringify(existingPackageJson, null, 2) + '\n' ); } } function updateDependencyVersion(existingJson: any, newJson: any): void { if (!existingJson) { return; } const sectionPaths: string[] = [ 'resolutions', 'dependencies', 'devDependencies', ]; for (const section of sectionPaths) { if (!existingJson[section]) { continue; } const updated = existingJson[section]; for (const [pkg, version] of Object.entries( existingJson[section] )) { if (pkg.startsWith(DEPENDENCY_GROUP) && pkg in newJson) { if (version[0] === '^' || version[0] === '~') { updated[pkg] = version[0] + absoluteVersion(newJson[pkg]); } else { updated[pkg] = absoluteVersion(newJson[pkg]); } } } } } function absoluteVersion(version: string): string { if (version.length > 0 && (version[0] === '^' || version[0] === '~')) { return version.substring(1); } return version; } const versionPattern = /(jupyterlab)(>=[\d.]+(?:[a|b|rc]\d+)?,<[\d.]+)/g; const FILES_TO_UPDATE = ['pyproject.toml', '.pre-commit-config.yaml']; async function upgradeLabDependencies(): Promise { const args: string[] = process.argv.slice(2); if (args.length < 2) { throw new Error('Please provide the set-version flag and version'); } const version = parseVersion(args[1]); await updatePackageJson(args[1]); // Keep original string version for package.json for (const file of FILES_TO_UPDATE) { updateVersionInFile(path.resolve(file), versionPattern, version); } } upgradeLabDependencies(); ================================================ FILE: buildutils/src/utils.ts ================================================ import { run } from '@jupyterlab/buildutils'; /** * Get the current version of notebook */ export function getPythonVersion(): string { const cmd = 'hatch version'; const lines = run(cmd, { stdio: 'pipe' }, true).split('\n'); return lines[lines.length - 1]; } export function postbump(commit = true): void { // run the integrity run('jlpm integrity'); const newPyVersion = getPythonVersion(); // Commit changes. if (commit) { run(`git commit -am "Release ${newPyVersion}"`); run(`git tag ${newPyVersion}`); } } ================================================ FILE: buildutils/tsconfig.json ================================================ { "extends": "../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src", "module": "commonjs" }, "include": ["src/*"], "references": [] } ================================================ FILE: docs/Makefile ================================================ # Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage spelling gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " applehelp to make an Apple Help Book" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " coverage to run coverage check of the documentation (if enabled)" @echo " spelling to spell check the documentation" clean: rm -rf $(BUILDDIR)/* rm -rf source/config.rst html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/JupyterNotebook.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/JupyterNotebook.qhc" applehelp: $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp @echo @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." @echo "N.B. You won't be able to view it unless you put it in" \ "~/Library/Documentation/Help or install it in your application" \ "bundle." devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/JupyterNotebook" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/JupyterNotebook" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." spelling: $(SPHINXBUILD) -b spelling $(ALLSPHINXOPTS) $(BUILDDIR)/spelling @echo "Spell check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/spelling/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." coverage: $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage @echo "Testing of coverage in the sources finished, look at the " \ "results in $(BUILDDIR)/coverage/python.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." ================================================ FILE: docs/jsdoc_config.json ================================================ { "markdown": { "parser": "gfm" }, "plugins": ["plugins/markdown", "jsdoc_plugin.js"], "source": { "include": ["../notebook/static/notebook/js/notebook.js"] }, "tags": { "allowUnknownTags": true }, "templates": { "cleverLinks": false, "monospaceLinks": false } } ================================================ FILE: docs/jsdoc_plugin.js ================================================ exports.handlers = { newDoclet: function (e) { // e.doclet will refer to the newly created doclet // you can read and modify properties of that doclet if you wish if (typeof e.doclet.name === 'string') { if (e.doclet.name[0] === '_') { console.log( 'Private method "' + e.doclet.longname + '" not documented.' ); e.doclet.memberof = ''; } } }, }; ================================================ FILE: docs/make.bat ================================================ @ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source set I18NSPHINXOPTS=%SPHINXOPTS% source if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled echo. coverage to run coverage check of the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) REM Check if sphinx-build is available and fallback to Python version if any %SPHINXBUILD% 2> nul if errorlevel 9009 goto sphinx_python goto sphinx_ok :sphinx_python set SPHINXBUILD=python -m sphinx.__init__ %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) :sphinx_ok if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\JupyterNotebook.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\JupyterNotebook.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "coverage" ( %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage if errorlevel 1 exit /b 1 echo. echo.Testing of coverage in the sources finished, look at the ^ results in %BUILDDIR%/coverage/python.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end ================================================ FILE: docs/resources/Info.plist.example ================================================ # Add this into the info.plist file of an application # and the icns icon in Contents/Resources # then move the application twice : # https://superuser.com/questions/178316/how-to-set-an-icon-for-a-file-type-on-mac CFBundleDocumentTypes CFBundleTypeExtensions ipynb CFBundleTypeIconFile ipynb_mac_icon CFBundleTypeName IPython notebook file CFBundleTypeRole None ================================================ FILE: docs/resources/generate_icons.sh ================================================ #!/bin/bash INKSCAPE=inkscape ${INKSCAPE} -z -C --file=ipynb_icon_16x16.svg --export-png=ipynb_icon_16x16_uncrush.png ${INKSCAPE} -z -C --file=ipynb_icon_24x24.svg --export-png=ipynb_icon_24x24_uncrush.png ${INKSCAPE} -z -C --file=ipynb_icon_32x32.svg --export-png=ipynb_icon_32x32_uncrush.png ${INKSCAPE} -z -C --file=ipynb_icon_512x512.svg --export-png=ipynb_icon_64x64_uncrush.png -w 64 -h 64 ${INKSCAPE} -z -C --file=ipynb_icon_512x512.svg --export-png=ipynb_icon_128x128_uncrush.png -w 128 -h 128 ${INKSCAPE} -z -C --file=ipynb_icon_512x512.svg --export-png=ipynb_icon_256x256_uncrush.png -w 256 -h 256 ${INKSCAPE} -z -C --file=ipynb_icon_512x512.svg --export-png=ipynb_icon_512x512_uncrush.png -w 512 -h 512 for file in `ls *_uncrush.png`; do pngcrush -brute -l 9 -reduce -rem alla -rem text -rem time -rem gAMA -rem cHRM -rem iCCP -rem sRGB $file `basename $file _uncrush.png`.png rm $file done ================================================ FILE: docs/source/_static/.gitkeep ================================================ ================================================ FILE: docs/source/conf.py ================================================ # Jupyter Notebook documentation build configuration file, created by # sphinx-quickstart on Mon Apr 13 09:51:11 2015. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import logging import os import shutil import sys logger = logging.getLogger(__name__) logging.basicConfig() # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # DEBUG for RTD logger.info("DEBUG:: sys.path") logger.info("================") for item in sys.path: logger.info(item) # add repo root to sys.path # here = root/docs/source here = os.path.abspath(os.path.dirname(__file__)) repo_root = os.path.dirname(os.path.dirname(here)) sys.path.insert(0, repo_root) # Copy the markdown file here shutil.copy(os.path.join(repo_root, "CHANGELOG.md"), os.path.join(here, "changelog.md")) # Copy the contributing file here shutil.copy(os.path.join(repo_root, "CONTRIBUTING.md"), os.path.join(here, "contributing.md")) logger.info("repo_root") logger.info("=====================") logger.info(repo_root) # DEBUG for post insert on RTD logger.info("DEBUG:: Post insert to sys.path") logger.info("===============================") for item in sys.path: logger.info(item) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "sphinx.ext.autodoc", "sphinx.ext.doctest", "sphinx.ext.intersphinx", "sphinx.ext.autosummary", "sphinx.ext.mathjax", "IPython.sphinxext.ipython_console_highlighting", "nbsphinx", "sphinxcontrib_github_alt", "myst_parser", ] try: import enchant # noqa: F401 extensions += ["sphinxcontrib.spelling"] except ImportError: pass myst_enable_extensions = ["html_image"] myst_update_mathjax = False # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # General information about the project. project = "Jupyter Notebook" copyright = "2015, Jupyter Team, https://jupyter.org" author = "The Jupyter Team" # ghissue config github_project_url = "https://github.com/jupyter/notebook" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # _version_py = os.path.join(here, "../../notebook/_version.py") version_ns = {} exec(compile(open(_version_py).read(), _version_py, "exec"), version_ns) # noqa: S102, SIM115 # The short X.Y version. version = "{}.{}".format(*version_ns["version_info"][:2]) # The full version, including alpha/beta/rc tags. release = version_ns["__version__"] # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = "en" # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = [ "examples/Notebook/.ipynb_checkpoints", "examples/Notebook/nbpackage/*.ipynb", "examples/Notebook/nbpackage/nbs/*.ipynb", ] # The reST default role (used for this markup: `text`) to use for all # documents. # default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = "sphinx" # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = "pydata_sphinx_theme" # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = { "header_links_before_dropdown": 5, "icon_links": [ { "name": "jupyter.org", "url": "https://jupyter.org", "icon": "_static/jupyter_logo.svg", "type": "local", }, { "name": "GitHub", "url": "https://github.com/jupyter/notebook", "icon": "fab fa-github-square", }, { "name": "Discourse", "url": "https://discourse.jupyter.org/c/notebook/31", "icon": "fab fa-discourse", }, { "name": "Zulip", "url": "https://jupyter.zulipchat.com/", "icon": "_static/zulip-icon-square.svg", "type": "local", }, ], "logo": { "alt_text": "Jupyter", "image_light": "_static/logo-rectangle.svg", "image_dark": "_static/logo-rectangle-dark.svg", }, "use_edit_page_button": True, "navigation_with_keys": False, } # Output for github to be used in links html_context = { "github_user": "jupyter", # Username "github_repo": "notebook", # Repo name "github_version": "main", # Version "doc_path": "docs/source/", # Path in the checkout to the docs root } # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. html_logo = "examples/images/jupyter_logo.png" # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". # NOTE: Sphinx's 'make html' builder will throw a warning about an unfound # _static directory. Do not remove or comment out html_static_path # since it is needed to properly generate _static in the build directory html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr' # html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # Now only 'ja' uses this config value # html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = "JupyterNotebookdoc" # This will ensure that we use the correctly set environment for canonical URLs # Old Read the Docs injections makes it point only to the default version, # for instance /en/stable/ html_baseurl = os.environ.get("READTHEDOCS_CANONICAL_URL", "/") # -- Options for LaTeX output --------------------------------------------- latex_elements = {} # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ ( master_doc, "JupyterNotebook.tex", "Jupyter Notebook Documentation", "https://jupyter.org", "manual", ), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [(master_doc, "jupyternotebook", "Jupyter Notebook Documentation", [author], 1)] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for link checks ---------------------------------------------- linkcheck_ignore = [r"http://127\.0\.0\.1/*"] # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( master_doc, "JupyterNotebook", "Jupyter Notebook Documentation", author, "JupyterNotebook", "One line description of project.", "Miscellaneous", ), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False intersphinx_mapping = { "ipython": ("https://ipython.readthedocs.io/en/stable/", None), "nbconvert": ("https://nbconvert.readthedocs.io/en/latest/", None), "nbformat": ("https://nbformat.readthedocs.io/en/latest/", None), "jupyter": ("https://jupyter.readthedocs.io/en/latest/", None), } spelling_lang = "en_US" spelling_word_list_filename = "spelling_wordlist.txt" def setup(app): app.add_css_file("https://docs.jupyter.org/en/latest/_static/jupyter.css") ================================================ FILE: docs/source/configuration.md ================================================ # Configuration ```{toctree} :caption: Configuration :maxdepth: 1 configuring/config_overview Security extending/index.rst ``` ================================================ FILE: docs/source/configuring/config_overview.md ================================================ (configuration-overview)= # Configuration Overview Beyond the default configuration settings, you can configure a rich array of options to suit your workflow. Here are areas that are commonly configured when using Jupyter Notebook: > - {ref}`Jupyter's common configuration system ` > - {ref}`Jupyter Server ` > - {ref}`Notebook extensions ` Let's look at highlights of each area. (configure-common)= ## Jupyter's Common Configuration system Jupyter applications, from the Notebook to JupyterHub to nbgrader, share a common configuration system. The process for creating a configuration file and editing settings is similar for all the Jupyter applications. > - [Jupyter’s Common Configuration Approach](https://jupyter.readthedocs.io/en/latest/use/config.html) > - [Common Directories and File Locations](https://jupyter.readthedocs.io/en/latest/use/jupyter-directories.html) > - [Language kernels](https://jupyter.readthedocs.io/en/latest/projects/kernels.html) > - [traitlets](https://traitlets.readthedocs.io/en/latest/config.html#module-traitlets.config) > provide a low-level architecture for configuration. ### Disabling Custom CSS Custom CSS is loaded by default as was done with Jupyter Notebook 6. In the jupyter configuration directory, the `/.jupyter/custom/custom.css` file will be loaded unless the the application is initialized with the `custom_css` flag with the argument set to `False` as in `--JupyterNotebookApp.custom_css=False`. (configure-jupyter-server)= ## Jupyter server The Jupyter Server runs the language kernel and communicates with the front-end Notebook client (i.e. the familiar notebook interface). > - Configuring the Jupyter Server > > > To create a `jupyter_server_config.py` file in the `.jupyter` > > directory, with all the defaults commented out, use the following > > command: > > > > ``` > > $ jupyter server --generate-config > > ``` > > - [Running a Jupyter Server](https://jupyter-server.readthedocs.io/en/stable/operators/public-server.html) > > - Related: [Configuring a language kernel](https://ipython.readthedocs.io/en/latest/install/kernel_install.html) > to run in the Jupyter Server enables your server to run other languages, like R or Julia. ```{warning} Jupyter Notebook 7 is now based on Jupyter Server. This may break some previous `notebook` imports you may have been using, such as `notebook.auth` or `notebook.notebookapp`. Check out the [migration guide](../migrating/server-imports.md) to learn more on how to update these server imports. ``` (configure-nbextensions)= ## Notebook extensions The Notebook frontend can be extending with JupyterLab extensions. See the {ref}`Frontend Extension Guide ` for more information. [Security in Jupyter notebooks:](https://jupyter-server.readthedocs.io/en/stable/operators/security.html) Since security policies vary from organization to organization, we encourage you to consult with your security team on settings that would be best for your use cases. Our documentation offers some responsible security practices, and we recommend becoming familiar with the practices. ================================================ FILE: docs/source/configuring/interface_customization.md ================================================ # Interface Customization Multiple elements in the Notebook interface can be customized via the Settings Editor. ## Layout By default some widgets are displayed in pre-defined parts of the user interface, which are often called "areas" or "regions". For example the table of contents will be displayed in the `left` area by default, while the debugger will be displayed in the `right` area. However the positioning of some of these components can also be customized via the Settings Editor. Below are a few examples of how to do this. ### Open the Markdown Preview on the left It is often useful to be able to see a rendered preview of a Markdown document while editing it. By default the Markdown Preview opens on the right side of the application. However it is also possible to open it on the left side by changing the Notebook Shell settings in the Advanced Settings Editor: ```json { "layout": { "Markdown Preview": { "area": "left" } } } ``` ![a screenshot showing the markdown preview in Notebook 7](https://github.com/jupyter/notebook/assets/591645/3faf0823-ec6f-4d5f-a66f-d6f53dc383de) ### Configuring a third-party widget Third-party extensions can also add widgets to the application shell. This is for example the case with the [Voila extension](https://github.com/voila-dashboards/voila), which adds a preview widget to visualize a notebook as a dashboard. By default in JupyterLab the Voila Preview is added to the `main` area next to the corresponding notebook. With Notebook 7 it is possible to move the Voila Preview to the `right` area by changing the Notebook Shell setting in the Advanced Settings Editor as follows: ```json { "layout": { "Voila Preview": { "area": "right" } } } ``` ![a screenshot showing the voila preview in Notebook 7](https://github.com/jupyter/notebook/assets/591645/524ade3b-05de-4d3b-8ff9-089f2d38ac77) ```{note} Refer to the [JupyterLab Layout Documentation](https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html#layout) to learn more about the default positioning of other UI elements. ``` ## Toolbars, Menu bar and Context Menu It is also possible to customize toolbars, menus and context menu entries via the Settings Editor. For example the items of the notebook toolbar can be reordered, or some menu entries can be hidden. ```{note} Refer to the [JupyterLab Documentation](https://jupyterlab.readthedocs.io/en/latest/user/interface_customization.html) to learn more about general interface customization via the settings editor. ``` ================================================ FILE: docs/source/configuring/plugins.md ================================================ # Managing plugins Notebook 7 uses the same extension system as JupyterLab. An extension can provide multiple plugins. ```{note} See the [JupyterLab documentation](https://jupyterlab.readthedocs.io/en/latest/user/extensions.html) to learn more about the extension system. ``` ## Examples ### Disabling the download button By default Notebook 7 provides a way to download files from the file browser. This functionality consists of a context menu entry and a main menu entry. They are provided by an application plugin that can be disabled. To disable the download entry of file browser context menus, open a terminal and run the following command: ```text jupyter labextension disable @jupyterlab/filebrowser-extension:download ``` Then restart the application and refresh the page. ================================================ FILE: docs/source/contributor.md ================================================ # Contributing ```{toctree} :caption: Contributor Documentation :maxdepth: 1 contributing development_faq ``` ================================================ FILE: docs/source/custom_css.md ================================================ # Applying Custom CSS To apply custom CSS, you can add a `/custom/custom.css` file in the jupyter `config` directory. You can find the path, `~/.jupyter`, to this directory by running `jupyter --paths`. There you can create a folder named `custom` and create a `custom.css` file within the folder. ## Jupyter Styling You can use a custom CSS file to modify default Jupyter styling. ```css /* Modify Jupyter Styles */ #top-panel-wrapper, #jp-top-bar { background-color: #aecad4 !important; } #menu-panel-wrapper, #jp-MainMenu, #menu-panel { background-color: #aecad4 !important; } .jp-NotebookPanel-toolbar { background-color: #aecad4 !important; } .lm-MenuBar-content { color: #02484d; } ``` ![a screenshot custom jupyter styling](https://user-images.githubusercontent.com/12378147/245519958-17ce04e7-edc2-434e-8d93-a5c2de9fb225.png) ## Markdown Another potential application for custom CSS is styling markdown. ```css /* Headings */ h1, h2 { font-family: Impact, Charcoal, sans-serif; font-weight: bold; text-shadow: 2px 2px 4px #000000; } h1 { font-size: 52px; margin-bottom: 40px; color: #10929e; text-decoration: underline; } h2 { font-size: 448px; margin-bottom: 32px; color: #76b4be; text-transform: uppercase; } /* Block Quotes */ blockquote { font-family: Georgia, serif; font-size: 16px; color: #19085c; border-left: 8px solid #effffc; background-color: #eafcff; padding: 20px; } /* Lists */ ul, ol { font-family: Verdana, Geneva, sans-serif; font-size: 18px; color: #333333; margin-bottom: 24px; } ``` ![a screenshot of custom markdown styling](https://user-images.githubusercontent.com/12378147/245520291-968848d3-d336-4523-a046-023b15082ff8.png) ================================================ FILE: docs/source/development_faq.md ================================================ (development-faq)= # Developer FAQ 1. How do I install a prerelease version such as a beta or release candidate? You can install a prerelease version of the notebook using the `--pre` flag with `pip`: ```bash python -m pip install notebook --pre --upgrade ``` If you are using `conda` or `mamba`, you can install a prerelease version of the notebook using the alpha or beta label. For example, to install the latest alpha release, you can run: ```bash conda install -c conda-forge -c conda-forge/label/notebook_alpha notebook=7.0.0a18 ``` ================================================ FILE: docs/source/examples/Notebook/Connecting with the Qt Console.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Connecting to an existing IPython kernel using the Qt Console" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Frontend/Kernel Model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The traditional IPython (`ipython`) consists of a single process that combines a terminal based UI with the process that runs the users code.\n", "\n", "While this traditional application still exists, the modern Jupyter consists of two processes:\n", "\n", "* Kernel: this is the process that runs the users code.\n", "* Frontend: this is the process that provides the user interface where the user types code and sees results.\n", "\n", "Jupyter currently has 3 frontends:\n", "\n", "* Terminal Console (`jupyter console`)\n", "* Qt Console (`jupyter qtconsole`)\n", "* Notebook (`jupyter notebook`)\n", "\n", "The Kernel and Frontend communicate over a ZeroMQ/JSON based messaging protocol, which allows multiple Frontends (even of different types) to communicate with a single Kernel. This opens the door for all sorts of interesting things, such as connecting a Console or Qt Console to a Notebook's Kernel. For example, you may want to connect a Qt console to your Notebook's Kernel and use it as a help\n", "browser, calling `??` on objects in the Qt console (whose pager is more flexible than the\n", "one in the notebook). \n", "\n", "This Notebook describes how you would connect another Frontend to an IPython Kernel that is associated with a Notebook.\n", "The commands currently given here are specific to the IPython kernel." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Manual connection" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To connect another Frontend to a Kernel manually, you first need to find out the connection information for the Kernel using the `%connect_info` magic:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%connect_info" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see that this magic displays everything you need to connect to this Notebook's Kernel." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Automatic connection using a new Qt Console" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can also start a new Qt Console connected to your current Kernel by using the `%qtconsole` magic. This will detect the necessary connection\n", "information and start the Qt Console for you automatically." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = 10" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%qtconsole" ] } ], "metadata": { "nbsphinx": { "execute": "never" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: docs/source/examples/Notebook/Custom Keyboard Shortcuts.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Keyboard Shortcut Customization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can customize the `command` mode shortcuts from within the Notebook Application itself. \n", "\n", "Head to the **Settings** menu and select the **Settings Editor** item.\n", "A dialog will guide you through the process of adding custom keyboard shortcuts.\n", "\n", "Keyboard shortcut set from within the Notebook Application will be persisted to your configuration file. \n", "A single action may have several shortcuts attached to it." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" }, "nbsphinx": { "execute": "never" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: docs/source/examples/Notebook/Importing Notebooks.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Importing Jupyter Notebooks as Modules" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is a common problem that people want to import code from Jupyter Notebooks.\n", "This is made difficult by the fact that Notebooks are not plain Python files,\n", "and thus cannot be imported by the regular Python machinery.\n", "\n", "Fortunately, Python provides some fairly sophisticated [hooks](https://www.python.org/dev/peps/pep-0302/) into the import machinery,\n", "so we can actually make Jupyter notebooks importable without much difficulty,\n", "and only using public APIs." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import io, os, sys, types" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from IPython import get_ipython\n", "from nbformat import read\n", "from IPython.core.interactiveshell import InteractiveShell" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import hooks typically take the form of two objects:\n", "\n", "1. a Module **Loader**, which takes a module name (e.g. `'IPython.display'`), and returns a Module\n", "2. a Module **Finder**, which figures out whether a module might exist, and tells Python what **Loader** to use" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def find_notebook(fullname, path=None):\n", " \"\"\"find a notebook, given its fully qualified name and an optional path\n", "\n", " This turns \"foo.bar\" into \"foo/bar.ipynb\"\n", " and tries turning \"Foo_Bar\" into \"Foo Bar\" if Foo_Bar\n", " does not exist.\n", " \"\"\"\n", " name = fullname.rsplit('.', 1)[-1]\n", " if not path:\n", " path = ['']\n", " for d in path:\n", " nb_path = os.path.join(d, name + \".ipynb\")\n", " if os.path.isfile(nb_path):\n", " return nb_path\n", " # let import Notebook_Name find \"Notebook Name.ipynb\"\n", " nb_path = nb_path.replace(\"_\", \" \")\n", " if os.path.isfile(nb_path):\n", " return nb_path" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Notebook Loader" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we have our Notebook Loader.\n", "It's actually quite simple - once we figure out the filename of the module,\n", "all it does is:\n", "\n", "1. load the notebook document into memory\n", "2. create an empty Module\n", "3. execute every cell in the Module namespace\n", "\n", "Since IPython cells can have extended syntax,\n", "the IPython transform is applied to turn each of these cells into their pure-Python counterparts before executing them.\n", "If all of your notebook cells are pure-Python,\n", "this step is unnecessary." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class NotebookLoader(object):\n", " \"\"\"Module Loader for Jupyter Notebooks\"\"\"\n", "\n", " def __init__(self, path=None):\n", " self.shell = InteractiveShell.instance()\n", " self.path = path\n", "\n", " def load_module(self, fullname):\n", " \"\"\"import a notebook as a module\"\"\"\n", " path = find_notebook(fullname, self.path)\n", "\n", " print(\"importing Jupyter notebook from %s\" % path)\n", "\n", " # load the notebook object\n", " with io.open(path, 'r', encoding='utf-8') as f:\n", " nb = read(f, 4)\n", "\n", " # create the module and add it to sys.modules\n", " # if name in sys.modules:\n", " # return sys.modules[name]\n", " mod = types.ModuleType(fullname)\n", " mod.__file__ = path\n", " mod.__loader__ = self\n", " mod.__dict__['get_ipython'] = get_ipython\n", " sys.modules[fullname] = mod\n", "\n", " # extra work to ensure that magics that would affect the user_ns\n", " # actually affect the notebook module's ns\n", " save_user_ns = self.shell.user_ns\n", " self.shell.user_ns = mod.__dict__\n", "\n", " try:\n", " for cell in nb.cells:\n", " if cell.cell_type == 'code':\n", " # transform the input to executable Python\n", " code = self.shell.input_transformer_manager.transform_cell(cell.source)\n", " # run the code in themodule\n", " exec(code, mod.__dict__)\n", " finally:\n", " self.shell.user_ns = save_user_ns\n", " return mod" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Module Finder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The finder is a simple object that tells you whether a name can be imported,\n", "and returns the appropriate loader.\n", "All this one does is check, when you do:\n", "\n", "```python\n", "import mynotebook\n", "```\n", "\n", "it checks whether `mynotebook.ipynb` exists.\n", "If a notebook is found, then it returns a NotebookLoader.\n", "\n", "Any extra logic is just for resolving paths within packages." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class NotebookFinder(object):\n", " \"\"\"Module finder that locates Jupyter Notebooks\"\"\"\n", "\n", " def __init__(self):\n", " self.loaders = {}\n", "\n", " def find_module(self, fullname, path=None):\n", " nb_path = find_notebook(fullname, path)\n", " if not nb_path:\n", " return\n", "\n", " key = path\n", " if path:\n", " # lists aren't hashable\n", " key = os.path.sep.join(path)\n", "\n", " if key not in self.loaders:\n", " self.loaders[key] = NotebookLoader(path)\n", " return self.loaders[key]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Register the hook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we register the `NotebookFinder` with `sys.meta_path`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "sys.meta_path.append(NotebookFinder())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "After this point, my notebooks should be importable.\n", "\n", "Let's look at what we have in the CWD:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ls nbpackage" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So I should be able to `import nbpackage.mynotebook`." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import nbpackage.mynotebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Aside: displaying notebooks" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is some simple code to display the contents of a notebook\n", "with syntax highlighting, etc." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from pygments import highlight\n", "from pygments.lexers import PythonLexer\n", "from pygments.formatters import HtmlFormatter\n", "\n", "from IPython.display import display, HTML\n", "\n", "formatter = HtmlFormatter()\n", "lexer = PythonLexer()\n", "\n", "# publish the CSS for pygments highlighting\n", "display(\n", " HTML(\n", " \"\"\"\n", "\n", "\"\"\"\n", " % formatter.get_style_defs()\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def show_notebook(fname):\n", " \"\"\"display a short summary of the cells of a notebook\"\"\"\n", " with io.open(fname, 'r', encoding='utf-8') as f:\n", " nb = read(f, 4)\n", " html = []\n", " for cell in nb.cells:\n", " html.append(\"

%s cell

\" % cell.cell_type)\n", " if cell.cell_type == 'code':\n", " html.append(highlight(cell.source, lexer, formatter))\n", " else:\n", " html.append(\"
%s
\" % cell.source)\n", " display(HTML('\\n'.join(html)))\n", "\n", "\n", "show_notebook(os.path.join(\"nbpackage\", \"mynotebook.ipynb\"))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So my notebook has some code cells,\n", "one of which contains some IPython syntax.\n", "\n", "Let's see what happens when we import it" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from nbpackage import mynotebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hooray, it imported! Does it work?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mynotebook.foo()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Hooray again!\n", "\n", "Even the function that contains IPython syntax works:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mynotebook.has_ip_syntax()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Notebooks in packages" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We also have a notebook inside the `nb` package,\n", "so let's make sure that works as well." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "ls nbpackage/nbs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that the `__init__.py` is necessary for `nb` to be considered a package,\n", "just like usual." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "show_notebook(os.path.join(\"nbpackage\", \"nbs\", \"other.ipynb\"))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from nbpackage.nbs import other\n", "\n", "other.bar(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So now we have importable notebooks, from both the local directory and inside packages.\n", "\n", "I can even put a notebook inside IPython, to further demonstrate that this is working properly:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import shutil\n", "from IPython.paths import get_ipython_package_dir\n", "\n", "utils = os.path.join(get_ipython_package_dir(), 'utils')\n", "shutil.copy(\n", " os.path.join(\"nbpackage\", \"mynotebook.ipynb\"), os.path.join(utils, \"inside_ipython.ipynb\")\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "and import the notebook from `IPython.utils`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from IPython.utils import inside_ipython\n", "\n", "inside_ipython.whatsmyname()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This approach can even import functions and classes that are defined in a notebook using the `%%cython` magic." ] } ], "metadata": { "gist_id": "6011986", "nbsphinx": { "execute": "never" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1+" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: docs/source/examples/Notebook/Notebook Basics.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Notebook Basics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Notebook dashboard" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When you first start the notebook server, your browser will open to the notebook dashboard. The dashboard serves as a home page for the notebook. Its main purpose is to display the notebooks and files in the current directory. For example, here is a screenshot of the dashboard page for the `examples` directory in the Jupyter repository:\n", "\n", "![Jupyter dashboard showing files tab](images/dashboard_files_tab.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The top of the notebook list displays clickable breadcrumbs of the current directory. By clicking on these breadcrumbs or on sub-directories in the notebook list, you can navigate your file system.\n", "\n", "To create a new notebook, click on the \"New\" button at the top of the list and select a kernel from the dropdown (as seen below). Which kernels are listed depend on what's installed on the server. Some of the kernels in the screenshot below may not exist as an option to you.\n", "\n", "![Jupyter \"New\" menu](images/dashboard_files_tab_new.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notebooks and files can be uploaded to the current directory by dragging a notebook file onto the notebook list or by the \"click here\" text above the list.\n", "\n", "The notebook list shows green \"Running\" text and a green notebook icon next to running notebooks (as seen below). Notebooks remain running until you explicitly shut them down; closing the notebook's page is not sufficient.\n", "\n", "\n", "![Jupyter dashboard showing one notebook with a running kernel](images/dashboard_files_tab_run.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To shutdown, delete, duplicate, or rename a notebook check the checkbox next to it and an array of controls will appear at the top of the notebook list (as seen below). You can also use the same operations on directories and files when applicable.\n", "\n", "![Buttons: Duplicate, rename, shutdown, delete, new, refresh](images/dashboard_files_tab_btns.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To see all of your running notebooks along with their directories, click on the \"Running\" tab:\n", "\n", "![Jupyter dashboard running tab](images/dashboard_running_tab.png)\n", "\n", "This view provides a convenient way to track notebooks that you start as you navigate the file system in a long running notebook server." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Overview of the Notebook UI" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you create a new notebook or open an existing one, you will be taken to the notebook user interface (UI). This UI allows you to run code and author notebook documents interactively. The notebook UI has the following main areas:\n", "\n", "* Menu\n", "* Toolbar\n", "* Notebook area and cells\n", "\n", "The notebook has an interactive tour of these elements that can be started in the \"Help:User Interface Tour\" menu item." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Modal editor" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Starting with IPython 2.0, the Jupyter Notebook has a modal user interface. This means that the keyboard does different things depending on which mode the Notebook is in. There are two modes: edit mode and command mode." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Edit mode" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Edit mode is indicated by a green cell border and a prompt showing in the editor area:\n", "\n", "![Jupyter cell with green border](images/edit_mode.png)\n", "\n", "When a cell is in edit mode, you can type into the cell, like a normal text editor." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Enter edit mode by pressing `Enter` or using the mouse to click on a cell's editor area.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Command mode" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Command mode is indicated by a grey cell border with a blue left margin:\n", "\n", "![Jupyter cell with blue & grey border](images/command_mode.png)\n", "\n", "When you are in command mode, you are able to edit the notebook as a whole, but not type into individual cells. Most importantly, in command mode, the keyboard is mapped to a set of shortcuts that let you perform notebook and cell actions efficiently. For example, if you are in command mode and you press `c`, you will copy the current cell - no modifier is needed." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Don't try to type into a cell in command mode; unexpected things will happen!\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Enter command mode by pressing `Esc` or using the mouse to click *outside* a cell's editor area.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Mouse navigation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All navigation and actions in the Notebook are available using the mouse through the menubar and toolbar, which are both above the main Notebook area:\n", "\n", "![Jupyter notebook menus and toolbar](images/menubar_toolbar.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first idea of mouse based navigation is that **cells can be selected by clicking on them.** The currently selected cell gets a grey or green border depending on whether the notebook is in edit or command mode. If you click inside a cell's editor area, you will enter edit mode. If you click on the prompt or output area of a cell you will enter command mode.\n", "\n", "If you are running this notebook in a live session (not on https://nbviewer.jupyter.org) try selecting different cells and going between edit and command mode. Try typing into a cell." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The second idea of mouse based navigation is that **cell actions usually apply to the currently selected cell**. Thus if you want to run the code in a cell, you would select it and click the button in the toolbar or the \"Cell:Run\" menu item. Similarly, to copy a cell you would select it and click the button in the toolbar or the \"Edit:Copy\" menu item. With this simple pattern, you should be able to do most everything you need with the mouse.\n", "\n", "Markdown cells have one other state that can be modified with the mouse. These cells can either be rendered or unrendered. When they are rendered, you will see a nice formatted representation of the cell's contents. When they are unrendered, you will see the raw text source of the cell. To render the selected cell with the mouse, click the button in the toolbar or the \"Cell:Run\" menu item. To unrender the selected cell, double click on the cell." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Keyboard Navigation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The modal user interface of the Jupyter Notebook has been optimized for efficient keyboard usage. This is made possible by having two different sets of keyboard shortcuts: one set that is active in edit mode and another in command mode.\n", "\n", "The most important keyboard shortcuts are `Enter`, which enters edit mode, and `Esc`, which enters command mode.\n", "\n", "In edit mode, most of the keyboard is dedicated to typing into the cell's editor. Thus, in edit mode there are relatively few shortcuts. In command mode, the entire keyboard is available for shortcuts, so there are many more. The `Help`->`Keyboard Shortcuts` dialog lists the available shortcuts." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We recommend learning the command mode shortcuts in the following rough order:\n", "\n", "1. Basic navigation: `enter`, `shift-enter`, `up/k`, `down/j`\n", "2. Saving the notebook: `s`\n", "2. Change Cell types: `y`, `m`, `1-6`, `t`\n", "3. Cell creation: `a`, `b`\n", "4. Cell editing: `x`, `c`, `v`, `d`, `z`\n", "5. Kernel operations: `i`, `0` (press twice)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: docs/source/examples/Notebook/Running Code.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Running Code" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First and foremost, the Jupyter Notebook is an interactive environment for writing and running code. The notebook is capable of running code in a wide range of languages. However, each notebook is associated with a single kernel. This notebook is associated with the IPython kernel, therefore runs Python code." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Code cells allow you to enter and run code" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run a code cell using `Shift-Enter` or pressing the button in the toolbar above:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "a = 10" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n" ] } ], "source": [ "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are two other keyboard shortcuts for running code:\n", "\n", "* `Alt-Enter` runs the current cell and inserts a new one below.\n", "* `Ctrl-Enter` run the current cell and enters command mode." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Managing the Kernel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Code is run in a separate process called the Kernel. The Kernel can be interrupted or restarted. Try running the following cell and then hit the button in the toolbar above." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "import time\n", "\n", "time.sleep(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If the Kernel dies you will be prompted to restart it. Here we call the low-level system libc.time routine with the wrong argument via\n", "ctypes to segfault the Python interpreter:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "import sys\n", "\n", "# This will crash a Linux or Mac system\n", "# equivalent calls can be made on Windows\n", "\n", "# Uncomment these lines if you would like to see the segfault\n", "\n", "# dll = 'dylib' if sys.platform == 'darwin' else 'so.6'\n", "# libc = CDLL(\"libc.%s\" % dll)\n", "# libc.time(-1) # BOOM!!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cell menu" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The \"Cell\" menu has a number of menu items for running code in different ways. These includes:\n", "\n", "* Run and Select Below\n", "* Run and Insert Below\n", "* Run All\n", "* Run All Above\n", "* Run All Below" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Restarting the kernels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The kernel maintains the state of a notebook's computations. You can reset this state by restarting the kernel. This is done by clicking on the in the toolbar above." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## sys.stdout and sys.stderr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The stdout and stderr streams are displayed as text in the output area." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hi, stdout\n" ] } ], "source": [ "print(\"hi, stdout\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "hi, stderr\n" ] } ], "source": [ "print(\"hi, stderr\", file=sys.stderr)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Output is asynchronous" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "All output is displayed asynchronously as it is generated in the Kernel. If you execute the next cell, you will see the output one piece at a time, not all at the end." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n" ] } ], "source": [ "import sys\n", "import time\n", "\n", "for i in range(8):\n", " print(i)\n", " time.sleep(0.5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Large outputs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To better handle large outputs, the output area can be collapsed. Run the following cell and then single- or double- click on the active area to the left of the output:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n", "10\n", "11\n", "12\n", "13\n", "14\n", "15\n", "16\n", "17\n", "18\n", "19\n", "20\n", "21\n", "22\n", "23\n", "24\n", "25\n", "26\n", "27\n", "28\n", "29\n", "30\n", "31\n", "32\n", "33\n", "34\n", "35\n", "36\n", "37\n", "38\n", "39\n", "40\n", "41\n", "42\n", "43\n", "44\n", "45\n", "46\n", "47\n", "48\n", "49\n" ] } ], "source": [ "for i in range(50):\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Beyond a certain point, output will scroll automatically:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false, "jupyter": { "outputs_hidden": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "3\n", "7\n", "15\n", "31\n", "63\n", "127\n", "255\n", "511\n", "1023\n", "2047\n", "4095\n", "8191\n", "16383\n", "32767\n", "65535\n", "131071\n", "262143\n", "524287\n", "1048575\n", "2097151\n", "4194303\n", "8388607\n", "16777215\n", "33554431\n", "67108863\n", "134217727\n", "268435455\n", "536870911\n", "1073741823\n", "2147483647\n", "4294967295\n", "8589934591\n", "17179869183\n", "34359738367\n", "68719476735\n", "137438953471\n", "274877906943\n", "549755813887\n", "1099511627775\n", "2199023255551\n", "4398046511103\n", "8796093022207\n", "17592186044415\n", "35184372088831\n", "70368744177663\n", "140737488355327\n", "281474976710655\n", "562949953421311\n", "1125899906842623\n", "2251799813685247\n", "4503599627370495\n", "9007199254740991\n", "18014398509481983\n", "36028797018963967\n", "72057594037927935\n", "144115188075855871\n", "288230376151711743\n", "576460752303423487\n", "1152921504606846975\n", "2305843009213693951\n", "4611686018427387903\n", "9223372036854775807\n", "18446744073709551615\n", "36893488147419103231\n", "73786976294838206463\n", "147573952589676412927\n", "295147905179352825855\n", "590295810358705651711\n", "1180591620717411303423\n", "2361183241434822606847\n", "4722366482869645213695\n", "9444732965739290427391\n", "18889465931478580854783\n", "37778931862957161709567\n", "75557863725914323419135\n", "151115727451828646838271\n", "302231454903657293676543\n", "604462909807314587353087\n", "1208925819614629174706175\n", "2417851639229258349412351\n", "4835703278458516698824703\n", "9671406556917033397649407\n", "19342813113834066795298815\n", "38685626227668133590597631\n", "77371252455336267181195263\n", "154742504910672534362390527\n", "309485009821345068724781055\n", "618970019642690137449562111\n", "1237940039285380274899124223\n", "2475880078570760549798248447\n", "4951760157141521099596496895\n", "9903520314283042199192993791\n", "19807040628566084398385987583\n", "39614081257132168796771975167\n", "79228162514264337593543950335\n", "158456325028528675187087900671\n", "316912650057057350374175801343\n", "633825300114114700748351602687\n", "1267650600228229401496703205375\n", "2535301200456458802993406410751\n", "5070602400912917605986812821503\n", "10141204801825835211973625643007\n", "20282409603651670423947251286015\n", "40564819207303340847894502572031\n", "81129638414606681695789005144063\n", "162259276829213363391578010288127\n", "324518553658426726783156020576255\n", "649037107316853453566312041152511\n", "1298074214633706907132624082305023\n", "2596148429267413814265248164610047\n", "5192296858534827628530496329220095\n", "10384593717069655257060992658440191\n", "20769187434139310514121985316880383\n", "41538374868278621028243970633760767\n", "83076749736557242056487941267521535\n", "166153499473114484112975882535043071\n", "332306998946228968225951765070086143\n", "664613997892457936451903530140172287\n", "1329227995784915872903807060280344575\n", "2658455991569831745807614120560689151\n", "5316911983139663491615228241121378303\n", "10633823966279326983230456482242756607\n", "21267647932558653966460912964485513215\n", "42535295865117307932921825928971026431\n", "85070591730234615865843651857942052863\n", "170141183460469231731687303715884105727\n", "340282366920938463463374607431768211455\n", "680564733841876926926749214863536422911\n", "1361129467683753853853498429727072845823\n", "2722258935367507707706996859454145691647\n", "5444517870735015415413993718908291383295\n", "10889035741470030830827987437816582766591\n", "21778071482940061661655974875633165533183\n", "43556142965880123323311949751266331066367\n", "87112285931760246646623899502532662132735\n", "174224571863520493293247799005065324265471\n", "348449143727040986586495598010130648530943\n", "696898287454081973172991196020261297061887\n", "1393796574908163946345982392040522594123775\n", "2787593149816327892691964784081045188247551\n", "5575186299632655785383929568162090376495103\n", "11150372599265311570767859136324180752990207\n", "22300745198530623141535718272648361505980415\n", "44601490397061246283071436545296723011960831\n", "89202980794122492566142873090593446023921663\n", "178405961588244985132285746181186892047843327\n", "356811923176489970264571492362373784095686655\n", "713623846352979940529142984724747568191373311\n", "1427247692705959881058285969449495136382746623\n", "2854495385411919762116571938898990272765493247\n", "5708990770823839524233143877797980545530986495\n", "11417981541647679048466287755595961091061972991\n", "22835963083295358096932575511191922182123945983\n", "45671926166590716193865151022383844364247891967\n", "91343852333181432387730302044767688728495783935\n", "182687704666362864775460604089535377456991567871\n", "365375409332725729550921208179070754913983135743\n", "730750818665451459101842416358141509827966271487\n", "1461501637330902918203684832716283019655932542975\n", "2923003274661805836407369665432566039311865085951\n", "5846006549323611672814739330865132078623730171903\n", "11692013098647223345629478661730264157247460343807\n", "23384026197294446691258957323460528314494920687615\n", "46768052394588893382517914646921056628989841375231\n", "93536104789177786765035829293842113257979682750463\n", "187072209578355573530071658587684226515959365500927\n", "374144419156711147060143317175368453031918731001855\n", "748288838313422294120286634350736906063837462003711\n", "1496577676626844588240573268701473812127674924007423\n", "2993155353253689176481146537402947624255349848014847\n", "5986310706507378352962293074805895248510699696029695\n", "11972621413014756705924586149611790497021399392059391\n", "23945242826029513411849172299223580994042798784118783\n", "47890485652059026823698344598447161988085597568237567\n", "95780971304118053647396689196894323976171195136475135\n", "191561942608236107294793378393788647952342390272950271\n", "383123885216472214589586756787577295904684780545900543\n", "766247770432944429179173513575154591809369561091801087\n", "1532495540865888858358347027150309183618739122183602175\n", "3064991081731777716716694054300618367237478244367204351\n", "6129982163463555433433388108601236734474956488734408703\n", "12259964326927110866866776217202473468949912977468817407\n", "24519928653854221733733552434404946937899825954937634815\n", "49039857307708443467467104868809893875799651909875269631\n", "98079714615416886934934209737619787751599303819750539263\n", "196159429230833773869868419475239575503198607639501078527\n", "392318858461667547739736838950479151006397215279002157055\n", "784637716923335095479473677900958302012794430558004314111\n", "1569275433846670190958947355801916604025588861116008628223\n", "3138550867693340381917894711603833208051177722232017256447\n", "6277101735386680763835789423207666416102355444464034512895\n", "12554203470773361527671578846415332832204710888928069025791\n", "25108406941546723055343157692830665664409421777856138051583\n", "50216813883093446110686315385661331328818843555712276103167\n", "100433627766186892221372630771322662657637687111424552206335\n", "200867255532373784442745261542645325315275374222849104412671\n", "401734511064747568885490523085290650630550748445698208825343\n", "803469022129495137770981046170581301261101496891396417650687\n", "1606938044258990275541962092341162602522202993782792835301375\n", "3213876088517980551083924184682325205044405987565585670602751\n", "6427752177035961102167848369364650410088811975131171341205503\n", "12855504354071922204335696738729300820177623950262342682411007\n", "25711008708143844408671393477458601640355247900524685364822015\n", "51422017416287688817342786954917203280710495801049370729644031\n", "102844034832575377634685573909834406561420991602098741459288063\n", "205688069665150755269371147819668813122841983204197482918576127\n", "411376139330301510538742295639337626245683966408394965837152255\n", "822752278660603021077484591278675252491367932816789931674304511\n", "1645504557321206042154969182557350504982735865633579863348609023\n", "3291009114642412084309938365114701009965471731267159726697218047\n", "6582018229284824168619876730229402019930943462534319453394436095\n", "13164036458569648337239753460458804039861886925068638906788872191\n", "26328072917139296674479506920917608079723773850137277813577744383\n", "52656145834278593348959013841835216159447547700274555627155488767\n", "105312291668557186697918027683670432318895095400549111254310977535\n", "210624583337114373395836055367340864637790190801098222508621955071\n", "421249166674228746791672110734681729275580381602196445017243910143\n", "842498333348457493583344221469363458551160763204392890034487820287\n", "1684996666696914987166688442938726917102321526408785780068975640575\n", "3369993333393829974333376885877453834204643052817571560137951281151\n", "6739986666787659948666753771754907668409286105635143120275902562303\n", "13479973333575319897333507543509815336818572211270286240551805124607\n", "26959946667150639794667015087019630673637144422540572481103610249215\n", "53919893334301279589334030174039261347274288845081144962207220498431\n", "107839786668602559178668060348078522694548577690162289924414440996863\n", "215679573337205118357336120696157045389097155380324579848828881993727\n", "431359146674410236714672241392314090778194310760649159697657763987455\n", "862718293348820473429344482784628181556388621521298319395315527974911\n", "1725436586697640946858688965569256363112777243042596638790631055949823\n", "3450873173395281893717377931138512726225554486085193277581262111899647\n", "6901746346790563787434755862277025452451108972170386555162524223799295\n", "13803492693581127574869511724554050904902217944340773110325048447598591\n", "27606985387162255149739023449108101809804435888681546220650096895197183\n", "55213970774324510299478046898216203619608871777363092441300193790394367\n", "110427941548649020598956093796432407239217743554726184882600387580788735\n", "220855883097298041197912187592864814478435487109452369765200775161577471\n", "441711766194596082395824375185729628956870974218904739530401550323154943\n", "883423532389192164791648750371459257913741948437809479060803100646309887\n", "1766847064778384329583297500742918515827483896875618958121606201292619775\n", "3533694129556768659166595001485837031654967793751237916243212402585239551\n", "7067388259113537318333190002971674063309935587502475832486424805170479103\n", "14134776518227074636666380005943348126619871175004951664972849610340958207\n", "28269553036454149273332760011886696253239742350009903329945699220681916415\n", "56539106072908298546665520023773392506479484700019806659891398441363832831\n", "113078212145816597093331040047546785012958969400039613319782796882727665663\n", "226156424291633194186662080095093570025917938800079226639565593765455331327\n", "452312848583266388373324160190187140051835877600158453279131187530910662655\n", "904625697166532776746648320380374280103671755200316906558262375061821325311\n", "1809251394333065553493296640760748560207343510400633813116524750123642650623\n", "3618502788666131106986593281521497120414687020801267626233049500247285301247\n", "7237005577332262213973186563042994240829374041602535252466099000494570602495\n", "14474011154664524427946373126085988481658748083205070504932198000989141204991\n", "28948022309329048855892746252171976963317496166410141009864396001978282409983\n", "57896044618658097711785492504343953926634992332820282019728792003956564819967\n", "115792089237316195423570985008687907853269984665640564039457584007913129639935\n", "231584178474632390847141970017375815706539969331281128078915168015826259279871\n", "463168356949264781694283940034751631413079938662562256157830336031652518559743\n", "926336713898529563388567880069503262826159877325124512315660672063305037119487\n", "1852673427797059126777135760139006525652319754650249024631321344126610074238975\n", "3705346855594118253554271520278013051304639509300498049262642688253220148477951\n", "7410693711188236507108543040556026102609279018600996098525285376506440296955903\n", "14821387422376473014217086081112052205218558037201992197050570753012880593911807\n", "29642774844752946028434172162224104410437116074403984394101141506025761187823615\n", "59285549689505892056868344324448208820874232148807968788202283012051522375647231\n", "118571099379011784113736688648896417641748464297615937576404566024103044751294463\n", "237142198758023568227473377297792835283496928595231875152809132048206089502588927\n", "474284397516047136454946754595585670566993857190463750305618264096412179005177855\n", "948568795032094272909893509191171341133987714380927500611236528192824358010355711\n", "1897137590064188545819787018382342682267975428761855001222473056385648716020711423\n", "3794275180128377091639574036764685364535950857523710002444946112771297432041422847\n", "7588550360256754183279148073529370729071901715047420004889892225542594864082845695\n", "15177100720513508366558296147058741458143803430094840009779784451085189728165691391\n", "30354201441027016733116592294117482916287606860189680019559568902170379456331382783\n", "60708402882054033466233184588234965832575213720379360039119137804340758912662765567\n", "121416805764108066932466369176469931665150427440758720078238275608681517825325531135\n", "242833611528216133864932738352939863330300854881517440156476551217363035650651062271\n", "485667223056432267729865476705879726660601709763034880312953102434726071301302124543\n", "971334446112864535459730953411759453321203419526069760625906204869452142602604249087\n", "1942668892225729070919461906823518906642406839052139521251812409738904285205208498175\n", "3885337784451458141838923813647037813284813678104279042503624819477808570410416996351\n", "7770675568902916283677847627294075626569627356208558085007249638955617140820833992703\n", "15541351137805832567355695254588151253139254712417116170014499277911234281641667985407\n", "31082702275611665134711390509176302506278509424834232340028998555822468563283335970815\n", "62165404551223330269422781018352605012557018849668464680057997111644937126566671941631\n", "124330809102446660538845562036705210025114037699336929360115994223289874253133343883263\n", "248661618204893321077691124073410420050228075398673858720231988446579748506266687766527\n", "497323236409786642155382248146820840100456150797347717440463976893159497012533375533055\n", "994646472819573284310764496293641680200912301594695434880927953786318994025066751066111\n", "1989292945639146568621528992587283360401824603189390869761855907572637988050133502132223\n", "3978585891278293137243057985174566720803649206378781739523711815145275976100267004264447\n", "7957171782556586274486115970349133441607298412757563479047423630290551952200534008528895\n", "15914343565113172548972231940698266883214596825515126958094847260581103904401068017057791\n", "31828687130226345097944463881396533766429193651030253916189694521162207808802136034115583\n", "63657374260452690195888927762793067532858387302060507832379389042324415617604272068231167\n", "127314748520905380391777855525586135065716774604121015664758778084648831235208544136462335\n", "254629497041810760783555711051172270131433549208242031329517556169297662470417088272924671\n", "509258994083621521567111422102344540262867098416484062659035112338595324940834176545849343\n", "1018517988167243043134222844204689080525734196832968125318070224677190649881668353091698687\n", "2037035976334486086268445688409378161051468393665936250636140449354381299763336706183397375\n", "4074071952668972172536891376818756322102936787331872501272280898708762599526673412366794751\n", "8148143905337944345073782753637512644205873574663745002544561797417525199053346824733589503\n", "16296287810675888690147565507275025288411747149327490005089123594835050398106693649467179007\n", "32592575621351777380295131014550050576823494298654980010178247189670100796213387298934358015\n", "65185151242703554760590262029100101153646988597309960020356494379340201592426774597868716031\n", "130370302485407109521180524058200202307293977194619920040712988758680403184853549195737432063\n", "260740604970814219042361048116400404614587954389239840081425977517360806369707098391474864127\n", "521481209941628438084722096232800809229175908778479680162851955034721612739414196782949728255\n", "1042962419883256876169444192465601618458351817556959360325703910069443225478828393565899456511\n", "2085924839766513752338888384931203236916703635113918720651407820138886450957656787131798913023\n", "4171849679533027504677776769862406473833407270227837441302815640277772901915313574263597826047\n", "8343699359066055009355553539724812947666814540455674882605631280555545803830627148527195652095\n", "16687398718132110018711107079449625895333629080911349765211262561111091607661254297054391304191\n", "33374797436264220037422214158899251790667258161822699530422525122222183215322508594108782608383\n", "66749594872528440074844428317798503581334516323645399060845050244444366430645017188217565216767\n", "133499189745056880149688856635597007162669032647290798121690100488888732861290034376435130433535\n", "266998379490113760299377713271194014325338065294581596243380200977777465722580068752870260867071\n", "533996758980227520598755426542388028650676130589163192486760401955554931445160137505740521734143\n", "1067993517960455041197510853084776057301352261178326384973520803911109862890320275011481043468287\n", "2135987035920910082395021706169552114602704522356652769947041607822219725780640550022962086936575\n", "4271974071841820164790043412339104229205409044713305539894083215644439451561281100045924173873151\n", "8543948143683640329580086824678208458410818089426611079788166431288878903122562200091848347746303\n", "17087896287367280659160173649356416916821636178853222159576332862577757806245124400183696695492607\n", "34175792574734561318320347298712833833643272357706444319152665725155515612490248800367393390985215\n", "68351585149469122636640694597425667667286544715412888638305331450311031224980497600734786781970431\n", "136703170298938245273281389194851335334573089430825777276610662900622062449960995201469573563940863\n", "273406340597876490546562778389702670669146178861651554553221325801244124899921990402939147127881727\n", "546812681195752981093125556779405341338292357723303109106442651602488249799843980805878294255763455\n", "1093625362391505962186251113558810682676584715446606218212885303204976499599687961611756588511526911\n", "2187250724783011924372502227117621365353169430893212436425770606409952999199375923223513177023053823\n", "4374501449566023848745004454235242730706338861786424872851541212819905998398751846447026354046107647\n", "8749002899132047697490008908470485461412677723572849745703082425639811996797503692894052708092215295\n", "17498005798264095394980017816940970922825355447145699491406164851279623993595007385788105416184430591\n", "34996011596528190789960035633881941845650710894291398982812329702559247987190014771576210832368861183\n", "69992023193056381579920071267763883691301421788582797965624659405118495974380029543152421664737722367\n", "139984046386112763159840142535527767382602843577165595931249318810236991948760059086304843329475444735\n", "279968092772225526319680285071055534765205687154331191862498637620473983897520118172609686658950889471\n", "559936185544451052639360570142111069530411374308662383724997275240947967795040236345219373317901778943\n", "1119872371088902105278721140284222139060822748617324767449994550481895935590080472690438746635803557887\n", "2239744742177804210557442280568444278121645497234649534899989100963791871180160945380877493271607115775\n", "4479489484355608421114884561136888556243290994469299069799978201927583742360321890761754986543214231551\n", "8958978968711216842229769122273777112486581988938598139599956403855167484720643781523509973086428463103\n", "17917957937422433684459538244547554224973163977877196279199912807710334969441287563047019946172856926207\n", "35835915874844867368919076489095108449946327955754392558399825615420669938882575126094039892345713852415\n", "71671831749689734737838152978190216899892655911508785116799651230841339877765150252188079784691427704831\n", "143343663499379469475676305956380433799785311823017570233599302461682679755530300504376159569382855409663\n", "286687326998758938951352611912760867599570623646035140467198604923365359511060601008752319138765710819327\n", "573374653997517877902705223825521735199141247292070280934397209846730719022121202017504638277531421638655\n", "1146749307995035755805410447651043470398282494584140561868794419693461438044242404035009276555062843277311\n", "2293498615990071511610820895302086940796564989168281123737588839386922876088484808070018553110125686554623\n", "4586997231980143023221641790604173881593129978336562247475177678773845752176969616140037106220251373109247\n", "9173994463960286046443283581208347763186259956673124494950355357547691504353939232280074212440502746218495\n", "18347988927920572092886567162416695526372519913346248989900710715095383008707878464560148424881005492436991\n", "36695977855841144185773134324833391052745039826692497979801421430190766017415756929120296849762010984873983\n", "73391955711682288371546268649666782105490079653384995959602842860381532034831513858240593699524021969747967\n", "146783911423364576743092537299333564210980159306769991919205685720763064069663027716481187399048043939495935\n", "293567822846729153486185074598667128421960318613539983838411371441526128139326055432962374798096087878991871\n", "587135645693458306972370149197334256843920637227079967676822742883052256278652110865924749596192175757983743\n", "1174271291386916613944740298394668513687841274454159935353645485766104512557304221731849499192384351515967487\n", "2348542582773833227889480596789337027375682548908319870707290971532209025114608443463698998384768703031934975\n", "4697085165547666455778961193578674054751365097816639741414581943064418050229216886927397996769537406063869951\n", "9394170331095332911557922387157348109502730195633279482829163886128836100458433773854795993539074812127739903\n", "18788340662190665823115844774314696219005460391266558965658327772257672200916867547709591987078149624255479807\n", "37576681324381331646231689548629392438010920782533117931316655544515344401833735095419183974156299248510959615\n", "75153362648762663292463379097258784876021841565066235862633311089030688803667470190838367948312598497021919231\n", "150306725297525326584926758194517569752043683130132471725266622178061377607334940381676735896625196994043838463\n", "300613450595050653169853516389035139504087366260264943450533244356122755214669880763353471793250393988087676927\n", "601226901190101306339707032778070279008174732520529886901066488712245510429339761526706943586500787976175353855\n", "1202453802380202612679414065556140558016349465041059773802132977424491020858679523053413887173001575952350707711\n", "2404907604760405225358828131112281116032698930082119547604265954848982041717359046106827774346003151904701415423\n", "4809815209520810450717656262224562232065397860164239095208531909697964083434718092213655548692006303809402830847\n", "9619630419041620901435312524449124464130795720328478190417063819395928166869436184427311097384012607618805661695\n", "19239260838083241802870625048898248928261591440656956380834127638791856333738872368854622194768025215237611323391\n", "38478521676166483605741250097796497856523182881313912761668255277583712667477744737709244389536050430475222646783\n", "76957043352332967211482500195592995713046365762627825523336510555167425334955489475418488779072100860950445293567\n", "153914086704665934422965000391185991426092731525255651046673021110334850669910978950836977558144201721900890587135\n", "307828173409331868845930000782371982852185463050511302093346042220669701339821957901673955116288403443801781174271\n", "615656346818663737691860001564743965704370926101022604186692084441339402679643915803347910232576806887603562348543\n", "1231312693637327475383720003129487931408741852202045208373384168882678805359287831606695820465153613775207124697087\n", "2462625387274654950767440006258975862817483704404090416746768337765357610718575663213391640930307227550414249394175\n", "4925250774549309901534880012517951725634967408808180833493536675530715221437151326426783281860614455100828498788351\n", "9850501549098619803069760025035903451269934817616361666987073351061430442874302652853566563721228910201656997576703\n", "19701003098197239606139520050071806902539869635232723333974146702122860885748605305707133127442457820403313995153407\n", "39402006196394479212279040100143613805079739270465446667948293404245721771497210611414266254884915640806627990306815\n", "78804012392788958424558080200287227610159478540930893335896586808491443542994421222828532509769831281613255980613631\n", "157608024785577916849116160400574455220318957081861786671793173616982887085988842445657065019539662563226511961227263\n", "315216049571155833698232320801148910440637914163723573343586347233965774171977684891314130039079325126453023922454527\n", "630432099142311667396464641602297820881275828327447146687172694467931548343955369782628260078158650252906047844909055\n", "1260864198284623334792929283204595641762551656654894293374345388935863096687910739565256520156317300505812095689818111\n", "2521728396569246669585858566409191283525103313309788586748690777871726193375821479130513040312634601011624191379636223\n", "5043456793138493339171717132818382567050206626619577173497381555743452386751642958261026080625269202023248382759272447\n", "10086913586276986678343434265636765134100413253239154346994763111486904773503285916522052161250538404046496765518544895\n", "20173827172553973356686868531273530268200826506478308693989526222973809547006571833044104322501076808092993531037089791\n", "40347654345107946713373737062547060536401653012956617387979052445947619094013143666088208645002153616185987062074179583\n", "80695308690215893426747474125094121072803306025913234775958104891895238188026287332176417290004307232371974124148359167\n", "161390617380431786853494948250188242145606612051826469551916209783790476376052574664352834580008614464743948248296718335\n", "322781234760863573706989896500376484291213224103652939103832419567580952752105149328705669160017228929487896496593436671\n", "645562469521727147413979793000752968582426448207305878207664839135161905504210298657411338320034457858975792993186873343\n", "1291124939043454294827959586001505937164852896414611756415329678270323811008420597314822676640068915717951585986373746687\n", "2582249878086908589655919172003011874329705792829223512830659356540647622016841194629645353280137831435903171972747493375\n", "5164499756173817179311838344006023748659411585658447025661318713081295244033682389259290706560275662871806343945494986751\n", "10328999512347634358623676688012047497318823171316894051322637426162590488067364778518581413120551325743612687890989973503\n", "20657999024695268717247353376024094994637646342633788102645274852325180976134729557037162826241102651487225375781979947007\n", "41315998049390537434494706752048189989275292685267576205290549704650361952269459114074325652482205302974450751563959894015\n", "82631996098781074868989413504096379978550585370535152410581099409300723904538918228148651304964410605948901503127919788031\n", "165263992197562149737978827008192759957101170741070304821162198818601447809077836456297302609928821211897803006255839576063\n", "330527984395124299475957654016385519914202341482140609642324397637202895618155672912594605219857642423795606012511679152127\n", "661055968790248598951915308032771039828404682964281219284648795274405791236311345825189210439715284847591212025023358304255\n", "1322111937580497197903830616065542079656809365928562438569297590548811582472622691650378420879430569695182424050046716608511\n", "2644223875160994395807661232131084159313618731857124877138595181097623164945245383300756841758861139390364848100093433217023\n", "5288447750321988791615322464262168318627237463714249754277190362195246329890490766601513683517722278780729696200186866434047\n", "10576895500643977583230644928524336637254474927428499508554380724390492659780981533203027367035444557561459392400373732868095\n", "21153791001287955166461289857048673274508949854856999017108761448780985319561963066406054734070889115122918784800747465736191\n", "42307582002575910332922579714097346549017899709713998034217522897561970639123926132812109468141778230245837569601494931472383\n", "84615164005151820665845159428194693098035799419427996068435045795123941278247852265624218936283556460491675139202989862944767\n", "169230328010303641331690318856389386196071598838855992136870091590247882556495704531248437872567112920983350278405979725889535\n", "338460656020607282663380637712778772392143197677711984273740183180495765112991409062496875745134225841966700556811959451779071\n", "676921312041214565326761275425557544784286395355423968547480366360991530225982818124993751490268451683933401113623918903558143\n", "1353842624082429130653522550851115089568572790710847937094960732721983060451965636249987502980536903367866802227247837807116287\n", "2707685248164858261307045101702230179137145581421695874189921465443966120903931272499975005961073806735733604454495675614232575\n", "5415370496329716522614090203404460358274291162843391748379842930887932241807862544999950011922147613471467208908991351228465151\n", "10830740992659433045228180406808920716548582325686783496759685861775864483615725089999900023844295226942934417817982702456930303\n", "21661481985318866090456360813617841433097164651373566993519371723551728967231450179999800047688590453885868835635965404913860607\n", "43322963970637732180912721627235682866194329302747133987038743447103457934462900359999600095377180907771737671271930809827721215\n", "86645927941275464361825443254471365732388658605494267974077486894206915868925800719999200190754361815543475342543861619655442431\n", "173291855882550928723650886508942731464777317210988535948154973788413831737851601439998400381508723631086950685087723239310884863\n", "346583711765101857447301773017885462929554634421977071896309947576827663475703202879996800763017447262173901370175446478621769727\n", "693167423530203714894603546035770925859109268843954143792619895153655326951406405759993601526034894524347802740350892957243539455\n", "1386334847060407429789207092071541851718218537687908287585239790307310653902812811519987203052069789048695605480701785914487078911\n", "2772669694120814859578414184143083703436437075375816575170479580614621307805625623039974406104139578097391210961403571828974157823\n", "5545339388241629719156828368286167406872874150751633150340959161229242615611251246079948812208279156194782421922807143657948315647\n", "11090678776483259438313656736572334813745748301503266300681918322458485231222502492159897624416558312389564843845614287315896631295\n", "22181357552966518876627313473144669627491496603006532601363836644916970462445004984319795248833116624779129687691228574631793262591\n", "44362715105933037753254626946289339254982993206013065202727673289833940924890009968639590497666233249558259375382457149263586525183\n", "88725430211866075506509253892578678509965986412026130405455346579667881849780019937279180995332466499116518750764914298527173050367\n", "177450860423732151013018507785157357019931972824052260810910693159335763699560039874558361990664932998233037501529828597054346100735\n", "354901720847464302026037015570314714039863945648104521621821386318671527399120079749116723981329865996466075003059657194108692201471\n", "709803441694928604052074031140629428079727891296209043243642772637343054798240159498233447962659731992932150006119314388217384402943\n", "1419606883389857208104148062281258856159455782592418086487285545274686109596480318996466895925319463985864300012238628776434768805887\n", "2839213766779714416208296124562517712318911565184836172974571090549372219192960637992933791850638927971728600024477257552869537611775\n", "5678427533559428832416592249125035424637823130369672345949142181098744438385921275985867583701277855943457200048954515105739075223551\n", "11356855067118857664833184498250070849275646260739344691898284362197488876771842551971735167402555711886914400097909030211478150447103\n", "22713710134237715329666368996500141698551292521478689383796568724394977753543685103943470334805111423773828800195818060422956300894207\n", "45427420268475430659332737993000283397102585042957378767593137448789955507087370207886940669610222847547657600391636120845912601788415\n", "90854840536950861318665475986000566794205170085914757535186274897579911014174740415773881339220445695095315200783272241691825203576831\n", "181709681073901722637330951972001133588410340171829515070372549795159822028349480831547762678440891390190630401566544483383650407153663\n", "363419362147803445274661903944002267176820680343659030140745099590319644056698961663095525356881782780381260803133088966767300814307327\n", "726838724295606890549323807888004534353641360687318060281490199180639288113397923326191050713763565560762521606266177933534601628614655\n", "1453677448591213781098647615776009068707282721374636120562980398361278576226795846652382101427527131121525043212532355867069203257229311\n", "2907354897182427562197295231552018137414565442749272241125960796722557152453591693304764202855054262243050086425064711734138406514458623\n", "5814709794364855124394590463104036274829130885498544482251921593445114304907183386609528405710108524486100172850129423468276813028917247\n", "11629419588729710248789180926208072549658261770997088964503843186890228609814366773219056811420217048972200345700258846936553626057834495\n", "23258839177459420497578361852416145099316523541994177929007686373780457219628733546438113622840434097944400691400517693873107252115668991\n", "46517678354918840995156723704832290198633047083988355858015372747560914439257467092876227245680868195888801382801035387746214504231337983\n", "93035356709837681990313447409664580397266094167976711716030745495121828878514934185752454491361736391777602765602070775492429008462675967\n", "186070713419675363980626894819329160794532188335953423432061490990243657757029868371504908982723472783555205531204141550984858016925351935\n", "372141426839350727961253789638658321589064376671906846864122981980487315514059736743009817965446945567110411062408283101969716033850703871\n", "744282853678701455922507579277316643178128753343813693728245963960974631028119473486019635930893891134220822124816566203939432067701407743\n", "1488565707357402911845015158554633286356257506687627387456491927921949262056238946972039271861787782268441644249633132407878864135402815487\n", "2977131414714805823690030317109266572712515013375254774912983855843898524112477893944078543723575564536883288499266264815757728270805630975\n", "5954262829429611647380060634218533145425030026750509549825967711687797048224955787888157087447151129073766576998532529631515456541611261951\n", "11908525658859223294760121268437066290850060053501019099651935423375594096449911575776314174894302258147533153997065059263030913083222523903\n", "23817051317718446589520242536874132581700120107002038199303870846751188192899823151552628349788604516295066307994130118526061826166445047807\n", "47634102635436893179040485073748265163400240214004076398607741693502376385799646303105256699577209032590132615988260237052123652332890095615\n", "95268205270873786358080970147496530326800480428008152797215483387004752771599292606210513399154418065180265231976520474104247304665780191231\n", "190536410541747572716161940294993060653600960856016305594430966774009505543198585212421026798308836130360530463953040948208494609331560382463\n", "381072821083495145432323880589986121307201921712032611188861933548019011086397170424842053596617672260721060927906081896416989218663120764927\n", "762145642166990290864647761179972242614403843424065222377723867096038022172794340849684107193235344521442121855812163792833978437326241529855\n", "1524291284333980581729295522359944485228807686848130444755447734192076044345588681699368214386470689042884243711624327585667956874652483059711\n", "3048582568667961163458591044719888970457615373696260889510895468384152088691177363398736428772941378085768487423248655171335913749304966119423\n", "6097165137335922326917182089439777940915230747392521779021790936768304177382354726797472857545882756171536974846497310342671827498609932238847\n", "12194330274671844653834364178879555881830461494785043558043581873536608354764709453594945715091765512343073949692994620685343654997219864477695\n", "24388660549343689307668728357759111763660922989570087116087163747073216709529418907189891430183531024686147899385989241370687309994439728955391\n", "48777321098687378615337456715518223527321845979140174232174327494146433419058837814379782860367062049372295798771978482741374619988879457910783\n", "97554642197374757230674913431036447054643691958280348464348654988292866838117675628759565720734124098744591597543956965482749239977758915821567\n", "195109284394749514461349826862072894109287383916560696928697309976585733676235351257519131441468248197489183195087913930965498479955517831643135\n", "390218568789499028922699653724145788218574767833121393857394619953171467352470702515038262882936496394978366390175827861930996959911035663286271\n", "780437137578998057845399307448291576437149535666242787714789239906342934704941405030076525765872992789956732780351655723861993919822071326572543\n", "1560874275157996115690798614896583152874299071332485575429578479812685869409882810060153051531745985579913465560703311447723987839644142653145087\n", "3121748550315992231381597229793166305748598142664971150859156959625371738819765620120306103063491971159826931121406622895447975679288285306290175\n", "6243497100631984462763194459586332611497196285329942301718313919250743477639531240240612206126983942319653862242813245790895951358576570612580351\n", "12486994201263968925526388919172665222994392570659884603436627838501486955279062480481224412253967884639307724485626491581791902717153141225160703\n", "24973988402527937851052777838345330445988785141319769206873255677002973910558124960962448824507935769278615448971252983163583805434306282450321407\n", "49947976805055875702105555676690660891977570282639538413746511354005947821116249921924897649015871538557230897942505966327167610868612564900642815\n", "99895953610111751404211111353381321783955140565279076827493022708011895642232499843849795298031743077114461795885011932654335221737225129801285631\n", "199791907220223502808422222706762643567910281130558153654986045416023791284464999687699590596063486154228923591770023865308670443474450259602571263\n", "399583814440447005616844445413525287135820562261116307309972090832047582568929999375399181192126972308457847183540047730617340886948900519205142527\n", "799167628880894011233688890827050574271641124522232614619944181664095165137859998750798362384253944616915694367080095461234681773897801038410285055\n", "1598335257761788022467377781654101148543282249044465229239888363328190330275719997501596724768507889233831388734160190922469363547795602076820570111\n", "3196670515523576044934755563308202297086564498088930458479776726656380660551439995003193449537015778467662777468320381844938727095591204153641140223\n", "6393341031047152089869511126616404594173128996177860916959553453312761321102879990006386899074031556935325554936640763689877454191182408307282280447\n", "12786682062094304179739022253232809188346257992355721833919106906625522642205759980012773798148063113870651109873281527379754908382364816614564560895\n", "25573364124188608359478044506465618376692515984711443667838213813251045284411519960025547596296126227741302219746563054759509816764729633229129121791\n", "51146728248377216718956089012931236753385031969422887335676427626502090568823039920051095192592252455482604439493126109519019633529459266458258243583\n", "102293456496754433437912178025862473506770063938845774671352855253004181137646079840102190385184504910965208878986252219038039267058918532916516487167\n", "204586912993508866875824356051724947013540127877691549342705710506008362275292159680204380770369009821930417757972504438076078534117837065833032974335\n", "409173825987017733751648712103449894027080255755383098685411421012016724550584319360408761540738019643860835515945008876152157068235674131666065948671\n", "818347651974035467503297424206899788054160511510766197370822842024033449101168638720817523081476039287721671031890017752304314136471348263332131897343\n", "1636695303948070935006594848413799576108321023021532394741645684048066898202337277441635046162952078575443342063780035504608628272942696526664263794687\n" ] } ], "source": [ "for i in range(500):\n", " print(2**i - 1)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.2" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: docs/source/examples/Notebook/Typesetting Equations.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "The Markdown parser included in the Jupyter Notebook is MathJax-aware. This means that you can freely mix in mathematical expressions using the [MathJax subset of Tex and LaTeX](https://docs.mathjax.org/en/latest/input/tex/). [Some examples from the MathJax demos site](https://mathjax.github.io/MathJax-demos-web/) are reproduced below, as well as the Markdown+TeX source." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Motivating Examples\n", "\n", "## The Lorenz Equations\n", "### Source\n", "```\n", "\\begin{align}\n", "\\dot{x} & = \\sigma(y-x) \\\\\n", "\\dot{y} & = \\rho x - y - xz \\\\\n", "\\dot{z} & = -\\beta z + xy\n", "\\end{align}\n", "```\n", "### Display\n", "\n", "$\\begin{align}\n", "\\dot{x} & = \\sigma(y-x) \\\\\n", "\\dot{y} & = \\rho x - y - xz \\\\\n", "\\dot{z} & = -\\beta z + xy\n", "\\end{align}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The Cauchy-Schwarz Inequality\n", "### Source\n", "```\n", "\\begin{equation*}\n", "\\left( \\sum_{k=1}^n a_k b_k \\right)^2 \\leq \\left( \\sum_{k=1}^n a_k^2 \\right) \\left( \\sum_{k=1}^n b_k^2 \\right)\n", "\\end{equation*}\n", "```\n", "### Display\n", "\n", "$\\begin{equation*}\n", "\\left( \\sum_{k=1}^n a_k b_k \\right)^2 \\leq \\left( \\sum_{k=1}^n a_k^2 \\right) \\left( \\sum_{k=1}^n b_k^2 \\right)\n", "\\end{equation*}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A Cross Product Formula\n", "### Source\n", "```\n", "\\begin{equation*}\n", "\\mathbf{V}_1 \\times \\mathbf{V}_2 = \\begin{vmatrix}\n", "\\mathbf{i} & \\mathbf{j} & \\mathbf{k} \\\\\n", "\\frac{\\partial X}{\\partial u} & \\frac{\\partial Y}{\\partial u} & 0 \\\\\n", "\\frac{\\partial X}{\\partial v} & \\frac{\\partial Y}{\\partial v} & 0\n", "\\end{vmatrix} \n", "\\end{equation*}\n", "```\n", "### Display\n", "\n", "$\\begin{equation*}\n", "\\mathbf{V}_1 \\times \\mathbf{V}_2 = \\begin{vmatrix}\n", "\\mathbf{i} & \\mathbf{j} & \\mathbf{k} \\\\\n", "\\frac{\\partial X}{\\partial u} & \\frac{\\partial Y}{\\partial u} & 0 \\\\\n", "\\frac{\\partial X}{\\partial v} & \\frac{\\partial Y}{\\partial v} & 0\n", "\\end{vmatrix} \n", "\\end{equation*}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The probability of getting \\(k\\) heads when flipping \\(n\\) coins is\n", "### Source\n", "```\n", "\\begin{equation*}\n", "P(E) = {n \\choose k} p^k (1-p)^{ n-k} \n", "\\end{equation*}\n", "```\n", "### Display\n", "\n", "$\\begin{equation*}\n", "P(E) = {n \\choose k} p^k (1-p)^{ n-k} \n", "\\end{equation*}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## An Identity of Ramanujan\n", "### Source\n", "```\n", "\\begin{equation*}\n", "\\frac{1}{\\Bigl(\\sqrt{\\phi \\sqrt{5}}-\\phi\\Bigr) e^{\\frac25 \\pi}} =\n", "1+\\frac{e^{-2\\pi}} {1+\\frac{e^{-4\\pi}} {1+\\frac{e^{-6\\pi}}\n", "{1+\\frac{e^{-8\\pi}} {1+\\ldots} } } } \n", "\\end{equation*}\n", "```\n", "### Display\n", "$\\begin{equation*}\n", "\\frac{1}{\\Bigl(\\sqrt{\\phi \\sqrt{5}}-\\phi\\Bigr) e^{\\frac25 \\pi}} =\n", "1+\\frac{e^{-2\\pi}} {1+\\frac{e^{-4\\pi}} {1+\\frac{e^{-6\\pi}}\n", "{1+\\frac{e^{-8\\pi}} {1+\\ldots} } } } \n", "\\end{equation*}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A Rogers-Ramanujan Identity\n", "### Source\n", "```\n", "\\begin{equation*}\n", "1 + \\frac{q^2}{(1-q)}+\\frac{q^6}{(1-q)(1-q^2)}+\\cdots =\n", "\\prod_{j=0}^{\\infty}\\frac{1}{(1-q^{5j+2})(1-q^{5j+3})},\n", "\\quad\\quad \\text{for $|q|<1$}. \n", "\\end{equation*}\n", "```\n", "### Display\n", "\n", "$$\\begin{equation*}\n", "1 + \\frac{q^2}{(1-q)}+\\frac{q^6}{(1-q)(1-q^2)}+\\cdots =\n", "\\prod_{j=0}^{\\infty}\\frac{1}{(1-q^{5j+2})(1-q^{5j+3})},\n", "\\quad\\quad \\text{for $|q|<1$}. \n", "\\end{equation*}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Maxwell's Equations\n", "### Source\n", "```\n", "\\begin{align}\n", "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\ \\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n", "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n", "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 \n", "\\end{align}\n", "```\n", "### Display\n", "\n", "$\\begin{align}\n", "\\nabla \\times \\vec{\\mathbf{B}} -\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{E}}}{\\partial t} & = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\ \\nabla \\cdot \\vec{\\mathbf{E}} & = 4 \\pi \\rho \\\\\n", "\\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \\frac1c\\, \\frac{\\partial\\vec{\\mathbf{B}}}{\\partial t} & = \\vec{\\mathbf{0}} \\\\\n", "\\nabla \\cdot \\vec{\\mathbf{B}} & = 0 \n", "\\end{align}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Equation Numbering and References\n", "\n", "Equation numbering and referencing will be available in a future version of the Jupyter notebook." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inline Typesetting (Mixing Markdown and TeX)\n", "\n", "While display equations look good for a page of samples, the ability to mix math and *formatted* **text** in a paragraph is also important.\n", "\n", "### Source\n", "```\n", "This expression $\\sqrt{3x-1}+(1+x)^2$ is an example of a TeX inline equation in a [Markdown-formatted](https://daringfireball.net/projects/markdown/) sentence. \n", "```\n", "\n", "### Display\n", "This expression $\\sqrt{3x-1}+(1+x)^2$ is an example of a TeX inline equation in a [Markdown-formatted](https://daringfireball.net/projects/markdown/) sentence. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Other Syntax\n", "\n", "You will notice in other places on the web that `$$` are needed explicitly to begin and end MathJax typesetting. This is **not** required if you will be using TeX environments, but the Jupyter notebook will accept this syntax on legacy notebooks. \n", "\n", "## Source\n", "\n", "```\n", "$$\n", "\\begin{array}{c}\n", "y_1 \\\\\\\n", "y_2 \\mathtt{t}_i \\\\\\\n", "z_{3,4}\n", "\\end{array}\n", "$$\n", "```\n", "\n", "```\n", "$$\n", "\\begin{array}{c}\n", "y_1 \\cr\n", "y_2 \\mathtt{t}_i \\cr\n", "y_{3}\n", "\\end{array}\n", "$$\n", "```\n", "\n", "```\n", "$$\\begin{eqnarray} \n", "x' &=& &x \\sin\\phi &+& z \\cos\\phi \\\\\n", "z' &=& - &x \\cos\\phi &+& z \\sin\\phi \\\\\n", "\\end{eqnarray}$$\n", "```\n", "\n", "```\n", "$$\n", "x=4\n", "$$\n", "```\n", "\n", "## Display\n", "\n", "$$\n", "\\begin{array}{c}\n", "y_1 \\\\\\\n", "y_2 \\mathtt{t}_i \\\\\\\n", "z_{3,4}\n", "\\end{array}\n", "$$\n", "\n", "$$\n", "\\begin{array}{c}\n", "y_1 \\cr\n", "y_2 \\mathtt{t}_i \\cr\n", "y_{3}\n", "\\end{array}\n", "$$\n", "\n", "$$\\begin{eqnarray} \n", "x' &=& &x \\sin\\phi &+& z \\cos\\phi \\\\\n", "z' &=& - &x \\cos\\phi &+& z \\sin\\phi \\\\\n", "\\end{eqnarray}$$\n", "\n", "$$\n", "x=4\n", "$$" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: docs/source/examples/Notebook/What is the Jupyter Notebook.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# What is the Jupyter Notebook?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Jupyter Notebook is an **interactive computing environment** that enables users to author notebook documents that include: \n", "- Live code\n", "- Interactive widgets\n", "- Plots\n", "- Narrative text\n", "- Equations\n", "- Images\n", "- Video\n", "\n", "These documents provide a **complete and self-contained record of a computation** that can be converted to various formats and shared with others using email, [Dropbox](https://www.dropbox.com/), version control systems (like git/[GitHub](https://github.com)) or [nbviewer.jupyter.org](https://nbviewer.jupyter.org)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### Components" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Jupyter Notebook combines three components:\n", "\n", "* **The notebook web application**: An interactive web application for writing and running code interactively and authoring notebook documents.\n", "* **Kernels**: Separate processes started by the notebook web application that runs users' code in a given language and returns output back to the notebook web application. The kernel also handles things like computations for interactive widgets, tab completion and introspection. \n", "* **Notebook documents**: Self-contained documents that contain a representation of all content visible in the notebook web application, including inputs and outputs of the computations, narrative\n", "text, equations, images, and rich media representations of objects. Each notebook document has its own kernel." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Notebook web application" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The notebook web application enables users to:\n", "\n", "* **Edit code in the browser**, with automatic syntax highlighting, indentation, and tab completion/introspection.\n", "* **Run code from the browser**, with the results of computations attached to the code which generated them.\n", "* See the results of computations with **rich media representations**, such as HTML, LaTeX, PNG, SVG, PDF, etc.\n", "* Create and use **interactive JavaScript widgets**, which bind interactive user interface controls and visualizations to reactive kernel side computations.\n", "* Author **narrative text** using the [Markdown](https://daringfireball.net/projects/markdown/) markup language.\n", "* Include mathematical equations using **LaTeX syntax in Markdown**, which are rendered in-browser by [MathJax](https://www.mathjax.org/)." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Kernels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Through Jupyter's kernel and messaging architecture, the Notebook allows code to be run in a range of different programming languages. For each notebook document that a user opens, the web application starts a kernel that runs the code for that notebook. Each kernel is capable of running code in a single programming language and there are kernels available in the following languages:\n", "\n", "* Python(https://github.com/ipython/ipython)\n", "* Julia (https://github.com/JuliaLang/IJulia.jl)\n", "* R (https://github.com/IRkernel/IRkernel)\n", "* Ruby (https://github.com/minrk/iruby)\n", "* Haskell (https://github.com/gibiansky/IHaskell)\n", "* Scala (https://github.com/Bridgewater/scala-notebook)\n", "* node.js (https://gist.github.com/Carreau/4279371)\n", "* Go (https://github.com/takluyver/igo)\n", "\n", "The default kernel runs Python code. The notebook provides a simple way for users to pick which of these kernels is used for a given notebook. \n", "\n", "Each of these kernels communicate with the notebook web application and web browser using a JSON over ZeroMQ/WebSockets message protocol that is described [here](https://jupyter-client.readthedocs.io/en/latest/messaging.html#messaging). Most users don't need to know about these details, but it helps to understand that \"kernels run code.\"" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Notebook documents" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notebook documents contain the **inputs and outputs** of an interactive session as well as **narrative text** that accompanies the code but is not meant for execution. **Rich output** generated by running code, including HTML, images, video, and plots, is embeddeed in the notebook, which makes it a complete and self-contained record of a computation. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When you run the notebook web application on your computer, notebook documents are just **files on your local filesystem with a** `.ipynb` **extension**. This allows you to use familiar workflows for organizing your notebooks into folders and sharing them with others." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notebooks consist of a **linear sequence of cells**. There are three basic cell types:\n", "\n", "* **Code cells:** Input and output of live code that is run in the kernel\n", "* **Markdown cells:** Narrative text with embedded LaTeX equations\n", "* **Raw cells:** Unformatted text that is included, without modification, when notebooks are converted to different formats using nbconvert\n", "\n", "Internally, notebook documents are [JSON](https://en.wikipedia.org/wiki/JSON) **data** with **binary values** [base64](https://en.wikipedia.org/wiki/Base64) encoded. This allows them to be **read and manipulated programmatically** by any programming language. Because JSON is a text format, notebook documents are version control friendly.\n", "\n", "**Notebooks can be exported** to different static formats including HTML, reStructeredText, LaTeX, PDF, and slide shows ([reveal.js](https://revealjs.com)) using Jupyter's `nbconvert` utility.\n", "\n", "Furthermore, any notebook document available from a **public URL or on GitHub can be shared** via [nbviewer](https://nbviewer.jupyter.org). This service loads the notebook document from the URL and renders it as a static web page. The resulting web page may thus be shared with others **without their needing to install the Jupyter Notebook**." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: docs/source/examples/Notebook/Working With Markdown Cells.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Markdown Cells" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Text can be added to Jupyter Notebooks using Markdown cells. You can change the cell type to Markdown by using the `Cell` menu, the toolbar, or the key shortcut `m`. Markdown is a popular markup language that is a superset of HTML. Its specification can be found here:\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Markdown basics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can make text *italic* or **bold** by surrounding a block of text with a single or double * respectively" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can build nested itemized or enumerated lists:\n", "\n", "* One\n", " - Sublist\n", " - This\n", " - Sublist\n", " - That\n", " - The other thing\n", "* Two\n", " - Sublist\n", "* Three\n", " - Sublist\n", "\n", "Now another list:\n", "\n", "1. Here we go\n", " 1. Sublist\n", " 2. Sublist\n", "2. There we go\n", "3. Now this" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can add horizontal rules:\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here is a blockquote:\n", "\n", "> Beautiful is better than ugly.\n", "> Explicit is better than implicit.\n", "> Simple is better than complex.\n", "> Complex is better than complicated.\n", "> Flat is better than nested.\n", "> Sparse is better than dense.\n", "> Readability counts.\n", "> Special cases aren't special enough to break the rules.\n", "> Although practicality beats purity.\n", "> Errors should never pass silently.\n", "> Unless explicitly silenced.\n", "> In the face of ambiguity, refuse the temptation to guess.\n", "> There should be one-- and preferably only one --obvious way to do it.\n", "> Although that way may not be obvious at first unless you're Dutch.\n", "> Now is better than never.\n", "> Although never is often better than *right* now.\n", "> If the implementation is hard to explain, it's a bad idea.\n", "> If the implementation is easy to explain, it may be a good idea.\n", "> Namespaces are one honking great idea -- let's do more of those!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And shorthand for links:\n", "\n", "[Jupyter's website](https://jupyter.org)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can use backslash \\ to generate literal characters which would otherwise have special meaning in the Markdown syntax.\n", "\n", "```\n", "\\*literal asterisks\\*\n", " *literal asterisks*\n", "```\n", "\n", "Use double backslash \\ \\ to generate the literal $ symbol." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Headings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can add headings by starting a line with one (or multiple) `#` followed by a space, as in the following example:\n", "\n", "```\n", "# Heading 1\n", "# Heading 2\n", "## Heading 2.1\n", "## Heading 2.2\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Embedded code" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can embed code meant for illustration instead of execution in Python:\n", "\n", " def f(x):\n", " \"\"\"a docstring\"\"\"\n", " return x**2\n", "\n", "or other languages:\n", "\n", " for (i=0; i\n", "\n", "Header 1\n", "Header 2\n", "\n", "\n", "row 1, cell 1\n", "row 1, cell 2\n", "\n", "\n", "row 2, cell 1\n", "row 2, cell 2\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Local files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have local files in your Notebook directory, you can refer to these files in Markdown cells directly:\n", "\n", " [subdirectory/]\n", "\n", "For example, in the images folder, we have the Python logo:\n", "\n", " \n", "\n", "\n", "\n", "and a video with the HTML5 video tag:\n", "\n", " \n", "\n", "\n", "\n", "These do not embed the data into the notebook file, and require that the files exist when you are viewing the notebook." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Security of local files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this means that the Jupyter notebook server also acts as a generic file server\n", "for files inside the same tree as your notebooks. Access is not granted outside the\n", "notebook folder so you have strict control over what files are visible, but for this\n", "reason it is highly recommended that you do not run the notebook server with a notebook\n", "directory at a high level in your filesystem (e.g. your home directory).\n", "\n", "When you run the notebook in a password-protected manner, local file access is restricted\n", "to authenticated users unless read-only views are active." ] }, { "attachments": { "pycon-logo.jpg": { "image/jpeg": "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wwFLUXxDFNS9srVKbE1EY0t20AWVo/BAxBIcm/CVxiLnd+D8sSVNhM9eEg2cIChfkf8APNnAIoW5nCRMlTYTPT/wD//aAAwDAQACAAMAAAAQ8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888YU88888888888888888888888888s8skcw84Mw488888888888888888cYMIcc8g4c8ss44IU088888888888888oQYYQocMMc8MAoYQ4Qc888888888888M8I88888462088E88csU8888888888888s088zGfI4zEvKz88s088888888888888883/y2EWUV6np2/788888888888888888E4E0VUVUVpVpGI5I888888888888888E+XVcQeSZbiYjVpU+J8888888xw05KAxASQTCCCCCCCCCCwjiAxAG14wxDCCCGEMLJDEHP+sMMc+PLIDFHMIKCCCDL7eVPd/48004088808888w8w0vlbJu3H88/Q8N84s08wI4Ak08gkEMYM08t6sv8APPPK7LnfLGKPKPPAOFPOHAPAPPPLHnF/PPPPvovPLHKHJNOCEFPKGGEAONPPEvvvPPPPMPPPPPPHDHPHDPPPPHPHDPPPPMPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP/EACkRAQABAgMHBQEBAQAAAAAAAAEAETEhQaFRYXGBkcHRIECx4fAwgBD/2gAIAQMB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Davod+mLkEux2EJow4QYBAeh+RxozNxn2CmbIhHI9LnI8MZPeP5fcnCR9XToUi4uisp9PzlqJENxGvkG3P4FsKGF4ZNhhR2omuZ2AFFpV24N+jNAS8JExaTWRPFqBili0cwo8VYigsbJhwOiZ1dGnCeRUEIGS5lphG0xmo5Mw2xvIz7VOM4QZCyXZi6hdgoXldqkuY0kJ4qHB2DQmZYBquzpFOVcyg3dhSJ0miPLPRkwsAO7a34Z8OATDYGInmr+giXXaiqEoiuRvRLSAVIIW7exvaghfMY4iIbaGJGamgqAw3iKeSjvpdimReQ3AIm8uOnNAzUjiYmrWuRQA0AydyuYyXqDwb1dH34ARF4lmWIj+AIFxdJYRxfp7k4Sfq6/ymC+8CBNCRC9KSHttjCFss+f88D22ThA3WfPSk4L7yaA0BEB/wDgH//ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA=" } }, "cell_type": "markdown", "metadata": {}, "source": [ "### Markdown attachments\n", "\n", "Since Jupyter notebook version 5.0, in addition to referencing external file you can attach a file to a markdown cell. \n", "To do so drag the file from in a markdown cell while editing it:\n", "\n", "![pycon-logo.jpg](attachment:pycon-logo.jpg)\n", "\n", "Files are stored in cell metadata and will be automatically scrubbed at save-time if not referenced. You can recognized attached images from other files by their url that starts with `attachment:`. For the image above:\n", "\n", " ![pycon-logo.jpg](attachment:pycon-logo.jpg)\n", " \n", "Keep in mind that attached files will increase the size of your notebook. \n", "\n", "You can manually edit the attachment by using the `View > Cell Toolbar > Attachment` menu, but you should not need to. " ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: docs/source/examples/Notebook/examples_index.rst ================================================ ================= Notebook Examples ================= The pages in this section are all converted notebook files. You can also `view these notebooks on nbviewer`__. __ https://nbviewer.jupyter.org/github/jupyter/notebook/blob/main/ docs/source/examples/Notebook/ .. toctree:: :maxdepth: 2 What is the Jupyter Notebook Notebook Basics Running Code Working With Markdown Cells Custom Keyboard Shortcuts Importing Notebooks Connecting with the Qt Console Typesetting Equations ================================================ FILE: docs/source/examples/Notebook/nbpackage/__init__.py ================================================ ================================================ FILE: docs/source/examples/Notebook/nbpackage/mynotebook.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# My Notebook" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def foo():\n", " return \"foo\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def has_ip_syntax():\n", " listing = !ls\n", " return listing" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def whatsmyname():\n", " return __name__" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1+" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: docs/source/examples/Notebook/nbpackage/nbs/__init__.py ================================================ ================================================ FILE: docs/source/examples/Notebook/nbpackage/nbs/other.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Other notebook\n", "\n", "This notebook just defines `bar`" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def bar(x):\n", " return \"bar\" * x" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: docs/source/examples/images/FrontendKernel.graffle/data.plist ================================================ ActiveLayerIndex 0 ApplicationVersion com.omnigroup.OmniGraffle 139.18.0.187838 AutoAdjust BackgroundGraphic Bounds {{0, 0}, {576, 733}} Class SolidGraphic ID 2 Style shadow Draws NO stroke Draws NO BaseZoom 0 CanvasOrigin {0, 0} ColumnAlign 1 ColumnSpacing 36 CreationDate 2014-05-27 21:39:30 +0000 Creator bgranger DisplayScale 1 0/72 in = 1.0000 in GraphDocumentVersion 8 GraphicsList Class LineGraphic ControlPoints {0, 0} {-7, 8} {6.9999849080788863, -8.0000033519149838} {0, 0} ID 29 Points {164, 341.5} {186.5, 338} {196, 327.5} Style stroke Bezier HeadArrow 0 Legacy LineType 1 TailArrow 0 Bounds {{107.64779663085938, 305.5}, {69.088050842285156, 84.499992370605469}} Class ShapedGraphic ID 9 ImageID 1 Shape Rectangle Style fill Draws NO shadow Draws NO stroke Draws NO Class LineGraphic Head ID 6 Position 0.53676468133926392 ID 8 Points {288.09285678056523, 276} {288.49999833106995, 304.50001973116196} Style stroke HeadArrow FilledArrow Legacy LineType 1 TailArrow 0 Tail ID 7 Bounds {{207, 263}, {162, 13}} Class ShapedGraphic FitText YES Flow Resize ID 7 Shape Rectangle Style fill Draws NO shadow Draws NO stroke Draws NO Text Pad 0 Text {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 \cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 xkcd-Regular;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc \f0\fs20 \cf0 Interactive Computing Protocol} VerticalPad 0 Wrap NO Class LineGraphic Head ID 1 ID 6 Points {252, 304.50001973116196} {320, 304.50001973116196} Style stroke HeadArrow FilledArrow Legacy LineType 1 Pattern 1 TailArrow FilledArrow Tail ID 5 Bounds {{186.5, 286.5}, {65, 36}} Class ShapedGraphic ID 5 Shape Rectangle Style shadow Draws NO Text Text {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 \cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 xkcd-Regular;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc \f0\fs20 \cf0 Frontend} Bounds {{320.5, 286.5}, {65, 36}} Class ShapedGraphic ID 1 Shape Rectangle Style shadow Draws NO Text Text {\rtf1\ansi\ansicpg1252\cocoartf1265\cocoasubrtf190 \cocoascreenfonts1{\fonttbl\f0\fnil\fcharset0 xkcd-Regular;} {\colortbl;\red255\green255\blue255;} \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc \f0\fs20 \cf0 Kernel} GridInfo GuidesLocked NO GuidesVisible YES HPages 1 ImageCounter 2 ImageLinkBack ImageList image1.png KeepToScale Layers Lock NO Name Layer 1 Print YES View YES LayoutInfo Animate NO circoMinDist 18 circoSeparation 0.0 layoutEngine dot neatoSeparation 0.0 twopiSeparation 0.0 LinksVisible NO MagnetsVisible NO MasterSheets ModificationDate 2014-05-27 22:28:18 +0000 Modifier bgranger NotesVisible NO Orientation 2 OriginVisible NO PageBreaks YES PrintInfo NSBottomMargin float 41 NSHorizonalPagination coded BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG NSLeftMargin float 18 NSPaperSize size {612, 792} NSPrintReverseOrientation int 0 NSRightMargin float 18 NSTopMargin float 18 PrintOnePage ReadOnly NO RowAlign 1 RowSpacing 36 SheetTitle Canvas 1 SmartAlignmentGuidesActive YES SmartDistanceGuidesActive YES UniqueID 1 UseEntirePage VPages 1 WindowInfo CurrentSheet 0 ExpandedCanvases name Canvas 1 Frame {{277, 7}, {832, 871}} ListView OutlineWidth 142 RightSidebar ShowRuler Sidebar SidebarWidth 120 VisibleRegion {{96.5, 197.5}, {348.5, 366}} Zoom 2 ZoomValues Canvas 1 2 1 ================================================ FILE: docs/source/examples/utils/list_pyfiles.ipy ================================================ # A simple IPython script that provides Notebook links to .py files in the cwd from IPython.display import FileLink, display files =!ls *.py for f in files: display(FileLink(f)) ================================================ FILE: docs/source/examples/utils/list_subdirs.ipy ================================================ # A simple IPython script that lists files in all subdirs from IPython.display import FileLinks, display dirs =!ls -d */ for d in dirs: if d != '__pycache__/': display(FileLinks(d)) ================================================ FILE: docs/source/extending/frontend_extensions.md ================================================ (frontend-extensions)= # Custom front-end extensions This describes the basic steps to write a TypeScript extension for the Jupyter notebook front-end. This allows you to customize the behaviour of the various pages like the dashboard, the notebook, or the text editor. Starting with Notebook 7, front-end extensions for the notebook can be developed as prebuilt JupyterLab extensions. This means Notebook 7 is able to reuse many of the existing extensions from the JupyterLab ecosystem as is. If you would like to develop a prebuilt extension for Notebook 7, check out: - [JupyterLab Extension Tutorial](https://jupyterlab.readthedocs.io/en/latest/extension/extension_tutorial.html): A tutorial to learn how to make a simple JupyterLab extension. - The [JupyterLab Extension Examples Repository](https://github.com/jupyterlab/extension-examples): A repository containing many examples of JupyterLab extensions for performing various tasks: adding commands, adding a new widget, handling user settings, etc. ================================================ FILE: docs/source/extending/index.md ================================================ # Extending the Notebook ```{warning} Please note that the extension system for Notebook 7 is radically different from the one used in Notebook 6.5.x and earlier. If you are looking for information on how to extend the classic Notebook, please refer to the [documentation for NbClassic](https://nbclassic.readthedocs.io/en/latest/extending/index.html). ``` ```{note} With Notebook 7 being developed on top of JupyterLab and Jupyter Server, the frontend extension system is now based on the same extension system used by JupyterLab. Server extensions are also now based on the same system used by Jupyter Server. You will find below a link to the relevant documentations. ``` Certain subsystems of the notebook server are designed to be extended or overridden by users. These documents explain these systems, and show how to override the notebook's defaults with your own custom behavior. ```{toctree} :maxdepth: 2 Extending the Jupyter Server frontend_extensions ``` ================================================ FILE: docs/source/index.md ================================================ # Jupyter Notebook Documentation Welcome to the **Jupyter Notebook** documentation site. **Jupyter Notebook** is a simplified notebook authoring application, and is a part of [Project Jupyter](https://docs.jupyter.org/en/latest/), a large umbrella project centered around the goal of providing tools (and [standards](https://docs.jupyter.org/en/latest/#sub-project-documentation)) for interactive computing with [computational notebooks](https://docs.jupyter.org/en/latest/#what-is-a-notebook). A [computational notebook](https://docs.jupyter.org/en/latest/#what-is-a-notebook) is a shareable document that combines computer code, plain language descriptions, data, rich visualizations like 3D models, charts, graphs and figures, and interactive controls. A notebook, along with an editor like **Jupyter Notebook**, provides a fast interactive environment for prototyping and explaining code, exploring and visualizing data, and sharing ideas with others. **Jupyter Notebook** is a sibling to other notebook authoring applications under the Project Jupyter umbrella, like [JupyterLab](https://jupyterlab.readthedocs.io/en/stable/) and [Jupyter Desktop](https://github.com/jupyterlab/jupyterlab-desktop). Jupyter Notebook offers a lightweight, simplified experience compared to JupyterLab. Read more about how to use **Jupyter Notebook** on this site, in the [User Documentation](notebook.md). ```{image} ./_static/images/notebook-running-code.png ``` - [Installation](https://jupyter.readthedocs.io/en/latest/install.html) - [Starting the Notebook](https://jupyter.readthedocs.io/en/latest/running.html) ```{toctree} :maxdepth: 2 user-documentation configuration migrate_to_notebook7 contributor changelog ``` ================================================ FILE: docs/source/ipython_security.asc ================================================ -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.0.22 (GNU/Linux) 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 5vmLc+Ibz+eT+rM= =XVDe -----END PGP PUBLIC KEY BLOCK----- ================================================ FILE: docs/source/links.txt ================================================ .. This (-*- rst -*-) format file contains commonly used link targets and name substitutions. It may be included in many files, therefore it should only contain link targets and name substitutions. Try grepping for "^\.\. _" to find plausible candidates for this list. NOTE: this file must have an extension *opposite* to that of the main reST files in the manuals, so that we can include it with ".. include::" directives, but without triggering warnings from Sphinx for not being listed in any toctree. Since IPython uses .txt for the main files, this one will use .rst. NOTE: reST targets are __not_case_sensitive__, so only one target definition is needed for ipython, IPython, etc. NOTE: Some of these were taken from the nipy links compendium. .. Main Jupyter notebook links .. _Notebook Basics: notebook_p2_ .. _notebook_p2: https://nbviewer.jupyter.org/github/jupyter/notebook/blob/main/docs/source/examples/Notebook/Notebook%20Basics.ipynb .. _Running Code in the Jupyter Notebook: notebook_p1_ .. _notebook_p1: https://nbviewer.jupyter.org/github/jupyter/notebook/blob/main/docs/source/examples/Notebook/Running%20Code.ipynb .. Other python projects .. _matplotlib: https://matplotlib.org .. _nbviewer: https://nbviewer.jupyter.org .. _nbconvert: https://nbconvert.readthedocs.io/en/latest/ .. Other tools and projects .. _Markdown: https://daringfireball.net/projects/markdown/syntax .. _Rich Output: notebook_p5_ .. _notebook_p5: https://nbviewer.jupyter.org/github/ipython/ipython/blob/main/examples/IPython%20Kernel/Rich%20Output.ipynb .. _Plotting with Matplotlib: notebook_p3_ .. _notebook_p3: https://nbviewer.jupyter.org/github/ipython/ipython/blob/main/examples/IPython%20Kernel/Plotting%20in%20the%20Notebook.ipynb .. _Working with Markdown Cells: https://nbviewer.jupyter.org/github/jupyter/notebook/blob/main/docs/source/examples/Notebook/Working%20With%20Markdown%20Cells.ipynb ================================================ FILE: docs/source/migrate_to_notebook7.md ================================================ # Migrating _Updated 2023-05-17_ ```{warning} Version 7 of the Jupyter Notebook application might break your extensions or other customizations. Please read this page to find out if you need to take any actions to ensure a smooth, uninterrupted experience. ``` A major upgrade to the Jupyter Notebook interface is coming with Notebook 7! This upgrade will bring a heap of new features, but will also break backwards compatibility with many classic Notebook features and customizations. This set of guides is here to help you migrate your Classic Notebook setup and extensions to the new Notebook 7. ## What you need to do For users who don't use extensions or other customizations, you will seamlessly receive the new Notebook 7 when you `pip install notebook` once version 7 is released out of beta, along with all its new features, like realtime collaboration, debugger, and theming. For users who need to use extensions or other customizations, you have a couple of options: - Look for Notebook 7 compatible versions of the extensions you already use, and [find replacements for those that are not available] - If you need to maintain compatibility with the Classic Notebook for extensions or other customizations that are critical to your workflows, you can switch to [nbclassic], which will provide compatibility with the old notebook interface and support during an intermediate transition period to Notebook 7 ## Why a new version? For the past few years, the Classic Jupyter Notebook has been in maintenance mode. Development has mostly moved to alternative user interfaces like JupyterLab, which is a more modern and extensible web application. This has resulted in a lot of new features and improvements in JupyterLab, but also in a lot of new features and improvements that were not possible to integrate to the Classic Notebook. For a while, the plan was to progressively _sunset_ the Classic Notebook and not maintain it anymore. However, the Classic Notebook is still widely used and it is still the default user interface for Jupyter in many scenarios. Many users and organizations have not been able to switch to JupyterLab yet. For some users, JupyterLab can also be a more complex environment to use, especially for beginners. Following the feedback from the community, it was decided in late 2021 to continue developing the Jupyter Notebook application and _sunrise_ it as Notebook 7. You can find more details about the changes currently taking place in the Jupyter Ecosystem in the [JEP 79][jep 79] and [team-compass note]. ## New features in Notebook 7 ```{toctree} :maxdepth: 2 notebook_7_features.md ``` ## Migration Guides ```{toctree} :maxdepth: 2 migrating/frontend-extensions.md migrating/server-extensions.md migrating/server-imports.md migrating/custom-themes.md migrating/multiple-interfaces.md ``` [jep 79]: https://jupyter.org/enhancement-proposals/79-notebook-v7/notebook-v7.html [team-compass note]: https://github.com/jupyter/notebook-team-compass/issues/5#issuecomment-1085254000 [find replacements for those that are not available]: https://jupyter-notebook.readthedocs.io/en/latest/migrating/frontend-extensions.html#jupyterlab-equivalent-extensions-to-the-classic-notebook [nbclassic]: https://github.com/jupyter/nbclassic ================================================ FILE: docs/source/migrating/custom-themes.md ================================================ # Custom themes in Notebook 7 In Notebook 7, the way to create custom themes has changed. This means that custom themes developed for Notebook 6 or earlier will not work with Notebook 7 and upwards. This is for example the case for community contributed themes such as [jupyter-themes](https://github.com/dunovank/jupyter-themes). ## Using a custom theme Fortunately installing a custom theme for Notebook 7 is very easy. It is the same process as installing a regular extension. For example let's say you want to install the [JupyterLab Night](https://github.com/jupyterlab-contrib/jupyterlab-night) theme. You can do so by running the following command: ```bash pip install jupyterlab-night ``` Then refresh the page and you should see the new theme available in the settings menu: ![a screencast showing how to install a custom theme](https://user-images.githubusercontent.com/591645/229583076-de3c0541-246f-4781-8941-fcbec2204038.gif) There are already many themes available on [PyPI](https://pypi.org/search/?q=jupyterlab-theme). You can also find other themes using the `jupyterlab-theme` topic on GitHub: https://github.com/topics/jupyterlab-theme For example: - [https://github.com/johnnybarrels/jupyterlab_onedarkpro](https://github.com/johnnybarrels/jupyterlab_onedarkpro) - [https://github.com/dunovank/jupyterlab_legos_ui](https://github.com/dunovank/jupyterlab_legos_ui) - [https://github.com/timkpaine/jupyterlab_miami_nights](https://github.com/timkpaine/jupyterlab_miami_nights) ## Creating a custom theme Creating a custom theme for Notebook 7 follows the same process as creating a custom theme for JupyterLab 4. See the {ref}`Frontend Extension Guide ` to get you started. When creating the extension, select the `Theme` option in the cookiecutter prompt. ================================================ FILE: docs/source/migrating/frontend-extensions.md ================================================ # Frontend Extensions in Notebook 7 ```{warning} Any extension developed for Notebook \< 7 or NbClassic will not be compatible with Notebook 7 and upwards. Some extensions like nbgrader have already been ported. We invite you to check if the extensions you are using have already been ported. ``` You can check the following resources to see if your extension is available for Notebook 7: ## List of available Notebook 7 extensions To get an idea of the extensions available for Notebook 7, you can check the following resources: - [List of JupyterLab extensions][list of jupyterlab extensions] - [Awesome Jupyter][awesome jupyter] These resources are for JupyterLab, but many of them are compatible with Notebook 7 since Notebook 7 is based on JupyterLab. [list of jupyterlab extensions]: https://jupyterlab-contrib.github.io/extensions.html [awesome jupyter]: https://github.com/markusschanta/awesome-jupyter#jupyterlab-extensions ## JupyterLab equivalent extensions to the Classic Notebook The `jupyterlab-contrib` organization maintains a list of extensions to ease the transition from the Classic Notebook to Notebook 7 and / or JupyterLab. The list is available at the following URL: [Migrating from the Classic Notebook][migrate from classic] ![a screenshot showing extensions in classic and lab](https://user-images.githubusercontent.com/591645/229616855-94d34762-6666-4edd-a969-e85b285d7094.png) [migrate from classic]: https://jupyterlab-contrib.github.io/migrate_from_classical.html ================================================ FILE: docs/source/migrating/multiple-interfaces.md ================================================ # Simultaneous usage of different versions of Notebook 7 and the Classic Notebook UI With the release of Notebook 7, the classic Notebook UI is now available as a Jupyter Server extension, NbClassic. This means that NbClassic can be installed independently of Notebook 7, and can be also installed alongside Notebook 7. Below are different scenarios that you might consider when updating to Notebook 7. ## Try it on Binder You can try JupyterLab, Notebook 7 and NBClassic installed together using [this gist][lab-nb-nbclassic] on Binder: [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gist/jtpio/35a72862c8be13dee31b61ebac2d9786/master?urlpath=/tree) [lab-nb-nbclassic]: https://gist.github.com/jtpio/35a72862c8be13dee31b61ebac2d9786 ## Using the `Interface` dropdown Notebook 7 provides a dropdown menu to switch between the different user interfaces available on the same server. It is available in the Notebook toolbar: ![image](https://user-images.githubusercontent.com/591645/229729077-a91bc9dd-9bb9-4510-a266-599bf2f97745.png) ```{note} This dropdown is only available when using Notebook 7 or JupyterLab. It is not displayed when using NbClassic. ``` ## NbClassic and Notebook 7 You can install NbClassic, Notebook 7 and JupyterLab, all three of which will provide different user interfaces on the same server. When Notebook 7 is available, the NbClassic UI, will be served at the `/nbclassic/tree` base path rather than the base path `/tree` used otherwise. If you are using Notebook 7 along with NbClassic, you will also have JupyterLab installed as it is a dependency of Notebook 7, and these front ends will be available through the following base paths: JupyterLab at `/lab`, Notebook 7 at `/tree`, and NbClassic at `/nbclassic/tree`. ## NbClassic and Notebook 6.5.x As NbClassic provides the static assets for Notebook 6.5.x, while having both installed should cause no issues, the user interface provided by these two packages will be the same. These UIs will be served by different back end servers. An NbClassic instance will be at a server with the `/tree` path and opening a Notebook 6.5.x instance will open on a different server with the `/tree` path as well, presenting the same static assets. When starting an instance of JupyterLab you will be able to access the classic view of Notebook with NbClassic served on the same server at `/tree`. ## NbClassic and Notebook \<= 6.4.x When using NbClassic and Notebook \<= 6.4.x you can expect that these UIs will not be only presented at different servers, meaning they will both be available at their respective server under `/tree` but they may also differ as potential changes to the NbClassic UI will not be reflected in Notebook versions \<= 6.4.x. In this case as well, you would be able to access the classic view of Notebook with NbClassic served on the same server, at `/tree`. ## NbClassic and JupyterLab 3.x When only JupyterLab 3.x is installed, then NbClassic does not have to be explicitly installed as JupyterLab 3.x depends on it. They will run on the same server, and are reachable via `/tree` for NbClassic and `/lab` for JupyterLab. ## NbClassic and JupyterLab 4.x When only JupyterLab 4.x is installed, then NbClassic has to be installed explicitly. They will run on the same server, and are reachable via `/tree` for NbClassic, and `/lab` for JupyterLab. ## NbClassic Independently When you choose to install only NbClassic via `pip install nbclassic`, the classic Notebook UI will be presented at the `/tree` path. As the other frontends are not installed, attempting to access the other paths will return errors. Note that NbClassic being a Jupyter Server extension, indicated Jupyter Server will be available. This provides an additional way to view the NbClassic frontend. You would be able to manually enable the extension when running an instance of Jupyter Server, `> jupyter server --ServerApp.jpserver_extensions="nbclassic=True"`, which will provide the NbClassic frontend at `/tree` path when visited. ================================================ FILE: docs/source/migrating/server-extensions.md ================================================ # Server Extensions in Notebook 7 Notebook 7 is now based on Jupyter Server, which is a new server application that allows to run multiple Jupyter applications (e.g. Notebook, JupyterLab, NBClassic, etc.) on the same server. This means that Notebook 7 is able to reuse many of the existing server extensions from the Jupyter ecosystem as is. ## Migration from the Notebook Server The Jupyter Server documentation provides a [guide for migrating from the classic notebook server to Jupyter Server](https://jupyter-server.readthedocs.io/en/latest/operators/migrate-from-nbserver.html) ## Authoring Server Extensions The Jupyter Server documentation provides a [guide for authoring server extensions](https://jupyter-server.readthedocs.io/en/latest/developers/extensions.html) ================================================ FILE: docs/source/migrating/server-imports.md ================================================ # Server Imports in Notebook 7 Notebook 7 is now based on Jupyter Server, which lets users run multiple Jupyter frontends (e.g. Notebook, JupyterLab, NBClassic, etc.) on the same server. Prior to Notebook 7, the Classic Notebook server included the server modules in the `notebook` package. This means it was possible to import the server modules from the `notebook` package, for example: ```python from notebook.auth import passwd passwd("foo") ``` Or: ```python from notebook import notebookapp notebookapp.list_running_servers() ``` In Notebook 7, these server modules are now exposed by the `jupyter_server` package. The code snippets above should be updated to: ```python from jupyter_server.auth import passwd passwd("foo") ``` And: ```python from jupyter_server import serverapp serverapp.list_running_servers() ``` These are just examples, so you may have to adjust your use of `notebook` imports based on the specific server modules you were using. ================================================ FILE: docs/source/notebook.md ================================================ (htmlnotebook)= # The Jupyter Notebook ## Introduction **Jupyter Notebook** is a notebook authoring application, under the [Project Jupyter](https://docs.jupyter.org/en/latest/) umbrella. Built on the power of the [computational notebook format](https://docs.jupyter.org/en/latest/#what-is-a-notebook), **Jupyter Notebook** offers fast, interactive new ways to prototype and explain your code, explore and visualize your data, and share your ideas with others. Notebooks extend the console-based approach to interactive computing in a qualitatively new direction, providing a web-based application suitable for capturing the whole computation process: developing, documenting, and executing code, as well as communicating the results. The Jupyter notebook combines two components: **A web application:** A browser-based editing program for interactive authoring of computational notebooks which provides a fast interactive environment for prototyping and explaining code, exploring and visualizing data, and sharing ideas with others **Computational Notebook documents**: A shareable document that combines computer code, plain language descriptions, data, rich visualizations like 3D models, charts, mathematics, graphs and figures, and interactive controls ```{seealso} See the {ref}`installation guide ` on how to install the notebook and its dependencies. ``` ### Main features of the web application - In-browser editing for code, with automatic syntax highlighting, indentation, and tab completion/introspection. - The ability to execute code from the browser, with the results of computations attached to the code which generated them. - Displaying the result of computation using rich media representations, such as HTML, LaTeX, PNG, SVG, etc. For example, publication-quality figures rendered by the [matplotlib] library, can be included inline. - In-browser editing for rich text using the [Markdown] markup language, which can provide commentary for the code, is not limited to plain text. - The ability to easily include mathematical notation within markdown cells using LaTeX, and rendered natively by [MathJax]. ### Notebook documents Notebook documents contain the inputs and outputs of an interactive session as well as additional text that accompanies the code but is not meant for execution. In this way, notebook files can serve as a complete computational record of a session, interleaving executable code with explanatory text, mathematics, and rich representations of resulting objects. These documents are internally [JSON] files and are saved with the `.ipynb` extension. Since JSON is a plain text format, they can be version-controlled and shared with colleagues. Notebooks may be exported to a range of static formats, including HTML (for example, for blog posts), reStructuredText, LaTeX, PDF, and slide shows, via the [nbconvert] command. Furthermore, any `.ipynb` notebook document available from a public URL can be shared via the Jupyter Notebook Viewer \. This service loads the notebook document from the URL and renders it as a static web page. The results may thus be shared with a colleague, or as a public blog post, without other users needing to install the Jupyter notebook themselves. In effect, nbviewer is simply [nbconvert] as a web service, so you can do your own static conversions with nbconvert, without relying on nbviewer. ```{seealso} {ref}`Details on the notebook JSON file format ` ``` ### Notebooks and privacy Because you use Jupyter in a web browser, some people are understandably concerned about using it with sensitive data. However, if you followed the standard [install instructions](https://jupyter.readthedocs.io/en/latest/install.html), Jupyter is actually running on your own computer. If the URL in the address bar starts with `http://localhost:` or `http://127.0.0.1:`, it's your computer acting as the server. Jupyter doesn't send your data anywhere else—and as it's open source, other people can check that we're being honest about this. You can also use Jupyter remotely: your company or university might run the server for you, for instance. If you want to work with sensitive data in those cases, talk to your IT or data protection staff about it. We aim to ensure that other pages in your browser or other users on the same computer can't access your notebook server. See the [security documentation](https://jupyter-server.readthedocs.io/en/stable/operators/security.html) for more about this. ## Starting the notebook server You can start running a notebook server from the command line using the following command: ``` jupyter notebook ``` This will print some information about the notebook server in your console, and open a web browser to the URL of the web application (by default, `http://127.0.0.1:8888`). The landing page of the Jupyter notebook web application, the **dashboard**, shows the notebooks currently available in the notebook directory (by default, the directory from which the notebook server was started). You can create new notebooks from the dashboard with the `New Notebook` button, or open existing ones by clicking on their name. You can also drag and drop `.ipynb` notebooks and standard `.py` Python source code files into the notebook list area. When starting a notebook server from the command line, you can also open a particular notebook directly, bypassing the dashboard, with `jupyter notebook my_notebook.ipynb`. The `.ipynb` extension is assumed if no extension is given. When you are inside an open notebook, the `File | Open...` menu option will open the dashboard in a new browser tab, to allow you to open another notebook from the notebook directory or to create a new notebook. ```{note} You can start more than one notebook server at the same time, if you want to work on notebooks in different directories. By default the first notebook server starts on port 8888, and later notebook servers search for ports near that one. You can also manually specify the port with the `--port` option. ``` ### Creating a new notebook document A new notebook may be created at any time, either from the dashboard, or using the {menuselection}`File --> New` menu option from within an active notebook. The new notebook is created within the same directory and will open in a new browser tab. It will also be reflected as a new entry in the notebook list on the dashboard. ![a screencast showing how to create new notebooks from the user interface](https://user-images.githubusercontent.com/591645/229563554-2776b489-a831-44a0-a7a2-2f211e38b78b.gif) ### Opening notebooks An open notebook has **exactly one** interactive session connected to a kernel, which will execute code sent by the user and communicate back results. This kernel remains active if the web browser window is closed, and reopening the same notebook from the dashboard will reconnect the web application to the same kernel. In the dashboard, notebooks with an active kernel have a `Shutdown` button next to them, whereas notebooks without an active kernel have a `Delete` button in its place. Other clients may connect to the same kernel. When each kernel is started, the notebook server prints to the terminal a message like this: ``` [JupyterNotebookApp] Kernel started: 87f7d2c0-13e3-43df-8bb8-1bd37aaf3373 ``` This long string is the kernel's ID which is sufficient for getting the information necessary to connect to the kernel. If the notebook uses the IPython kernel, you can also see this connection data by running the `%connect_info` {ref}`magic `, which will print the same ID information along with other details. You can then, for example, manually start a Qt console connected to the _same_ kernel from the command line, by passing a portion of the ID: ``` $ jupyter qtconsole --existing 87f7d2c0 ``` Without an ID, `--existing` will connect to the most recently started kernel. With the IPython kernel, you can also run the `%qtconsole` {ref}`magic ` in the notebook to open a Qt console connected to the same kernel. ```{seealso} {ref}`ipythonzmq` ``` ## Notebook user interface When you create a new notebook document, you will be presented with the **notebook name**, a **menu bar**, a **toolbar** and an empty **code cell**. ![a screenshot showing a blank notebook](https://user-images.githubusercontent.com/591645/229563988-8e3a4d04-6f31-4411-9a6b-9b9b045bc55e.png) **Notebook name**: The name displayed at the top of the page, next to the Jupyter logo, reflects the name of the `.ipynb` file. Clicking on the notebook name brings up a dialog which allows you to rename it. Thus, renaming a notebook from "Untitled0" to "My first notebook" in the browser, renames the `Untitled0.ipynb` file to `My first notebook.ipynb`. **Menu bar**: The menu bar presents different options that may be used to manipulate the way the notebook functions. **Toolbar**: The tool bar gives a quick way of performing the most-used operations within the notebook, by clicking on an icon. **Code cell**: the default type of cell; read on for an explanation of cells. ## Structure of a notebook document The notebook consists of a sequence of cells. A cell is a multiline text input field, and its contents can be executed by using {kbd}`Shift-Enter`, or by clicking either the "Play" button the toolbar, or {guilabel}`Cell`, {guilabel}`Run` in the menu bar. The execution behavior of a cell is determined by the cell's type. There are three types of cells: **code cells**, **markdown cells**, and **raw cells**. Every cell starts off being a **code cell**, but its type can be changed by using a drop-down on the toolbar (which will be "Code", initially), or via {ref}`keyboard shortcuts `. For more information on the different things you can do in a notebook, see the [collection of examples](https://nbviewer.jupyter.org/github/jupyter/notebook/tree/main/docs/source/examples/Notebook/). ### Code cells A _code cell_ allows you to edit and write new code, with full syntax highlighting and tab completion. The programming language you use depends on the _kernel_, and the default kernel (IPython) runs Python code. When a code cell is executed, code that it contains is sent to the kernel associated with the notebook. The results that are returned from this computation are then displayed in the notebook as the cell's _output_. The output is not limited to text, with many other possible forms of output are also possible, including `matplotlib` figures and HTML tables (as used, for example, in the `pandas` data analysis package). This is known as IPython's _rich display_ capability. ```{seealso} [Rich Output] example notebook ``` ### Markdown cells You can document the computational process in a literate way, alternating descriptive text with code, using _rich text_. In IPython this is accomplished by marking up text with the Markdown language. The corresponding cells are called _Markdown cells_. The Markdown language provides a simple way to perform this text markup, that is, to specify which parts of the text should be emphasized (italics), bold, form lists, etc. If you want to provide structure for your document, you can use markdown headings. Markdown headings consist of 1 to 6 hash # signs `#` followed by a space and the title of your section. The markdown heading will be converted to a clickable link for a section of the notebook. It is also used as a hint when exporting to other document formats, like PDF. When a Markdown cell is executed, the Markdown code is converted into the corresponding formatted rich text. Markdown allows arbitrary HTML code for formatting. Within Markdown cells, you can also include _mathematics_ in a straightforward way, using standard LaTeX notation: `$...$` for inline mathematics and `$$...$$` for displayed mathematics. When the Markdown cell is executed, the LaTeX portions are automatically rendered in the HTML output as equations with high quality typography. This is made possible by [MathJax], which supports a [large subset](https://docs.mathjax.org/en/latest/input/tex/index.html) of LaTeX functionality Standard mathematics environments defined by LaTeX and AMS-LaTeX (the `amsmath` package) also work, such as `\begin{equation}...\end{equation}`, and `\begin{align}...\end{align}`. New LaTeX macros may be defined using standard methods, such as `\newcommand`, by placing them anywhere _between math delimiters_ in a Markdown cell. These definitions are then available throughout the rest of the IPython session. ```{seealso} [Working with Markdown Cells] example notebook ``` ### Raw cells _Raw_ cells provide a place in which you can write _output_ directly. Raw cells are not evaluated by the notebook. When passed through [nbconvert], raw cells arrive in the destination format unmodified. For example, you can type full LaTeX into a raw cell, which will only be rendered by LaTeX after conversion by nbconvert. ## Basic workflow The normal workflow in a notebook is, then, quite similar to a standard IPython session, with the difference that you can edit cells in-place multiple times until you obtain the desired results, rather than having to rerun separate scripts with the `%run` magic command. Typically, you will work on a computational problem in pieces, organizing related ideas into cells and moving forward once previous parts work correctly. This is much more convenient for interactive exploration than breaking up a computation into scripts that must be executed together, as was previously necessary, especially if parts of them take a long time to run. To interrupt a calculation which is taking too long, use the {guilabel}`Kernel`, {guilabel}`Interrupt` menu option, or the {kbd}`i,i` keyboard shortcut. Similarly, to restart the whole computational process, use the {guilabel}`Kernel`, {guilabel}`Restart` menu option or {kbd}`0,0` shortcut. A notebook may be downloaded as a `.ipynb` file or converted to a number of other formats using the menu option {guilabel}`File`, {guilabel}`Download as`. ```{seealso} [Running Code in the Jupyter Notebook] example notebook [Notebook Basics] example notebook ``` (keyboard-shortcuts)= ### Keyboard shortcuts All actions in the notebook can be performed with the mouse, but keyboard shortcuts are also available for the most common ones. The essential shortcuts to remember are the following: - {kbd}`Shift-Enter`: run cell : Execute the current cell, show any output, and jump to the next cell below. If {kbd}`Shift-Enter` is invoked on the last cell, it makes a new cell below. This is equivalent to clicking the {guilabel}`Cell`, {guilabel}`Run` menu item, or the Play button in the toolbar. - {kbd}`Esc`: Command mode : In command mode, you can navigate around the notebook using keyboard shortcuts. - {kbd}`Enter`: Edit mode : In edit mode, you can edit text in cells. For the full list of available shortcuts, click {guilabel}`Help`, {guilabel}`Keyboard Shortcuts` in the notebook menus. ## Searching Jupyter Notebook has an advanced built-in search plugin for finding text within a notebook or other document, which uses the {kbd}`Ctrl-F` ({kbd}`Cmd+F` for macOS) shortcut by default. Your browser's `find` function will give unexpected results because it doesn't have access to the full content of a document (by default), but you can still use your browser find function from the browser menu if you want, or you can disable the built-in search shortcut using the Advanced Settings Editor. Alternatively, you can disable windowed notebook rendering to expose the full document content to the browser at the expense of performance. ## Plotting One major feature of the Jupyter notebook is the ability to display plots that are the output of running code cells. The IPython kernel is designed to work seamlessly with the [matplotlib] plotting library to provide this functionality. Specific plotting library integration is a feature of the kernel. ## Installing kernels For information on how to install a Python kernel, refer to the [IPython install page](https://ipython.org/install). The Jupyter wiki has a long list of [Kernels for other languages](https://github.com/jupyter/jupyter/wiki/Jupyter-kernels). They usually come with instructions on how to make the kernel available in the notebook. (signing-notebooks)= ## Trusting Notebooks To prevent untrusted code from executing on users' behalf when notebooks open, we store a signature of each trusted notebook. The notebook server verifies this signature when a notebook is opened. If no matching signature is found, Javascript and HTML output will not be displayed until they are regenerated by re-executing the cells. Any notebook that you have fully executed yourself will be considered trusted, and its HTML and Javascript output will be displayed on load. If you need to see HTML or Javascript output without re-executing, and you are sure the notebook is not malicious, you can tell Jupyter to trust it at the command-line with: ``` $ jupyter trust mynotebook.ipynb ``` See the [security documentation](https://jupyter-server.readthedocs.io/en/stable/operators/security.html) for more details about the trust mechanism. ## Browser Compatibility The Jupyter Notebook aims to support the latest versions of these browsers: - Chrome - Safari - Firefox Up to date versions of Opera and Edge may also work, but if they don't, please use one of the supported browsers. Using Safari with HTTPS and an untrusted certificate is known to not work (websockets will fail). ```{eval-rst} .. include:: links.txt ``` [json]: https://en.wikipedia.org/wiki/JSON [mathjax]: https://www.mathjax.org/ ================================================ FILE: docs/source/notebook_7_features.md ================================================ # New features in Notebook 7 This document describes the new features in Notebook 7 as originally mentioned in the related Jupyter Enhancement Proposal [JEP 79][jep 79]. ```{contents} Table of Contents :depth: 3 :local: ``` ## Debugger Notebook 7 includes a new debugger that allows you to step through your code cell by cell. You can also set breakpoints and inspect variables. ![a screenshot of the debugger](https://user-images.githubusercontent.com/591645/195543524-e16647a1-a4e0-4832-929d-73d5a77ef001.png) ## Real Time collaboration Notebook 7 allows for using the real time collaboration extension so you can share your notebook with other users and edit it in real time. The Real Time Collaboration feature is the same as in JupyterLab and is available as a JupyterLab extension. It is not enabled by default, but you can install with `pip`: ```bash pip install jupyter-collaboration ``` or with `conda`: ```bash conda install -c conda-forge jupyter-collaboration ``` After installing the extension, restart the Jupyter Server so the extension can be loaded. ```{note} It is possible for two users to work on the same notebook using Notebook 7 or JupyterLab. ``` ![a screencast showing how users can collaborate on the same document with both Notebook 7 and JupyterLab](https://user-images.githubusercontent.com/591645/229854102-6eed73f4-587f-406e-8ed1-347b788da9ee.gif) ## Table of Contents Notebook 7 includes a new table of contents extension that allows you to navigate through your notebook using a sidebar. The Table of Contents is built-in and enabled by default, just like in JupyterLab. ![a screenshot of the table of contents](https://user-images.githubusercontent.com/591645/195544813-22e7dec9-846f-4aaa-913a-36a9ed908036.png) ## Theming and Dark Mode A Dark Theme is now available in the Jupyter Notebook by default. You can also install other themes as JupyterLab extensions. ![a screenshot of the dark theme](https://user-images.githubusercontent.com/591645/229732821-3ab15024-e6d7-414d-94ca-246619da4b67.png) You can also install many other JupyterLab themes. For example to install the [JupyterLab Night](https://github.com/martinRenou/jupyterlab-night) theme: ```shell pip install jupyterlab-night ``` Then refresh the page and select the new theme in the settings: ![a screenshot of a custom theme](https://user-images.githubusercontent.com/591645/229733418-db0898b3-7e8c-4db5-98d6-2e9f813ab9e9.png) ## Internationalization Notebook 7 now provides the ability to set the display language of the user interface. Users will need to install the language pack as a separate Python package. Language packs are grouped in the [language packs repository on GitHub](https://github.com/jupyterlab/language-packs/), and can be installed with `pip`. For example, it is possible to install the language pack for French (France) using the following command: ```shell pip install jupyterlab-language-pack-fr-FR ``` After installing the language pack, reload the page and the new language should be available in the settings. ![a screencast showing how to switch the display language in Notebook 7](https://user-images.githubusercontent.com/591645/229734057-e08a2020-58c1-4aa5-b30e-ebb83fcde12c.gif) ```{note} Notebook 7 and JupyterLab share the same language packs, so it is possible to use the same language pack in both applications. ``` ## Accessibility Improvements The text editor underlying the Jupyter Notebook (CodeMirror 5) had major accessibility issues. Fortunately, this accessibility bottleneck has been unblocked as JupyterLab has been upgraded to use CodeMirror 6, a complete rewrite of the text editor with a strong focus on accessibility. Although this upgrade required extensive codebase modifications, the changes is available with JupyterLab 4. By being built on top of JupyterLab, Jupyter Notebook 7 directly benefits from the CodeMirror 6 upgrade. ## Support for many JupyterLab extensions Notebook 7 is based on JupyterLab and therefore supports many of the existing JupyterLab extensions. You can install JupyterLab extensions with `pip` or `conda`. For example to install the LSP (Language Server Protocol) extension for enhanced code completion, you can use the following commands: ```bash pip install jupyter-lsp ``` ```bash conda install -c conda-forge jupyter-lsp ``` Popular extensions like `nbgrader` and `RISE` have already been ported to work with Notebook 7. ### nbgrader ```{note} The nbgrader extension is still under active development and a version compatible with Notebook 7 is not yet available on PyPI. However a version compatible with Notebook 7 will be available before the final release of Notebook 7. ``` ![a screenshot showing the nbgrader extension in Notebook 7](https://user-images.githubusercontent.com/32258950/196110653-6556c8d7-b169-4586-b1a1-66b3be05c790.png) ![a second screenshot showing the nbgrader extension in Notebook 7](https://user-images.githubusercontent.com/32258950/196110825-7e3b9237-1064-42be-a629-15a5510a3aee.png) ### RISE The RISE extension is another popular JupyterLab extension that has been ported to work with Notebook 7. It allows you to turn your Jupyter Notebooks into a slideshow. See the [installation instructions](https://github.com/jupyterlab-contrib/rise#install). ## A document-centric user experience Despite all the new features and as stated in [JEP 79][jep 79], Notebook 7 keeps the document-centric user experience of the Classic Notebook: > The Jupyter Notebook application offers a document-centric user experience. That is, in the Notebook application, the landing page that contains a file manager, running tools tab, and a few optional extras, is a launching point into opening standalone, individual documents. This document-centric experience is important for many users, and that is the first key point this proposal aims to preserve. Notebook v7 will be based on a different JavaScript implementation than v6, but it will preserve the document-centric experience, where each individual notebook opens in a separate browser tab and the visible tools and menus are focused on the open document. [jep 79]: https://jupyter.org/enhancement-proposals/79-notebook-v7/notebook-v7.html ## Compact View on Mobile Devices Notebook 7 automatically switches to a more compact layout on mobile devices, making it convenient to run code on the go. ![a screenshot of the compact view on mobile devices](https://user-images.githubusercontent.com/591645/101995448-2793f380-3cca-11eb-8971-067dd068ccbe.gif) ## References This was just a quick overview of the new features in Notebook 7. For more details, you can check out the following resources: - The [JupyterLab Documentation](https://jupyterlab.readthedocs.io/en/latest/) is a great resource to learn more about JupyterLab and the extensions available. Since Notebook 7 is based on JupyterLab, many of the features and extensions available for JupyterLab are also available for Notebook 7. - [Migration Guide](./migrate_to_notebook7.md) for Notebook 7, which explains how to migrate from the Classic Notebook to Notebook 7. ================================================ FILE: docs/source/spelling_wordlist.txt ================================================ AMS API api args async auth autodetect Broullón changelog config coroutines css CSS dockerfile Dockerfile drop-down filenames filesystem front-end front end frontend github GitHub IFrame iframe ip IP IPython javascript JavaScript jinja jinja2 Jinja js jupyter Jupyter Kamens keepalive LaTeX localhost login logout mathjax MathJax matplotlib menubar metadata minify minified multiline natively nbviewer pre prerelease Quantopian repo reStructuredText subclasses subdirectory subprocesses startup symlink uncomment unencrypted unicode Unicode untracked untrusted URL url username webserver websockets workflow ================================================ FILE: docs/source/template.tpl ================================================ {%- extends 'rst.tpl' -%} {% macro notebooklink() -%} `View the original notebook on nbviewer `__ {%- endmacro %} {%- block header %} {{ notebooklink() }} {% endblock header -%} {%- block footer %} {{ notebooklink() }} {% endblock footer -%} {% block markdowncell scoped %} {{ cell.source | markdown2rst | replace(".ipynb>", ".html>") }} {% endblock markdowncell %} ================================================ FILE: docs/source/troubleshooting.md ================================================ # What to do when things go wrong First, have a look at the common problems listed below. If you can figure it out from these notes, it will be quicker than asking for help. Check that you have the latest version of any packages that look relevant. Unfortunately it's not always easy to figure out what packages are relevant, but if there was a bug that's already been fixed, it's easy to upgrade and get on with what you wanted to do. ## Jupyter fails to start - Have you [installed it](https://jupyter.org/install.html)? ;-) - If you're using a menu shortcut or Anaconda launcher to start it, try opening a terminal or command prompt and running the command `jupyter notebook`. - If it can't find `jupyter`, you may need to configure your `PATH` environment variable. If you don't know what that means, and don't want to find out, just (re)install Anaconda with the default settings, and it should set up PATH correctly. - If Jupyter gives an error that it can't find `notebook`, check with pip or conda that the `notebook` package is installed. - Try running `jupyter-notebook` (with a hyphen). This should normally be the same as `jupyter notebook` (with a space), but if there's any difference, the version with the hyphen is the 'real' launcher, and the other one wraps that. ## Jupyter doesn't load or doesn't work in the browser - Try in another browser (e.g. if you normally use Firefox, try with Chrome). This helps pin down where the problem is. - Try disabling any browser extensions and/or any Jupyter extensions you have installed. - Some internet security software can interfere with Jupyter. If you have security software, try turning it off temporarily, and look in the settings for a more long-term solution. - In the address bar, try changing between `localhost` and `127.0.0.1`. They should be the same, but in some cases it makes a difference. ## Jupyter can't start a kernel Files called _kernel specs_ tell Jupyter how to start different kinds of kernels. To see where these are on your system, run `jupyter kernelspec list`: ``` $ jupyter kernelspec list Available kernels: python3 /home/takluyver/.local/lib/python3.6/site-packages/ipykernel/resources bash /home/takluyver/.local/share/jupyter/kernels/bash ir /home/takluyver/.local/share/jupyter/kernels/ir ``` There's a special fallback for the Python kernel: if it doesn't find a real kernelspec, but it can import the `ipykernel` package, it provides a kernel which will run in the same Python environment as the notebook server. A path ending in `ipykernel/resources`, like in the example above, is this default kernel. The default often does what you want, so if the `python3` kernelspec points somewhere else and you can't start a Python kernel, try deleting or renaming that kernelspec folder to expose the default. If your problem is with another kernel, not the Python one we maintain, you may need to look for support about that kernel. ## Python Environments Multiple python environments, whether based on Anaconda or Python Virtual environments, are often the source of reported issues. In many cases, these issues stem from the Notebook server running in one environment, while the kernel and/or its resources, derive from another environment. Indicators of this scenario include: - `import` statements within code cells producing `ImportError` or `ModuleNotFound` exceptions. - General kernel startup failures exhibited by nothing happening when attempting to execute a cell. In these situations, take a close look at your environment structure and ensure all packages required by your notebook's code are installed in the correct environment. If you need to run the kernel from different environments than your Notebook server, check out [IPython's documentation](https://ipython.readthedocs.io/en/stable/install/kernel_install.html#kernels-for-different-environments) for using kernels from different environments as this is the recommended approach. Anaconda's [nb_conda_kernels](https://github.com/Anaconda-Platform/nb_conda_kernels) package might also be an option for you in these scenarios. Another thing to check is the `kernel.json` file that will be located in the aforementioned _kernel specs_ directory identified by running `jupyter kernelspec list`. This file will contain an `argv` stanza that includes the actual command to run when launching the kernel. Oftentimes, when reinstalling python environments, a previous `kernel.json` will reference an python executable from an old or non-existent location. As a result, it's always a good idea when encountering kernel startup issues to validate the `argv` stanza to ensure all file references exist and are appropriate. ## Windows Systems Although Jupyter Notebook is primarily developed on the various flavors of the Unix operating system it also supports Microsoft Windows - which introduces its own set of commonly encountered issues, particularly in the areas of security, process management and lower-level libraries. ### pywin32 Issues The primary package for interacting with Windows' primitives is `pywin32`. - Issues surrounding the creation of the kernel's communication file utilize `jupyter_core`'s `secure_write()` function. This function ensures a file is created in which only the owner of the file has access. If libraries like `pywin32` are not properly installed, issues can arise when it's necessary to use the native Windows libraries. Here's a portion of such a traceback: ``` File "c:\users\jovyan\python\myenv.venv\lib\site-packages\jupyter_core\paths.py", line 424, in secure_write win32_restrict_file_to_user(fname) File "c:\users\jovyan\python\myenv.venv\lib\site-packages\jupyter_core\paths.py", line 359, in win32_restrict_file_to_user import win32api ImportError: DLL load failed: The specified module could not be found. ``` - As noted earlier, the installation of `pywin32` can be problematic on Windows configurations. When such an issue occurs, you may need to revisit how the environment was setup. Pay careful attention to whether you're running the 32 or 64 bit versions of Windows and be sure to install appropriate packages for that environment. Here's a portion of such a traceback: ``` File "C:\Users\jovyan\AppData\Roaming\Python\Python37\site-packages\jupyter_core\paths.py", line 435, in secure_write win32_restrict_file_to_user(fname) File "C:\Users\jovyan\AppData\Roaming\Python\Python37\site-packages\jupyter_core\paths.py", line 361, in win32_restrict_file_to_user import win32api ImportError: DLL load failed: %1 is not a valid Win32 application ``` #### Resolving pywin32 Issues > In this case, your `pywin32` module may not be installed correctly and the following > should be attempted: > > ``` > pip install --upgrade pywin32 > ``` > > or: > > ``` > conda install --force-reinstall pywin32 > ``` > > followed by: > > ``` > python.exe Scripts/pywin32_postinstall.py -install > ``` > > where `Scripts` is located in the active Python's installation location. - Another common failure specific to Windows environments is the location of various python commands. On `*nix` systems, these typically reside in the `bin` directory of the active Python environment. However, on Windows, these tend to reside in the `Scripts` folder - which is a sibling to `bin`. As a result, when encountering kernel startup issues, again, check the `argv` stanza and verify it's pointing to a valid file. You may find that it's pointing in `bin` when `Scripts` is correct, or the referenced file does not include its `.exe` extension - typically resulting in `FileNotFoundError` exceptions. ## This Worked An Hour Ago The Jupyter stack is very complex and rightfully so, there's a lot going on. On occasion you might find the system working perfectly well, then, suddenly, you can't get past a certain cell due to `import` failures. In these situations, it's best to ask yourself if any new python files were added to your notebook development area. These issues are usually evident by carefully analyzing the traceback produced in the notebook error or the Notebook server's command window. In these cases, you'll typically find the Python kernel code (from `IPython` and `ipykernel`) performing _its_ imports and notice a file from your Notebook development error included in that traceback followed by an `AttributeError`: ``` File "C:\Users\jovyan\anaconda3\lib\site-packages\ipykernel\connect.py", line 13, in from IPython.core.profiledir import ProfileDir File "C:\Users\jovyan\anaconda3\lib\site-packages\IPython_init.py", line 55, in from .core.application import Application ... File "C:\Users\jovyan\anaconda3\lib\site-packages\ipython_genutils\path.py", line 13, in import random File "C:\Users\jovyan\Desktop\Notebooks\random.py", line 4, in rand_set = random.sample(english_words_lower_set, 12) AttributeError: module 'random' has no attribute 'sample' ``` What has happened is that you have named a file that conflicts with an installed package that is used by the kernel software and now introduces a conflict preventing the kernel's startup. **Resolution**: You'll need to rename your file. A best practice would be to prefix or _namespace_ your files so as not to conflict with any python package. ## Asking for help As with any problem, try searching to see if someone has already found an answer. If you can't find an existing answer, you can ask questions at: - The [Jupyter Discourse Forum](https://discourse.jupyter.org/) - The [jupyter-notebook tag on Stackoverflow](https://stackoverflow.com/questions/tagged/jupyter-notebook) - Peruse the [jupyter/help repository on Github](https://github.com/jupyter/help) (read-only) - Or in an issue on another repository, if it's clear which component is responsible. Typical repositories include: > - [jupyter_core](https://github.com/jupyter/jupyter_core) - `secure_write()` > and file path issues > - [jupyter_client](https://github.com/jupyter/jupyter_client) - kernel management > issues found in Notebook server's command window. > - [IPython](https://github.com/ipython/ipython) and > [ipykernel](https://github.com/ipython/ipykernel) - kernel runtime issues > typically found in Notebook server's command window and/or Notebook cell execution. ### Gathering Information Should you find that your problem warrants that an issue be opened in [notebook](https://github.com/jupyter/notebook) please don't forget to provide details like the following: - What error messages do you see (within your notebook and, more importantly, in the Notebook server's command window)? - What platform are you on? - How did you install Jupyter? - What have you tried already? The `jupyter troubleshoot` command collects a lot of information about your installation, which can also be useful. When providing textual information, it's most helpful if you can _scrape_ the contents into the issue rather than providing a screenshot. This enables others to select pieces of that content so they can search more efficiently and try to help. Remember that it's not anyone's job to help you. We want Jupyter to work for you, but we can't always help everyone individually. ================================================ FILE: docs/source/ui_components.md ================================================ # User interface components When opening bug reports or sending emails to the Jupyter mailing list, it is useful to know the names of different UI components so that other developers and users have an easier time helping you diagnose your problems. This section will familiarize you with the names of UI elements within the Notebook and the different Notebook modes. ## Notebook Dashboard When you launch `jupyter notebook` the first page that you encounter is the Notebook Dashboard. ![a screenshot showing the jupyter notebook dashboard page](https://user-images.githubusercontent.com/591645/229564680-3e9a9031-e925-4008-833c-a478b3e96c97.png) ## Notebook Editor Once you've selected a Notebook to edit, the Notebook will open in the Notebook Editor. ![a screenshot showing the default notebook interface](https://user-images.githubusercontent.com/591645/229564924-7a76bed6-924a-45ff-9ac7-6ec6d99930b7.png) ## Interactive User Interface Tour of the Notebook If you would like to learn more about the specific elements within the Notebook Editor, you can go through the user interface tour by selecting _Help_ in the menubar then selecting _User Interface Tour_. ### Edit Mode and Notebook Editor When a cell is in edit mode, the Cell Mode Indicator will change to reflect the cell's state. This state is indicated by a small pencil icon on the top right of the interface. When the cell is in command mode, there is no icon in that location. ![a screenshot showing a notebook with some cells in edit mode](https://user-images.githubusercontent.com/591645/229565074-34e61454-3329-4612-b483-7a52663c794b.png) ## File Editor Now let's say that you've chosen to open a Markdown file instead of a Notebook file whilst in the Notebook Dashboard. If so, the file will be opened in the File Editor. ![a screenshot showing the file editor](https://user-images.githubusercontent.com/591645/229565182-254eef80-edfb-4e2c-b454-1c978fd89f13.png) ================================================ FILE: docs/source/user-documentation.md ================================================ # Documentation Use this page to navigate to different parts of the user documentation. ```{toctree} :maxdepth: 2 notebook ui_components notebook_7_features examples/Notebook/examples_index.rst custom_css configuring/plugins configuring/interface_customization troubleshooting changelog ``` ================================================ FILE: eslint.config.mjs ================================================ import js from '@eslint/js'; import { defineConfig } from 'eslint/config'; import tseslint from 'typescript-eslint'; import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; import jestPlugin from 'eslint-plugin-jest'; import reactPlugin from 'eslint-plugin-react'; import globals from 'globals'; export default defineConfig([ { ignores: [ 'node_modules/**', '**/build/**', '**/lib/**', '**/node_modules/**', '**/mock_packages/**', '**/static/**', '**/typings/**', '**/schemas/**', '**/themes/**', 'coverage/**', '**/*.map.js', '**/*.bundle.js', 'app/index.template.js', '.idea/**', '.history/**', '.vscode/**', '.pixi/**', '.venv/**', 'docs/**', '**/*.js', ], }, js.configs.recommended, tseslint.configs.recommended, { settings: { react: { version: 'detect', }, }, }, reactPlugin.configs.flat.recommended, jestPlugin.configs['flat/recommended'], { files: ['**/*.{ts,tsx}'], plugins: { jest: jestPlugin, react: reactPlugin, }, languageOptions: { globals: { ...globals.browser, ...globals.es2015, ...globals.commonjs, ...globals.node, ...globals.jest, }, parserOptions: { project: 'tsconfig.eslint.json', }, }, rules: { '@typescript-eslint/naming-convention': [ 'error', { selector: 'interface', format: ['PascalCase'], custom: { regex: '^I[A-Z]', match: true, }, }, ], '@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }], '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-namespace': 'off', '@typescript-eslint/no-require-imports': 'off', '@typescript-eslint/no-use-before-define': 'off', '@typescript-eslint/no-empty-object-type': 'off', 'jest/no-done-callback': 'off', curly: ['error', 'all'], eqeqeq: 'error', 'prefer-arrow-callback': 'error', }, }, eslintPluginPrettierRecommended, ]); ================================================ FILE: jupyter-config/jupyter_server_config.d/notebook.json ================================================ { "ServerApp": { "jpserver_extensions": { "notebook": true } } } ================================================ FILE: jupyter-notebook.desktop ================================================ [Desktop Entry] Name=Jupyter Notebook Comment=Run Jupyter Notebook Exec=jupyter-notebook %f Terminal=true Type=Application Icon=notebook StartupNotify=true MimeType=application/x-ipynb+json; Categories=Development;Education; Keywords=python; ================================================ FILE: jupyter_config.json ================================================ { "LabApp": { "expose_app_in_browser": true }, "JupyterNotebookApp": { "expose_app_in_browser": true } } ================================================ FILE: lerna.json ================================================ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", "version": "independent" } ================================================ FILE: notebook/__init__.py ================================================ from __future__ import annotations from typing import Any from ._version import __version__, version_info # noqa: F401 def _jupyter_server_extension_paths() -> list[dict[str, str]]: return [{"module": "notebook"}] def _jupyter_server_extension_points() -> list[dict[str, Any]]: from .app import JupyterNotebookApp return [{"module": "notebook", "app": JupyterNotebookApp}] def _jupyter_labextension_paths() -> list[dict[str, str]]: return [{"src": "labextension", "dest": "@jupyter-notebook/lab-extension"}] ================================================ FILE: notebook/__main__.py ================================================ """CLI entry point for notebook.""" import sys from notebook.app import main sys.exit(main()) # type:ignore[no-untyped-call] ================================================ FILE: notebook/_version.py ================================================ """Version info for notebook.""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. import re from collections import namedtuple # Use "hatch version xx.yy.zz" to handle version changes __version__ = "7.6.0a4" # PEP440 version parser _version_regex = re.compile( r""" (?P\d+) \. (?P\d+) \. (?P\d+) (?P((a|b|rc|\.dev)))? (?P\d+)? """, re.VERBOSE, ) _version_fields = _version_regex.match(__version__).groupdict() # type:ignore[union-attr] VersionInfo = namedtuple("VersionInfo", ["major", "minor", "micro", "releaselevel", "serial"]) # noqa: PYI024 version_info = VersionInfo( *[ field for field in ( int(_version_fields["major"]), int(_version_fields["minor"]), int(_version_fields["micro"]), _version_fields["releaselevel"] or "", _version_fields["serial"] or "", ) ] ) ================================================ FILE: notebook/app.py ================================================ """Jupyter notebook application.""" from __future__ import annotations import os import re import typing as t from pathlib import Path from jupyter_client.utils import ensure_async # type:ignore[attr-defined] from jupyter_core.application import base_aliases from jupyter_core.paths import jupyter_config_dir from jupyter_server.base.handlers import JupyterHandler from jupyter_server.extension.handler import ( ExtensionHandlerJinjaMixin, ExtensionHandlerMixin, ) from jupyter_server.serverapp import flags from jupyter_server.utils import url_escape, url_is_absolute from jupyter_server.utils import url_path_join as ujoin from jupyterlab.commands import ( # type:ignore[import-untyped] get_app_dir, get_user_settings_dir, get_workspaces_dir, ) from jupyterlab_server import LabServerApp from jupyterlab_server.config import ( # type:ignore[attr-defined] LabConfig, get_page_config, recursive_update, ) from jupyterlab_server.handlers import _camelCase, is_url from notebook_shim.shim import NotebookConfigShimMixin # type:ignore[import-untyped] from tornado import web from traitlets import Bool, Unicode, default from traitlets.config.loader import Config from ._version import __version__ HERE = Path(__file__).parent.resolve() Flags = dict[str | tuple[str, ...], tuple[dict[str, t.Any] | Config, str]] app_dir = Path(get_app_dir()) version = __version__ # mypy: disable-error-code="no-untyped-call" class NotebookBaseHandler(ExtensionHandlerJinjaMixin, ExtensionHandlerMixin, JupyterHandler): """The base notebook API handler.""" @property def custom_css(self) -> t.Any: return self.settings.get("custom_css", True) def get_page_config(self) -> dict[str, t.Any]: """Get the page config.""" config = LabConfig() app: JupyterNotebookApp = self.extensionapp # type:ignore[assignment] base_url = self.settings.get("base_url", "/") page_config_data = self.settings.setdefault("page_config_data", {}) page_config = { **page_config_data, "appVersion": version, "baseUrl": self.base_url, "terminalsAvailable": self.settings.get("terminals_available", False), "token": self.settings["token"], "fullStaticUrl": ujoin(self.base_url, "static", self.name), "frontendUrl": ujoin(self.base_url, "/"), "exposeAppInBrowser": app.expose_app_in_browser, } server_root = self.settings.get("server_root_dir", "") server_root = server_root.replace(os.sep, "/") server_root = os.path.normpath(Path(server_root).expanduser()) try: # Remove the server_root from pref dir if self.serverapp.preferred_dir != server_root: page_config["preferredPath"] = "/" + os.path.relpath( self.serverapp.preferred_dir, server_root ) else: page_config["preferredPath"] = "/" except Exception: page_config["preferredPath"] = "/" mathjax_config = self.settings.get("mathjax_config", "TeX-AMS_HTML-full,Safe") # TODO Remove CDN usage. mathjax_url = self.settings.get( "mathjax_url", "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js", ) if not url_is_absolute(mathjax_url) and not mathjax_url.startswith(self.base_url): mathjax_url = ujoin(self.base_url, mathjax_url) page_config.setdefault("mathjaxConfig", mathjax_config) page_config.setdefault("fullMathjaxUrl", mathjax_url) page_config.setdefault("jupyterConfigDir", jupyter_config_dir()) # Put all our config in page_config for name in config.trait_names(): page_config[_camelCase(name)] = getattr(app, name) # Add full versions of all the urls for name in config.trait_names(): if not name.endswith("_url"): continue full_name = _camelCase("full_" + name) full_url = getattr(app, name) if not is_url(full_url): # Relative URL will be prefixed with base_url full_url = ujoin(base_url, full_url) page_config[full_name] = full_url labextensions_path = app.extra_labextensions_path + app.labextensions_path recursive_update( page_config, get_page_config( labextensions_path, logger=self.log, ), ) # modify page config with custom hook page_config_hook = self.settings.get("page_config_hook", None) if page_config_hook: page_config = page_config_hook(self, page_config) return page_config class TreeHandler(NotebookBaseHandler): """A tree page handler.""" @web.authenticated async def get(self, path: str = "") -> None: """ Display appropriate page for given path. - A directory listing is shown if path is a directory - Redirected to notebook page if path is a notebook - Render the raw file if path is any other file """ path = path.strip("/") cm = self.contents_manager if await ensure_async(cm.dir_exists(path=path)): if await ensure_async(cm.is_hidden(path)) and not cm.allow_hidden: self.log.info("Refusing to serve hidden directory, via 404 Error") raise web.HTTPError(404) # Set treePath for routing to the directory page_config = self.get_page_config() page_config["treePath"] = path tpl = self.render_template("tree.html", page_config=page_config) return self.write(tpl) if await ensure_async(cm.file_exists(path)): # it's not a directory, we have redirecting to do model = await ensure_async(cm.get(path, content=False)) if model["type"] == "notebook": url = ujoin(self.base_url, "notebooks", url_escape(path)) else: # Return raw content if file is not a notebook url = ujoin(self.base_url, "files", url_escape(path)) self.log.debug("Redirecting %s to %s", self.request.path, url) self.redirect(url) return None raise web.HTTPError(404) class ConsoleHandler(NotebookBaseHandler): """A console page handler.""" @web.authenticated def get(self, path: str | None = None) -> t.Any: # noqa: ARG002 """Get the console page.""" tpl = self.render_template("consoles.html", page_config=self.get_page_config()) return self.write(tpl) class TerminalHandler(NotebookBaseHandler): """A terminal page handler.""" @web.authenticated def get(self, path: str | None = None) -> t.Any: # noqa: ARG002 """Get the terminal page.""" tpl = self.render_template("terminals.html", page_config=self.get_page_config()) return self.write(tpl) class FileHandler(NotebookBaseHandler): """A file page handler.""" @web.authenticated def get(self, path: str | None = None) -> t.Any: # noqa: ARG002 """Get the file page.""" tpl = self.render_template("edit.html", page_config=self.get_page_config()) return self.write(tpl) class NotebookHandler(NotebookBaseHandler): """A notebook page handler.""" @web.authenticated async def get(self, path: str = "") -> t.Any: """Get the notebook page. Redirect if it's a directory.""" path = path.strip("/") cm = self.contents_manager if await ensure_async(cm.dir_exists(path=path)): url = ujoin(self.base_url, "tree", url_escape(path)) self.log.debug("Redirecting %s to %s since path is a directory", self.request.path, url) self.redirect(url) return None tpl = self.render_template("notebooks.html", page_config=self.get_page_config()) return self.write(tpl) class CustomCssHandler(NotebookBaseHandler): """A custom CSS handler.""" @web.authenticated def get(self) -> t.Any: """Get the custom css file.""" self.set_header("Content-Type", "text/css") page_config = self.get_page_config() custom_css_file = f"{page_config['jupyterConfigDir']}/custom/custom.css" if not Path(custom_css_file).is_file(): static_path_root = re.match("^(.*?)static", page_config["staticDir"]) if static_path_root is not None: custom_dir = static_path_root.groups()[0] custom_css_file = f"{custom_dir}custom/custom.css" with Path(custom_css_file).open() as css_f: return self.write(css_f.read()) aliases = dict(base_aliases) class JupyterNotebookApp(NotebookConfigShimMixin, LabServerApp): # type:ignore[misc] """The notebook server extension app.""" name = "notebook" app_name = "Jupyter Notebook" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" version = version app_version = Unicode(version, help="The version of the application.") extension_url = "/" default_url = Unicode("/tree", config=True, help="The default URL to redirect to from `/`") file_url_prefix = "/tree" load_other_extensions = True app_dir = app_dir subcommands: dict[str, t.Any] = {} expose_app_in_browser = Bool( False, config=True, help="Whether to expose the global app instance to browser via window.jupyterapp", ) custom_css = Bool( True, config=True, help="""Whether custom CSS is loaded on the page. Defaults to True and custom CSS is loaded. """, ) flags: Flags = flags # type:ignore[assignment] flags["expose-app-in-browser"] = ( {"JupyterNotebookApp": {"expose_app_in_browser": True}}, "Expose the global app instance to browser via window.jupyterapp.", ) flags["custom-css"] = ( {"JupyterNotebookApp": {"custom_css": True}}, "Load custom CSS in template html files. Default is True", ) @default("static_dir") def _default_static_dir(self) -> str: return str(HERE / "static") @default("templates_dir") def _default_templates_dir(self) -> str: return str(HERE / "templates") @default("app_settings_dir") def _default_app_settings_dir(self) -> str: return str(app_dir / "settings") @default("schemas_dir") def _default_schemas_dir(self) -> str: return str(app_dir / "schemas") @default("themes_dir") def _default_themes_dir(self) -> str: return str(app_dir / "themes") @default("user_settings_dir") def _default_user_settings_dir(self) -> str: return t.cast(str, get_user_settings_dir()) @default("workspaces_dir") def _default_workspaces_dir(self) -> str: return t.cast(str, get_workspaces_dir()) def _prepare_templates(self) -> None: super(LabServerApp, self)._prepare_templates() self.jinja2_env.globals.update(custom_css=self.custom_css) # type:ignore[has-type] def server_extension_is_enabled(self, extension: str) -> bool: """Check if server extension is enabled.""" if self.serverapp is None: return False try: extension_enabled = ( self.serverapp.extension_manager.extensions[extension].enabled is True ) except (AttributeError, KeyError, TypeError): extension_enabled = False return extension_enabled def initialize_handlers(self) -> None: """Initialize handlers.""" assert self.serverapp is not None # noqa: S101 page_config = self.serverapp.web_app.settings.setdefault("page_config_data", {}) nbclassic_enabled = self.server_extension_is_enabled("nbclassic") page_config["nbclassic_enabled"] = nbclassic_enabled # If running under JupyterHub, add more metadata. if "hub_prefix" in self.serverapp.tornado_settings: tornado_settings = self.serverapp.tornado_settings hub_prefix = tornado_settings["hub_prefix"] page_config["hubPrefix"] = hub_prefix page_config["hubHost"] = tornado_settings["hub_host"] page_config["hubUser"] = tornado_settings["user"] page_config["shareUrl"] = ujoin(hub_prefix, "user-redirect") # Assume the server_name property indicates running JupyterHub 1.0. if hasattr(self.serverapp, "server_name"): page_config["hubServerName"] = self.serverapp.server_name # avoid setting API token in page config # $JUPYTERHUB_API_TOKEN identifies the server, not the client # but at least make sure we don't use the token # if the serverapp set one page_config["token"] = "" self.handlers.append(("/tree(.*)", TreeHandler)) self.handlers.append(("/notebooks(.*)", NotebookHandler)) self.handlers.append(("/edit(.*)", FileHandler)) self.handlers.append(("/consoles/(.*)", ConsoleHandler)) self.handlers.append(("/terminals/(.*)", TerminalHandler)) self.handlers.append(("/custom/custom.css", CustomCssHandler)) super().initialize_handlers() def initialize(self, argv: list[str] | None = None) -> None: # noqa: ARG002 """Subclass because the ExtensionApp.initialize() method does not take arguments""" super().initialize() main = launch_new_instance = JupyterNotebookApp.launch_instance if __name__ == "__main__": main() ================================================ FILE: notebook/custom/custom.css ================================================ /* Placeholder for custom user CSS mainly to be overridden in profile/static/custom/custom.css This will always be an empty file */ ================================================ FILE: nx.json ================================================ { "$schema": "./node_modules/nx/schemas/nx-schema.json", "tasksRunnerOptions": { "default": { "runner": "nx/tasks-runners/default", "options": { "cacheableOperations": [ "build", "build:prod", "build:lib", "build:labextension:dev", "build:labextension" ] } } }, "namedInputs": { "default": ["{projectRoot}/**/*"] }, "targetDefaults": { "build:lib": { "dependsOn": ["^build:lib"], "inputs": ["default", "^default"], "outputs": ["{projectRoot}/lib"] }, "build": { "dependsOn": ["^build"], "inputs": ["default", "^default"] }, "build:prod": { "dependsOn": ["^build:prod"], "inputs": ["default", "^default"] } } } ================================================ FILE: package.json ================================================ { "name": "@jupyter-notebook/root", "version": "0.1.0", "private": true, "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "workspaces": { "packages": [ "app", "buildutils", "packages/*" ] }, "scripts": { "build": "lerna run build", "build:lib": "lerna run build:lib", "build:prod": "lerna run build:prod --skip-nx-cache", "build:test": "lerna run build:test", "build:utils": "cd buildutils && npm run build", "clean": "lerna run clean", "deduplicate": "jlpm dlx yarn-berry-deduplicate -s fewerHighest && jlpm install", "develop": "jupyter labextension develop . --overwrite && node ./buildutils/lib/develop.js --overwrite", "eslint": "eslint . --fix", "eslint:check": "eslint .", "eslint:files": "eslint --fix", "get:lab:version": "node ./buildutils/lib/get-latest-lab-version.js", "integrity": "node buildutils/lib/ensure-repo.js", "prettier": "prettier --write \"**/*{.ts,.tsx,.js,.jsx,.css,.json,.md}\"", "prettier:check": "prettier --list-different \"**/*{.ts,.tsx,.js,.jsx,.css,.json,.md}\"", "prettier:files": "prettier --write", "release:bump": "node ./buildutils/lib/release-bump.js", "release:patch": "node ./buildutils/lib/release-patch.js", "test": "lerna run test", "update:dependency": "node ./node_modules/@jupyterlab/buildutils/lib/update-dependency.js --lerna", "upgrade:lab:dependencies": "node ./buildutils/lib/upgrade-lab-dependencies.js", "watch": "run-p watch:lib watch:app", "watch:app": "lerna exec --stream --scope \"@jupyter-notebook/app\" jlpm watch", "watch:lib": "lerna exec --stream --scope @jupyter-notebook/metapackage jlpm watch" }, "resolutions": { "@types/react": "^18.0.26", "react": "^18.2.0", "yjs": "^13.5.40" }, "devDependencies": { "@eslint/js": "^9.26.0", "@jupyterlab/buildutils": "~4.6.0-alpha.4", "eslint": "^9.26.0", "eslint-config-prettier": "^10.0.0", "eslint-plugin-jest": "^28.0.0", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-react": "^7.37.0", "globals": "^16.0.0", "html-webpack-plugin": "^5.6.3", "lerna": "^7.1.4", "npm-run-all": "^4.1.5", "prettier": "^2.8.5", "rimraf": "^3.0.2", "typescript": "~5.9.3", "typescript-eslint": "^8.0.0" }, "nx": {} } ================================================ FILE: packages/_metapackage/package.json ================================================ { "name": "@jupyter-notebook/metapackage", "version": "7.6.0-alpha.4", "private": true, "description": "Jupyter Notebook - Metapackage", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "main": "lib/index.js", "types": "lib/index.d.ts", "scripts": { "build": "tsc -b", "watch": "tsc -b -w --preserveWatchOutput" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyter-notebook/application-extension": "^7.6.0-alpha.4", "@jupyter-notebook/console-extension": "^7.6.0-alpha.4", "@jupyter-notebook/docmanager-extension": "^7.6.0-alpha.4", "@jupyter-notebook/documentsearch-extension": "^7.6.0-alpha.4", "@jupyter-notebook/help-extension": "^7.6.0-alpha.4", "@jupyter-notebook/lab-extension": "^7.6.0-alpha.4", "@jupyter-notebook/notebook-extension": "^7.6.0-alpha.4", "@jupyter-notebook/terminal-extension": "^7.6.0-alpha.4", "@jupyter-notebook/tree": "^7.6.0-alpha.4", "@jupyter-notebook/tree-extension": "^7.6.0-alpha.4", "@jupyter-notebook/ui-components": "^7.6.0-alpha.4" }, "devDependencies": { "typescript": "~5.9.3" } } ================================================ FILE: packages/_metapackage/src/index.ts ================================================ import '@jupyter-notebook/application'; import '@jupyter-notebook/application-extension'; import '@jupyter-notebook/console-extension'; import '@jupyter-notebook/docmanager-extension'; import '@jupyter-notebook/documentsearch-extension'; import '@jupyter-notebook/help-extension'; import '@jupyter-notebook/lab-extension'; import '@jupyter-notebook/notebook-extension'; import '@jupyter-notebook/terminal-extension'; import '@jupyter-notebook/tree'; import '@jupyter-notebook/tree-extension'; import '@jupyter-notebook/ui-components'; ================================================ FILE: packages/_metapackage/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"], "references": [ { "path": "../application" }, { "path": "../application-extension" }, { "path": "../console-extension" }, { "path": "../docmanager-extension" }, { "path": "../documentsearch-extension" }, { "path": "../help-extension" }, { "path": "../lab-extension" }, { "path": "../notebook-extension" }, { "path": "../terminal-extension" }, { "path": "../tree" }, { "path": "../tree-extension" }, { "path": "../ui-components" } ] } ================================================ FILE: packages/application/babel.config.js ================================================ module.exports = require('@jupyterlab/testutils/lib/babel.config'); ================================================ FILE: packages/application/jest.config.js ================================================ const func = require('@jupyterlab/testutils/lib/jest-config'); const upstream = func(__dirname); const esModules = ['lib0', 'y-protocols'].join('|'); let local = { preset: 'ts-jest/presets/js-with-babel', transformIgnorePatterns: [ `/node_modules/(?!${esModules}).+\\.js/(?!(@jupyterlab/.*)/)`, ], globals: { 'ts-jest': { tsconfig: './tsconfig.test.json', }, }, }; Object.keys(local).forEach((option) => { upstream[option] = local[option]; }); module.exports = upstream; ================================================ FILE: packages/application/package.json ================================================ { "name": "@jupyter-notebook/application", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Application", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "style/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "build:test": "tsc --build tsconfig.test.json", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "test": "jest", "test:cov": "jest --collect-coverage", "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand", "test:debug:watch": "node --inspect-brk node_modules/.bin/jest --runInBand --watch", "watch": "tsc -b --watch" }, "dependencies": { "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/docregistry": "~4.6.0-alpha.4", "@jupyterlab/rendermime-interfaces": "~3.14.0-alpha.4", "@jupyterlab/ui-components": "~4.6.0-alpha.4", "@lumino/algorithm": "^2.0.4", "@lumino/coreutils": "^2.2.2", "@lumino/messaging": "^2.0.4", "@lumino/polling": "^2.1.5", "@lumino/signaling": "^2.1.5", "@lumino/widgets": "^2.7.2" }, "devDependencies": { "@babel/core": "^7.11.6", "@babel/preset-env": "^7.12.1", "@jupyterlab/testutils": "~4.6.0-alpha.0", "@types/jest": "^29.2.5", "jest": "^29.3.1", "rimraf": "^3.0.2", "ts-jest": "^29.0.3", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "coreDependency": true }, "styleModule": "style/index.js" } ================================================ FILE: packages/application/src/app.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { JupyterLab, JupyterFrontEnd, JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { Base64ModelFactory } from '@jupyterlab/docregistry'; import { createRendermimePlugins } from '@jupyterlab/application/lib/mimerenderers'; import { LabStatus } from '@jupyterlab/application/lib/status'; import { PageConfig } from '@jupyterlab/coreutils'; import { IRenderMime } from '@jupyterlab/rendermime-interfaces'; import { Throttler } from '@lumino/polling'; import { INotebookShell, NotebookShell } from './shell'; /** * App is the main application class. It is instantiated once and shared. */ export class NotebookApp extends JupyterFrontEnd { /** * Construct a new NotebookApp object. * * @param options The instantiation options for an application. */ constructor(options: NotebookApp.IOptions = { shell: new NotebookShell() }) { super({ ...options, shell: options.shell ?? new NotebookShell() }); // Add initial model factory. this.docRegistry.addModelFactory(new Base64ModelFactory()); if (options.mimeExtensions) { for (const plugin of createRendermimePlugins(options.mimeExtensions)) { this.registerPlugin(plugin); } } // Create an IInfo dictionary from the options to override the defaults. const info = Object.keys(JupyterLab.defaultInfo).reduce((acc, val) => { if (val in options) { (acc as any)[val] = JSON.parse(JSON.stringify((options as any)[val])); } return acc; }, {} as Partial); // Populate application info. this._info = { ...JupyterLab.defaultInfo, ...info }; this.restored = this.shell.restored; this.restored.then(() => this._formatter.invoke()); } /** * The name of the application. */ readonly name = 'Jupyter Notebook'; /** * A namespace/prefix plugins may use to denote their provenance. */ readonly namespace = this.name; /** * The application busy and dirty status signals and flags. */ readonly status = new LabStatus(this); /** * Promise that resolves when the state is first restored */ override readonly restored: Promise; /** * The version of the application. */ readonly version = PageConfig.getOption('appVersion') ?? 'unknown'; /** * The NotebookApp application information dictionary. */ get info(): JupyterLab.IInfo { return this._info; } /** * The JupyterLab application paths dictionary. */ get paths(): JupyterFrontEnd.IPaths { return { urls: { base: PageConfig.getOption('baseUrl'), notFound: PageConfig.getOption('notFoundUrl'), app: PageConfig.getOption('appUrl'), static: PageConfig.getOption('staticUrl'), settings: PageConfig.getOption('settingsUrl'), themes: PageConfig.getOption('themesUrl'), doc: PageConfig.getOption('docUrl'), translations: PageConfig.getOption('translationsApiUrl'), hubHost: PageConfig.getOption('hubHost') || undefined, hubPrefix: PageConfig.getOption('hubPrefix') || undefined, hubUser: PageConfig.getOption('hubUser') || undefined, hubServerName: PageConfig.getOption('hubServerName') || undefined, }, directories: { appSettings: PageConfig.getOption('appSettingsDir'), schemas: PageConfig.getOption('schemasDir'), static: PageConfig.getOption('staticDir'), templates: PageConfig.getOption('templatesDir'), themes: PageConfig.getOption('themesDir'), userSettings: PageConfig.getOption('userSettingsDir'), serverRoot: PageConfig.getOption('serverRoot'), workspaces: PageConfig.getOption('workspacesDir'), }, }; } /** * Handle the DOM events for the application. * * @param event - The DOM event sent to the application. */ override handleEvent(event: Event): void { super.handleEvent(event); if (event.type === 'resize') { void this._formatter.invoke(); } } /** * Register plugins from a plugin module. * * @param mod - The plugin module to register. */ registerPluginModule(mod: NotebookApp.IPluginModule): void { let data = mod.default; // Handle commonjs exports. if (!Object.prototype.hasOwnProperty.call(mod, '__esModule')) { data = mod as any; } if (!Array.isArray(data)) { data = [data]; } data.forEach((item) => { try { this.registerPlugin(item); } catch (error) { console.error(error); } }); } /** * Register the plugins from multiple plugin modules. * * @param mods - The plugin modules to register. */ registerPluginModules(mods: NotebookApp.IPluginModule[]): void { mods.forEach((mod) => { this.registerPluginModule(mod); }); } private _info: JupyterLab.IInfo = JupyterLab.defaultInfo; private _formatter = new Throttler(() => { Private.setFormat(this); }, 250); } /** * A namespace for App static items. */ export namespace NotebookApp { /** * The instantiation options for an App application. */ export interface IOptions extends JupyterFrontEnd.IOptions, Partial {} /** * The information about a Jupyter Notebook application. */ export interface IInfo { /** * The mime renderer extensions. */ readonly mimeExtensions: IRenderMime.IExtensionModule[]; /** * The information about available plugins. */ readonly availablePlugins: JupyterLab.IPluginInfo[]; } /** * The interface for a module that exports a plugin or plugins as * the default value. */ export interface IPluginModule { /** * The default export. */ default: JupyterFrontEndPlugin | JupyterFrontEndPlugin[]; } } /** * A namespace for module-private functionality. */ namespace Private { /** * Media query for mobile devices. */ const MOBILE_QUERY = 'only screen and (max-width: 760px)'; /** * Sets the `format` of a Jupyter front-end application. * * @param app The front-end application whose format is set. */ export function setFormat(app: NotebookApp): void { app.format = window.matchMedia(MOBILE_QUERY).matches ? 'mobile' : 'desktop'; } } ================================================ FILE: packages/application/src/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. export * from './app'; export * from './shell'; export * from './panelhandler'; export * from './pathopener'; export * from './tokens'; ================================================ FILE: packages/application/src/panelhandler.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { ICommandPalette } from '@jupyterlab/apputils'; import { closeIcon } from '@jupyterlab/ui-components'; import { ArrayExt, find } from '@lumino/algorithm'; import { IDisposable } from '@lumino/disposable'; import { IMessageHandler, Message, MessageLoop } from '@lumino/messaging'; import { ISignal, Signal } from '@lumino/signaling'; import { Panel, StackedPanel, Widget } from '@lumino/widgets'; /** * A class which manages a panel and sorts its widgets by rank. */ export class PanelHandler { constructor() { MessageLoop.installMessageHook(this._panel, this._panelChildHook); } /** * Get the panel managed by the handler. */ get panel(): Panel { return this._panel; } /** * Add a widget to the panel. * * If the widget is already added, it will be moved. */ addWidget(widget: Widget, rank: number): void { widget.parent = null; const item = { widget, rank }; const index = ArrayExt.upperBound(this._items, item, Private.itemCmp); ArrayExt.insert(this._items, index, item); this._panel.insertWidget(index, widget); } /** * A message hook for child remove messages on the panel handler. */ private _panelChildHook = ( handler: IMessageHandler, msg: Message ): boolean => { switch (msg.type) { case 'child-removed': { const widget = (msg as Widget.ChildMessage).child; ArrayExt.removeFirstWhere(this._items, (v) => v.widget === widget); } break; default: break; } return true; }; protected _items = new Array(); protected _panel = new Panel(); } /** * A class which manages a side panel that can show at most one widget at a time. */ export class SidePanelHandler extends PanelHandler { /** * Construct a new side panel handler. */ constructor(area: SidePanel.Area) { super(); this._area = area; this._panel.hide(); this._currentWidget = null; this._lastCurrentWidget = null; this._widgetPanel = new StackedPanel(); this._widgetPanel.widgetRemoved.connect(this._onWidgetRemoved, this); this._closeButton = document.createElement('button'); closeIcon.element({ container: this._closeButton, height: '16px', width: 'auto', }); this._closeButton.onclick = () => { this.collapse(); this.hide(); }; this._closeButton.className = 'jp-Button jp-SidePanel-collapse'; this._closeButton.title = 'Collapse side panel'; const icon = new Widget({ node: this._closeButton }); this._panel.addWidget(icon); this._panel.addWidget(this._widgetPanel); } /** * Get the current widget in the sidebar panel. */ get currentWidget(): Widget | null { return ( this._currentWidget || this._lastCurrentWidget || (this._items.length > 0 ? this._items[0].widget : null) ); } /** * Get the area of the side panel */ get area(): SidePanel.Area { return this._area; } /** * Whether the panel is visible */ get isVisible(): boolean { return this._panel.isVisible; } /** * Get the stacked panel managed by the handler */ override get panel(): Panel { return this._panel; } /** * Get the widgets list. */ get widgets(): Readonly { return this._items.map((obj) => obj.widget); } /** * Signal fired when a widget is added to the panel */ get widgetAdded(): ISignal { return this._widgetAdded; } /** * Signal fired when a widget is removed from the panel */ get widgetRemoved(): ISignal { return this._widgetRemoved; } /** * Get the close button element. */ get closeButton(): HTMLButtonElement { return this._closeButton; } /** * Expand the sidebar. * * #### Notes * This will open the most recently used widget, or the first widget * if there is no most recently used. */ expand(id?: string): void { if (this._currentWidget) { this.collapse(); } if (id) { this.activate(id); } else { const visibleWidget = this.currentWidget; if (visibleWidget) { this._currentWidget = visibleWidget; this.activate(visibleWidget.id); } } } /** * Activate a widget residing in the stacked panel by ID. * * @param id - The widget's unique ID. */ activate(id: string): void { const widget = this._findWidgetByID(id); if (widget) { this._currentWidget = widget; widget.show(); widget.activate(); } } /** * Test whether the sidebar has the given widget by id. */ has(id: string): boolean { return this._findWidgetByID(id) !== null; } /** * Collapse the sidebar so no items are expanded. */ collapse(): void { this._currentWidget?.hide(); this._currentWidget = null; } /** * Add a widget and its title to the stacked panel. * * If the widget is already added, it will be moved. */ override addWidget(widget: Widget, rank: number): void { widget.parent = null; widget.hide(); const item = { widget, rank }; const index = this._findInsertIndex(item); ArrayExt.insert(this._items, index, item); this._widgetPanel.insertWidget(index, widget); this._refreshVisibility(); this._widgetAdded.emit(widget); } /** * Hide the side panel */ hide(): void { this._isHiddenByUser = true; this._refreshVisibility(); } /** * Show the side panel */ show(): void { this._isHiddenByUser = false; this._refreshVisibility(); } /** * Find the insertion index for a rank item. */ private _findInsertIndex(item: Private.IRankItem): number { return ArrayExt.upperBound(this._items, item, Private.itemCmp); } /** * Find the index of the item with the given widget, or `-1`. */ private _findWidgetIndex(widget: Widget): number { return ArrayExt.findFirstIndex(this._items, (i) => i.widget === widget); } /** * Find the widget with the given id, or `null`. */ private _findWidgetByID(id: string): Widget | null { return find(this._items, (value) => value.widget.id === id)?.widget ?? null; } /** * Refresh the visibility of the stacked panel. */ private _refreshVisibility(): void { this._panel.setHidden(this._isHiddenByUser); } /* * Handle the `widgetRemoved` signal from the panel. */ private _onWidgetRemoved(sender: StackedPanel, widget: Widget): void { if (widget === this._lastCurrentWidget) { this._lastCurrentWidget = null; } ArrayExt.removeAt(this._items, this._findWidgetIndex(widget)); this._refreshVisibility(); this._widgetRemoved.emit(widget); } private _area: SidePanel.Area; private _isHiddenByUser = false; private _widgetPanel: StackedPanel; private _currentWidget: Widget | null; private _lastCurrentWidget: Widget | null; private _closeButton: HTMLButtonElement; private _widgetAdded: Signal = new Signal(this); private _widgetRemoved: Signal = new Signal(this); } /** * A name space for SideBarPanel functions. */ export namespace SidePanel { /** * The areas of the sidebar panel */ export type Area = 'left' | 'right'; } /** * A class to manages the palette entries associated to the side panels. */ export class SidePanelPalette { /** * Construct a new side panel palette. */ constructor(options: SidePanelPaletteOption) { this._commandPalette = options.commandPalette; this._command = options.command; } /** * Get a command palette item from the widget id and the area. */ getItem( widget: Readonly, area: 'left' | 'right' ): SidePanelPaletteItem | null { return ( this._items.find( (item) => item.widgetId === widget.id && item.area === area ) ?? null ); } /** * Add an item to the command palette. */ addItem(widget: Readonly, area: 'left' | 'right'): void { // Check if the item does not already exist. if (this.getItem(widget, area)) { return; } // Add a new item in command palette. const disposableDelegate = this._commandPalette.addItem({ command: this._command, category: 'View', args: { side: area, title: `Show ${widget.title.caption}`, id: widget.id, }, }); // Keep the disposableDelegate object to be able to dispose of the item if the widget // is remove from the side panel. this._items.push({ widgetId: widget.id, area: area, disposable: disposableDelegate, }); } /** * Remove an item from the command palette. */ removeItem(widget: Readonly, area: 'left' | 'right'): void { const item = this.getItem(widget, area); if (item) { item.disposable.dispose(); } } private _command: string; private _commandPalette: ICommandPalette; private _items: SidePanelPaletteItem[] = []; } type SidePanelPaletteItem = { /** * The ID of the widget associated to the command palette. */ widgetId: string; /** * The area of the panel associated to the command palette. */ area: 'left' | 'right'; /** * The disposable object to remove the item from command palette. */ disposable: IDisposable; }; /** * An interface for the options to include in SideBarPalette constructor. */ type SidePanelPaletteOption = { /** * The commands palette. */ commandPalette: ICommandPalette; /** * The command to call from each side panel menu entry. * * ### Notes * That command required 3 args : * side: 'left' | 'right', the area to toggle * title: string, label of the command * id: string, id of the widget to activate */ command: string; }; /** * A namespace for private module data. */ namespace Private { /** * An object which holds a widget and its sort rank. */ export interface IRankItem { /** * The widget for the item. */ widget: Widget; /** * The sort rank of the widget. */ rank: number; } /** * A less-than comparison function for side bar rank items. */ export function itemCmp(first: IRankItem, second: IRankItem): number { return first.rank - second.rank; } } ================================================ FILE: packages/application/src/pathopener.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { URLExt } from '@jupyterlab/coreutils'; import { INotebookPathOpener } from './tokens'; /** * A class to open paths in new browser tabs in the Notebook application. */ class DefaultNotebookPathOpener implements INotebookPathOpener { /** * Open a path in a new browser tab. */ open(options: INotebookPathOpener.IOpenOptions): WindowProxy | null { const { prefix, path, searchParams, target, features } = options; const url = new URL( URLExt.join(prefix, URLExt.encodeParts(path ?? '')), window.location.origin ); if (searchParams) { url.search = searchParams.toString(); } return window.open(url, target, features); } } export const defaultNotebookPathOpener = new DefaultNotebookPathOpener(); ================================================ FILE: packages/application/src/shell.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { JupyterFrontEnd } from '@jupyterlab/application'; import { DocumentRegistry } from '@jupyterlab/docregistry'; import { ITranslator, nullTranslator } from '@jupyterlab/translation'; import { find } from '@lumino/algorithm'; import { JSONExt, PromiseDelegate, Token } from '@lumino/coreutils'; import { ISignal, Signal } from '@lumino/signaling'; import { BoxLayout, FocusTracker, Panel, SplitPanel, TabPanel, Widget, } from '@lumino/widgets'; import { PanelHandler, SidePanelHandler } from './panelhandler'; import { TabPanelSvg } from '@jupyterlab/ui-components'; /** * The Jupyter Notebook application shell token. */ export const INotebookShell = new Token( '@jupyter-notebook/application:INotebookShell' ); /** * The Jupyter Notebook application shell interface. */ export interface INotebookShell extends NotebookShell {} /** * The namespace for INotebookShell type information. */ export namespace INotebookShell { /** * The areas of the application shell where widgets can reside. */ export type Area = 'main' | 'top' | 'menu' | 'left' | 'right' | 'down'; /** * Widget position */ export interface IWidgetPosition { /** * Widget area */ area?: Area; /** * Widget opening options */ options?: DocumentRegistry.IOpenOptions; } /** * Mapping of widget type identifier and their user customized position */ export interface IUserLayout { /** * Widget customized position */ [k: string]: IWidgetPosition; } } /** * The default rank for ranked panels. */ const DEFAULT_RANK = 900; /** * The application shell. */ export class NotebookShell extends Widget implements JupyterFrontEnd.IShell { constructor() { super(); this.id = 'main'; this._userLayout = {}; this._topHandler = new PanelHandler(); this._menuHandler = new PanelHandler(); this._leftHandler = new SidePanelHandler('left'); this._rightHandler = new SidePanelHandler('right'); this._main = new Panel(); const topWrapper = (this._topWrapper = new Panel()); const menuWrapper = (this._menuWrapper = new Panel()); this._topHandler.panel.id = 'top-panel'; this._topHandler.panel.node.setAttribute('role', 'banner'); this._menuHandler.panel.id = 'menu-panel'; this._menuHandler.panel.node.setAttribute('role', 'navigation'); this._main.id = 'main-panel'; this._main.node.setAttribute('role', 'main'); this._spacer_top = new Widget(); this._spacer_top.id = 'spacer-widget-top'; this._spacer_bottom = new Widget(); this._spacer_bottom.id = 'spacer-widget-bottom'; // create wrappers around the top and menu areas topWrapper.id = 'top-panel-wrapper'; topWrapper.addWidget(this._topHandler.panel); menuWrapper.id = 'menu-panel-wrapper'; menuWrapper.addWidget(this._menuHandler.panel); const rootLayout = new BoxLayout(); const leftHandler = this._leftHandler; const rightHandler = this._rightHandler; leftHandler.panel.id = 'jp-left-stack'; leftHandler.panel.node.setAttribute('role', 'complementary'); rightHandler.panel.id = 'jp-right-stack'; rightHandler.panel.node.setAttribute('role', 'complementary'); // Hide the side panels by default. leftHandler.hide(); rightHandler.hide(); const middleLayout = new BoxLayout({ spacing: 0, direction: 'top-to-bottom', }); BoxLayout.setStretch(this._topWrapper, 0); BoxLayout.setStretch(this._menuWrapper, 0); BoxLayout.setStretch(this._main, 1); const middlePanel = new Panel({ layout: middleLayout }); middlePanel.addWidget(this._topWrapper); middlePanel.addWidget(this._menuWrapper); middlePanel.addWidget(this._spacer_top); middlePanel.addWidget(this._main); middlePanel.addWidget(this._spacer_bottom); middlePanel.layout = middleLayout; const vsplitPanel = new SplitPanel(); vsplitPanel.id = 'jp-main-vsplit-panel'; vsplitPanel.spacing = 1; vsplitPanel.orientation = 'vertical'; SplitPanel.setStretch(vsplitPanel, 1); const downPanel = new TabPanelSvg({ tabsMovable: true, }); this._downPanel = downPanel; this._downPanel.id = 'jp-down-stack'; // TODO: Consider storing this as an attribute this._hsplitPanel if saving/restoring layout needed const hsplitPanel = new SplitPanel(); hsplitPanel.id = 'main-split-panel'; hsplitPanel.spacing = 1; BoxLayout.setStretch(hsplitPanel, 1); SplitPanel.setStretch(leftHandler.panel, 0); SplitPanel.setStretch(rightHandler.panel, 0); SplitPanel.setStretch(middlePanel, 1); hsplitPanel.addWidget(leftHandler.panel); hsplitPanel.addWidget(middlePanel); hsplitPanel.addWidget(rightHandler.panel); // Use relative sizing to set the width of the side panels. // This will still respect the min-size of children widget in the stacked // panel. hsplitPanel.setRelativeSizes([1, 2.5, 1]); vsplitPanel.addWidget(hsplitPanel); vsplitPanel.addWidget(downPanel); rootLayout.spacing = 0; rootLayout.addWidget(vsplitPanel); // initially hiding the down panel this._downPanel.hide(); // Connect down panel change listeners this._downPanel.tabBar.tabMoved.connect(this._onTabPanelChanged, this); this._downPanel.stackedPanel.widgetRemoved.connect( this._onTabPanelChanged, this ); this.layout = rootLayout; // Added Skip to Main Link const skipLinkWidgetHandler = (this._skipLinkWidgetHandler = new Private.SkipLinkWidgetHandler(this)); this.add(skipLinkWidgetHandler.skipLinkWidget, 'top', { rank: 0 }); this._skipLinkWidgetHandler.show(); } /** * A signal emitted when the current widget changes. */ get currentChanged(): ISignal< JupyterFrontEnd.IShell, FocusTracker.IChangedArgs > { return this._currentChanged; } /** * The current widget in the shell's main area. */ get currentWidget(): Widget | null { return this._main.widgets[0] ?? null; } /** * Get the top area wrapper panel */ get top(): Widget { return this._topWrapper; } /** * Get the menu area wrapper panel */ get menu(): Widget { return this._menuWrapper; } /** * Get the left area handler */ get leftHandler(): SidePanelHandler { return this._leftHandler; } /** * Get the right area handler */ get rightHandler(): SidePanelHandler { return this._rightHandler; } /** * Is the left sidebar visible? */ get leftCollapsed(): boolean { return !(this._leftHandler.isVisible && this._leftHandler.panel.isVisible); } /** * Is the right sidebar visible? */ get rightCollapsed(): boolean { return !( this._rightHandler.isVisible && this._rightHandler.panel.isVisible ); } /** * Promise that resolves when the main widget is loaded */ get restored(): Promise { return this._mainWidgetLoaded.promise; } /** * Getter and setter for the translator. */ get translator(): ITranslator { return this._translator ?? nullTranslator; } set translator(value: ITranslator) { if (value !== this._translator) { this._translator = value; const trans = value.load('notebook'); this._leftHandler.closeButton.title = trans.__( 'Collapse %1 side panel', this._leftHandler.area ); this._rightHandler.closeButton.title = trans.__( 'Collapse %1 side panel', this._rightHandler.area ); } } /** * User custom shell layout. */ get userLayout() { return JSONExt.deepCopy(this._userLayout as any); } /** * Activate a widget in its area. */ activateById(id: string): void { // Search all areas that can have widgets for this widget, starting with main. for (const area of ['main', 'top', 'left', 'right', 'menu', 'down']) { const widget = find( this.widgets(area as INotebookShell.Area), (w) => w.id === id ); if (widget) { if (area === 'left') { this.expandLeft(id); } else if (area === 'right') { this.expandRight(id); } else if (area === 'down') { this._downPanel.show(); widget.activate(); } else { widget.activate(); } } } } /** * Add a widget to the application shell. * * @param widget - The widget being added. * * @param area - Optional region in the shell into which the widget should * be added. * * @param options - Optional open options. * */ add( widget: Widget, area?: INotebookShell.Area, options?: DocumentRegistry.IOpenOptions ): void { let userPosition: INotebookShell.IWidgetPosition | undefined; if (options?.type && this._userLayout[options.type]) { userPosition = this._userLayout[options.type]; } else { userPosition = this._userLayout[widget.id]; } area = userPosition?.area ?? area; options = options || userPosition?.options ? { ...options, ...userPosition?.options, } : undefined; const rank = options?.rank ?? DEFAULT_RANK; switch (area) { case 'top': return this._topHandler.addWidget(widget, rank); case 'menu': return this._menuHandler.addWidget(widget, rank); case 'main': case undefined: { if (this._main.widgets.length > 0) { // do not add the widget if there is already one return; } const previousWidget = this.currentWidget; this._main.addWidget(widget); this._main.update(); this._currentChanged.emit({ newValue: widget, oldValue: previousWidget, }); this._mainWidgetLoaded.resolve(); break; } case 'left': return this._leftHandler.addWidget(widget, rank); case 'right': return this._rightHandler.addWidget(widget, rank); case 'down': return this._downPanel.addWidget(widget); default: console.warn(`Cannot add widget to area: ${area}`); } } /** * Return a boolean whether the side panel is visible. */ isSidePanelVisible(area: string): boolean { if (area === 'left') { return this._leftHandler.isVisible; } else if (area === 'right') { return this._rightHandler.isVisible; } return false; } /** * Get the area of a widget, given its id. * * @param id - the widget id * @returns the area where the widget belongs, or null. */ getWidgetArea(id: string): string | null { for (const area of ['main', 'top', 'left', 'right', 'menu', 'down']) { const widget = find( this.widgets(area as INotebookShell.Area), (w) => w.id === id ); if (widget) { return area; } } return null; } /** * Expand an area. */ expand(area: string): void { if (!['top', 'left', 'right'].includes(area)) { return; } if (area === 'top') { this.expandTop(); } else if (area === 'left') { this.expandLeft(); } else if (area === 'right') { this.expandRight(); } } /** * Collapse an area. */ collapse(area: string): void { if (!['top', 'left', 'right'].includes(area)) { return; } if (area === 'top') { this.collapseTop(); } else if (area === 'left') { this.collapseLeft(); } else if (area === 'right') { this.collapseRight(); } } /** * Collapse the top area and the spacer to make the view more compact. */ collapseTop(): void { this._topWrapper.setHidden(true); this._spacer_top.setHidden(true); } /** * Expand the top area to show the header and the spacer. */ expandTop(): void { this._topWrapper.setHidden(false); this._spacer_top.setHidden(false); } /** * Return the list of widgets for the given area. * * @param area The area */ *widgets(area: INotebookShell.Area): IterableIterator { switch (area ?? 'main') { case 'top': yield* this._topHandler.panel.widgets; return; case 'menu': yield* this._menuHandler.panel.widgets; return; case 'main': yield* this._main.widgets; return; case 'left': yield* this._leftHandler.widgets; return; case 'right': yield* this._rightHandler.widgets; return; case 'down': yield* this._downPanel.widgets; return; default: console.error(`This shell has no area called "${area}"`); return; } } /** * Expand the left panel to show the sidebar with its widget. */ expandLeft(id?: string): void { this._leftHandler.panel.show(); this._leftHandler.expand(id); // Show the current widget, if any } /** * Collapse the left panel */ collapseLeft(): void { this._leftHandler.collapse(); this._leftHandler.panel.hide(); } /** * Expand the right panel to show the sidebar with its widget. */ expandRight(id?: string): void { this._rightHandler.panel.show(); this._rightHandler.expand(id); // Show the current widget, if any } /** * Collapse the right panel */ collapseRight(): void { this._rightHandler.collapse(); this._rightHandler.panel.hide(); } /** * Restore the layout state and configuration for the application shell. */ async restoreLayout( configuration: INotebookShell.IUserLayout ): Promise { this._userLayout = configuration; } /** * Handle a change on the down panel widgets */ private _onTabPanelChanged(): void { if (this._downPanel.stackedPanel.widgets.length === 0) { this._downPanel.hide(); } } private _topWrapper: Panel; private _topHandler: PanelHandler; private _menuWrapper: Panel; private _menuHandler: PanelHandler; private _leftHandler: SidePanelHandler; private _rightHandler: SidePanelHandler; private _spacer_top: Widget; private _spacer_bottom: Widget; private _skipLinkWidgetHandler: Private.SkipLinkWidgetHandler; private _main: Panel; private _downPanel: TabPanel; private _translator: ITranslator = nullTranslator; private _currentChanged = new Signal>( this ); private _mainWidgetLoaded = new PromiseDelegate(); private _userLayout: INotebookShell.IUserLayout; } export namespace Private { export class SkipLinkWidgetHandler { /** * Construct a new skipLink widget handler. */ constructor(shell: INotebookShell) { const skipLinkWidget = (this._skipLinkWidget = new Widget()); const skipToMain = document.createElement('a'); skipToMain.href = '#first-cell'; skipToMain.tabIndex = 1; skipToMain.text = 'Skip to Main'; skipToMain.className = 'skip-link'; skipToMain.addEventListener('click', this); skipLinkWidget.addClass('jp-skiplink'); skipLinkWidget.id = 'jp-skiplink'; skipLinkWidget.node.appendChild(skipToMain); } handleEvent(event: Event): void { switch (event.type) { case 'click': this._focusMain(); break; } } private _focusMain() { const input = document.querySelector( '#main-panel .jp-InputArea-editor' ) as HTMLInputElement; input.tabIndex = 1; input.focus(); } /** * Get the input element managed by the handler. */ get skipLinkWidget(): Widget { return this._skipLinkWidget; } /** * Dispose of the handler and the resources it holds. */ dispose(): void { if (this.isDisposed) { return; } this._isDisposed = true; this._skipLinkWidget.node.removeEventListener('click', this); this._skipLinkWidget.dispose(); } /** * Hide the skipLink widget. */ hide(): void { this._skipLinkWidget.hide(); } /** * Show the skipLink widget. */ show(): void { this._skipLinkWidget.show(); } /** * Test whether the handler has been disposed. */ get isDisposed(): boolean { return this._isDisposed; } private _skipLinkWidget: Widget; private _isDisposed = false; } } ================================================ FILE: packages/application/src/tokens.ts ================================================ import { Token } from '@lumino/coreutils'; /** * The INotebookPathOpener interface. */ export interface INotebookPathOpener { /** * Open a path in the application. * * @param options - The options used to open the path. */ open: (options: INotebookPathOpener.IOpenOptions) => WindowProxy | null; } export namespace INotebookPathOpener { /** * The options used to open a path in the application. */ export interface IOpenOptions { /** * The URL prefix, which should include the base URL */ prefix: string; /** * The path to open in the application, e.g `setup.py`, or `notebooks/example.ipynb` */ path?: string; /** * The extra search params to use in the URL. */ searchParams?: URLSearchParams; /** * Name of the browsing context the resource is being loaded into. * See https://developer.mozilla.org/en-US/docs/Web/API/Window/open for more details. */ target?: string; /** * * See https://developer.mozilla.org/en-US/docs/Web/API/Window/open for more details. */ features?: string; } } /** * The INotebookPathOpener token. * The main purpose of this token is to allow other extensions or downstream applications * to override the default behavior of opening a notebook in a new tab. * It also allows passing the path as a URL search parameter, or other options to the window.open call. */ export const INotebookPathOpener = new Token( '@jupyter-notebook/application:INotebookPathOpener' ); ================================================ FILE: packages/application/style/base.css ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ :root { --jp-private-topbar-height: 28px; /* Override the layout-2 color for the dark theme */ --md-grey-800: #323232; --jp-notebook-max-width: 1200px; } /* Override the default background See https://github.com/jupyterlab/jupyterlab/pull/16519 for more information */ body.jp-ThemedContainer { margin: 0; padding: 0; background: var(--jp-layout-color2); } #main.jp-ThemedContainer { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: var(--jp-layout-color2); } #top-panel-wrapper { min-height: calc(1.5 * var(--jp-private-topbar-height)); border-bottom: var(--jp-border-width) solid var(--jp-border-color0); background: var(--jp-layout-color1); } #top-panel { display: flex; min-height: calc(1.5 * var(--jp-private-topbar-height)); padding-left: 5px; padding-right: 5px; margin-left: auto; margin-right: auto; max-width: 1200px; } #menu-panel-wrapper { min-height: var(--jp-private-topbar-height); background: var(--jp-layout-color1); border-bottom: var(--jp-border-width) solid var(--jp-border-color0); box-shadow: var(--jp-elevation-z1); } #menu-panel { display: flex; min-height: var(--jp-private-topbar-height); background: var(--jp-layout-color1); padding-left: 5px; padding-right: 5px; margin-left: auto; margin-right: auto; max-width: var(--jp-notebook-max-width); } #main-panel { margin-left: auto; margin-right: auto; max-width: var(--jp-notebook-max-width); } #spacer-widget-top { min-height: 16px; } /* Only edit pages should have a bottom space */ body[data-notebook='edit'] #spacer-widget-bottom { min-height: 16px; } /* Special case notebooks as document oriented pages */ [data-notebook]:not(body[data-notebook='notebooks']) #main-panel { box-shadow: var(--jp-elevation-z4); } .jp-TreePanel > .lm-TabPanel-stackedPanel { box-shadow: var(--jp-elevation-z4); } body[data-notebook='notebooks'] #main-panel { margin-left: unset; margin-right: unset; max-width: unset; } body[data-notebook='notebooks'] #spacer-widget-top { min-height: unset; } #main-panel > .jp-TreePanel { padding: 0px 5px; } @media only screen and (max-width: 760px) { #main-panel > .jp-TreePanel { margin: 0px -5px; } } ================================================ FILE: packages/application/style/index.css ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ @import url('~@jupyterlab/application/style/index.css'); @import url('~@jupyterlab/mainmenu/style/index.css'); @import url('~@jupyterlab/ui-components/style/index.css'); @import url('./base.css'); @import url('./sidepanel.css'); ================================================ FILE: packages/application/style/index.js ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ import '@jupyterlab/application/style/index.js'; import '@jupyterlab/mainmenu/style/index.js'; import '@jupyterlab/ui-components/style/index.js'; import './base.css'; import './sidepanel.css'; ================================================ FILE: packages/application/style/sidepanel.css ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. | | Adapted from JupyterLab's packages/application/style/sidepanel.css. |----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------- | Variables |----------------------------------------------------------------------------*/ :root { --jp-private-sidebar-tab-width: 32px; } /*----------------------------------------------------------------------------- | SideBar |----------------------------------------------------------------------------*/ /* Stack panels */ #jp-right-stack, #jp-left-stack { display: flex; flex-direction: column; min-width: var(--jp-sidebar-min-width); } #jp-left-stack .jp-SidePanel-collapse, #jp-right-stack .jp-SidePanel-collapse { display: flex; flex: 0 0 auto; min-height: 0; padding: 0; } #jp-left-stack .jp-SidePanel-collapse { justify-content: right; } #jp-right-stack .jp-SidePanel-collapse { justify-content: left; } #jp-left-stack .lm-StackedPanel, #jp-right-stack .lm-StackedPanel { flex: 1 1 auto; } ================================================ FILE: packages/application/test/shell.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { INotebookShell, NotebookShell } from '@jupyter-notebook/application'; import { JupyterFrontEnd } from '@jupyterlab/application'; import { Widget } from '@lumino/widgets'; describe('Shell for notebooks', () => { let shell: INotebookShell; beforeEach(() => { shell = new NotebookShell(); Widget.attach(shell, document.body); }); afterEach(() => { shell.dispose(); }); describe('#constructor()', () => { it('should create a LabShell instance', () => { expect(shell).toBeInstanceOf(NotebookShell); }); it('should make some areas empty initially', () => { ['main', 'left', 'right', 'menu'].forEach((area) => { const widgets = Array.from(shell.widgets(area as INotebookShell.Area)); expect(widgets.length).toEqual(0); }); }); it('should have the skip link widget in the top area initially', () => { const widgets = Array.from(shell.widgets('top')); expect(widgets.length).toEqual(1); }); }); describe('#widgets()', () => { it('should add widgets to main area', () => { const widget = new Widget(); shell.add(widget, 'main'); const widgets = Array.from(shell.widgets('main')); expect(widgets).toEqual([widget]); }); it('should be empty and console.error if area does not exist', () => { const spy = jest.spyOn(console, 'error'); const jupyterFrontEndShell = shell as JupyterFrontEnd.IShell; expect(Array.from(jupyterFrontEndShell.widgets('fake'))).toHaveLength(0); expect(spy).toHaveBeenCalled(); }); }); describe('#currentWidget', () => { it('should be the current widget in the shell main area', () => { expect(shell.currentWidget).toBe(null); const widget = new Widget(); widget.node.tabIndex = -1; widget.id = 'foo'; expect(shell.currentWidget).toBe(null); shell.add(widget, 'main'); expect(shell.currentWidget).toBe(widget); widget.parent = null; expect(shell.currentWidget).toBe(null); }); }); describe('#add(widget, "top")', () => { it('should add a widget to the top area', () => { const widget = new Widget(); widget.id = 'foo'; shell.add(widget, 'top'); const widgets = Array.from(shell.widgets('top')); expect(widgets.length).toBeGreaterThan(0); }); it('should accept options', () => { const widget = new Widget(); widget.id = 'foo'; shell.add(widget, 'top', { rank: 10 }); const widgets = Array.from(shell.widgets('top')); expect(widgets.length).toBeGreaterThan(0); }); }); describe('#add(widget, "main")', () => { it('should add a widget to the main area', () => { const widget = new Widget(); widget.id = 'foo'; shell.add(widget, 'main'); const widgets = Array.from(shell.widgets('main')); expect(widgets.length).toBeGreaterThan(0); }); }); describe('#add(widget, "left")', () => { it('should add a widget to the left area', () => { const widget = new Widget(); widget.id = 'foo'; shell.add(widget, 'left'); const widgets = Array.from(shell.widgets('left')); expect(widgets.length).toBeGreaterThan(0); }); }); describe('#add(widget, "right")', () => { it('should add a widget to the right area', () => { const widget = new Widget(); widget.id = 'foo'; shell.add(widget, 'right'); const widgets = Array.from(shell.widgets('right')); expect(widgets.length).toBeGreaterThan(0); }); }); }); describe('Shell for tree view', () => { let shell: INotebookShell; beforeEach(() => { shell = new NotebookShell(); Widget.attach(shell, document.body); }); afterEach(() => { shell.dispose(); }); describe('#constructor()', () => { it('should create a LabShell instance', () => { expect(shell).toBeInstanceOf(NotebookShell); }); it('should make some areas empty initially', () => { ['main', 'left', 'right', 'menu'].forEach((area) => { const widgets = Array.from(shell.widgets(area as INotebookShell.Area)); expect(widgets.length).toEqual(0); }); }); it('should have the skip link widget in the top area initially', () => { const widgets = Array.from(shell.widgets('top')); expect(widgets.length).toEqual(1); }); }); describe('#widgets()', () => { it('should add widgets to existing areas', () => { const widget = new Widget(); shell.add(widget, 'main'); const widgets = Array.from(shell.widgets('main')); expect(widgets).toEqual([widget]); }); it('should throw an exception if a fake area does not exist', () => { const spy = jest.spyOn(console, 'error'); const jupyterFrontEndShell = shell as JupyterFrontEnd.IShell; expect(Array.from(jupyterFrontEndShell.widgets('fake'))).toHaveLength(0); expect(spy).toHaveBeenCalled(); }); }); describe('#add(widget, "left")', () => { it('should add a widget to the left area', () => { const widget = new Widget(); widget.id = 'foo'; shell.add(widget, 'left'); const widgets = Array.from(shell.widgets('left')); expect(widgets.length).toBeGreaterThan(0); }); }); describe('#add(widget, "right")', () => { it('should add a widget to the right area', () => { const widget = new Widget(); widget.id = 'foo'; shell.add(widget, 'right'); const widgets = Array.from(shell.widgets('right')); expect(widgets.length).toBeGreaterThan(0); }); }); }); ================================================ FILE: packages/application/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"] } ================================================ FILE: packages/application/tsconfig.test.json ================================================ { "extends": "../../tsconfigbase.test", "include": ["src/**/*", "test/**/*"], "references": [ { "path": "." } ] } ================================================ FILE: packages/application-extension/package.json ================================================ { "name": "@jupyter-notebook/application-extension", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Application Extension", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/**/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "watch": "tsc -b --watch" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyter-notebook/ui-components": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/apputils": "~4.7.0-alpha.4", "@jupyterlab/codeeditor": "~4.6.0-alpha.4", "@jupyterlab/console": "~4.6.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/docmanager": "~4.6.0-alpha.4", "@jupyterlab/docregistry": "~4.6.0-alpha.4", "@jupyterlab/mainmenu": "~4.6.0-alpha.4", "@jupyterlab/rendermime": "~4.6.0-alpha.4", "@jupyterlab/settingregistry": "~4.6.0-alpha.4", "@jupyterlab/translation": "~4.6.0-alpha.4", "@lumino/coreutils": "^2.2.2", "@lumino/disposable": "^2.1.5", "@lumino/widgets": "^2.7.2" }, "devDependencies": { "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "extension": true, "schemaDir": "schema" }, "styleModule": "style/index.js" } ================================================ FILE: packages/application-extension/schema/menus.json ================================================ { "title": "Jupyter Notebook Menu Entries", "description": "Jupyter Notebook Menu Entries", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-file", "items": [ { "command": "application:rename", "rank": 4.5 }, { "command": "application:duplicate", "rank": 4.8 }, { "command": "notebook:trust", "rank": 20 }, { "type": "separator", "rank": 30 }, { "command": "filemenu:close-and-cleanup", "rank": 40 }, { "command": "application:close", "disabled": true } ] }, { "id": "jp-mainmenu-view", "items": [ { "type": "submenu", "disabled": true, "submenu": { "id": "jp-mainmenu-view-appearance" } } ] }, { "id": "jp-mainmenu-run", "items": [ { "type": "separator", "rank": 1000 }, { "type": "submenu", "rank": 1010, "submenu": { "id": "jp-runmenu-change-cell-type", "label": "Cell Type", "items": [ { "command": "notebook:change-cell-to-code", "rank": 0 }, { "command": "notebook:change-cell-to-markdown", "rank": 0 }, { "command": "notebook:change-cell-to-raw", "rank": 0 } ] } } ] } ] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/application-extension/schema/pages.json ================================================ { "title": "Jupyter Notebook Pages", "description": "Jupyter Notebook Pages", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-view", "items": [ { "command": "application:open-lab", "rank": 2 }, { "command": "application:open-tree", "rank": 2 } ] } ] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/application-extension/schema/shell.json ================================================ { "$schema": "http://json-schema.org/draft-07/schema", "title": "Notebook Shell", "description": "Notebook Shell layout settings.", "properties": { "layout": { "$ref": "#/definitions/layout", "type": "object", "title": "Customize shell widget positioning", "description": "Overrides default widget position in the application layout", "default": { "Debugger Console": { "area": "down" }, "Markdown Preview": { "area": "right" }, "Plugins": { "area": "left" } } } }, "additionalProperties": false, "type": "object", "definitions": { "layout": { "type": "object", "properties": { "[\\w-]+": { "type": "object", "properties": { "area": { "enum": ["left", "right"] } }, "additionalProperties": false } } } } } ================================================ FILE: packages/application-extension/schema/shortcuts.json ================================================ { "jupyter.lab.setting-icon": "notebook-ui-components:jupyter", "jupyter.lab.setting-icon-label": "Jupyter Notebook shortcuts", "title": "Jupyter Notebook Shortcuts", "description": "Keyboard shortcuts for Jupyter Notebook", "jupyter.lab.shortcuts": [ { "args": {}, "command": "notebook:toggle-cell-outputs", "keys": ["O"], "selector": ".jp-Notebook.jp-mod-commandMode:not(.jp-mod-readWrite) :focus" } ], "additionalProperties": false, "type": "object" } ================================================ FILE: packages/application-extension/schema/title.json ================================================ { "title": "Title widget", "description": "Title widget", "jupyter.lab.toolbars": { "TopBar": [{ "name": "widgetTitle", "rank": 10 }] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/application-extension/schema/top.json ================================================ { "jupyter.lab.setting-icon": "notebook-ui-components:jupyter", "jupyter.lab.setting-icon-label": "Jupyter Notebook Top Area", "title": "Jupyter Notebook Top Area", "description": "Jupyter Notebook Top Area settings", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-view", "items": [ { "command": "application:toggle-top", "rank": 2 } ] } ] }, "properties": { "visible": { "type": "string", "enum": ["yes", "no", "automatic"], "title": "Top Bar Visibility", "description": "Whether to show the top bar or not, yes for always showing, no for always not showing, automatic for adjusting to screen size", "default": "automatic" } }, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/application-extension/schema/zen.json ================================================ { "title": "Jupyter Notebook Zen Mode", "description": "Jupyter Notebook Zen Mode", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-view", "items": [ { "command": "application:toggle-zen", "rank": 3 } ] } ] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/application-extension/src/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { ILabStatus, IRouter, ITreePathUpdater, JupyterFrontEnd, JupyterFrontEndPlugin, JupyterLab, } from '@jupyterlab/application'; import { DOMUtils, ICommandPalette, ISanitizer, ISplashScreen, IToolbarWidgetRegistry, showErrorMessage, } from '@jupyterlab/apputils'; import { ConsolePanel } from '@jupyterlab/console'; import { PageConfig, PathExt, URLExt } from '@jupyterlab/coreutils'; import { IDocumentManager, renameDialog } from '@jupyterlab/docmanager'; import { DocumentWidget } from '@jupyterlab/docregistry'; import { IMainMenu } from '@jupyterlab/mainmenu'; import { ILatexTypesetter, IMarkdownParser, IRenderMime, IRenderMimeRegistry, RenderMimeRegistry, standardRendererFactories, } from '@jupyterlab/rendermime'; import { ISettingRegistry } from '@jupyterlab/settingregistry'; import { ITranslator, nullTranslator } from '@jupyterlab/translation'; import { NotebookApp, NotebookShell, INotebookShell, SidePanel, SidePanelHandler, SidePanelPalette, INotebookPathOpener, defaultNotebookPathOpener, } from '@jupyter-notebook/application'; import { jupyterIcon } from '@jupyter-notebook/ui-components'; import { PromiseDelegate } from '@lumino/coreutils'; import { DisposableDelegate, DisposableSet, IDisposable, } from '@lumino/disposable'; import { Menu, Widget } from '@lumino/widgets'; /** * A regular expression to match path to notebooks and documents */ const TREE_PATTERN = new RegExp('/(notebooks|edit)/(.*)'); /** * A regular expression to suppress the file extension from display for .ipynb files. */ const STRIP_IPYNB = /\.ipynb$/; /** * The JupyterLab document manager plugin id. */ const JUPYTERLAB_DOCMANAGER_PLUGIN_ID = '@jupyterlab/docmanager-extension:plugin'; /** * The command IDs used by the application plugin. */ namespace CommandIDs { /** * Duplicate the current document and open the new document */ export const duplicate = 'application:duplicate'; /** * Handle local links */ export const handleLink = 'application:handle-local-link'; /** * Toggle Top Bar visibility */ export const toggleTop = 'application:toggle-top'; /** * Toggle side panel visibility */ export const togglePanel = 'application:toggle-panel'; /** * Toggle the Zen mode */ export const toggleZen = 'application:toggle-zen'; /** * Open JupyterLab */ export const openLab = 'application:open-lab'; /** * Open the tree page. */ export const openTree = 'application:open-tree'; /** * Rename the current document */ export const rename = 'application:rename'; /** * Resolve tree path */ export const resolveTree = 'application:resolve-tree'; } /** * Check if the application is dirty before closing the browser tab. */ const dirty: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:dirty', description: 'Check if the application is dirty before closing the browser tab.', autoStart: true, requires: [ILabStatus, ITranslator], activate: ( app: JupyterFrontEnd, status: ILabStatus, translator: ITranslator ): void => { if (!(app instanceof NotebookApp)) { throw new Error(`${dirty.id} must be activated in Jupyter Notebook.`); } const trans = translator.load('notebook'); const message = trans.__( 'Are you sure you want to exit Jupyter Notebook?\n\nAny unsaved changes will be lost.' ); window.addEventListener('beforeunload', (event) => { if (app.status.isDirty) { return ((event as any).returnValue = message); } }); }, }; /** * The application info. */ const info: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:info', autoStart: true, provides: JupyterLab.IInfo, activate: (app: JupyterFrontEnd): JupyterLab.IInfo => { if (!(app instanceof NotebookApp)) { throw new Error(`${info.id} must be activated in Jupyter Notebook.`); } return app.info; }, }; /** * The logo plugin. */ const logo: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:logo', description: 'The logo plugin.', autoStart: true, activate: (app: JupyterFrontEnd) => { const baseUrl = PageConfig.getBaseUrl(); const node = document.createElement('a'); node.href = `${baseUrl}tree`; node.target = '_blank'; node.rel = 'noopener noreferrer'; const logo = new Widget({ node }); jupyterIcon.element({ container: node, elementPosition: 'center', padding: '2px 2px 2px 8px', height: '28px', width: 'auto', cursor: 'pointer', margin: 'auto', }); logo.id = 'jp-NotebookLogo'; app.shell.add(logo, 'top', { rank: 0 }); }, }; /** * A plugin to open documents in the main area. */ const opener: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:opener', description: 'A plugin to open documents in the main area.', autoStart: true, requires: [IRouter, IDocumentManager], optional: [ISettingRegistry], activate: ( app: JupyterFrontEnd, router: IRouter, docManager: IDocumentManager, settingRegistry: ISettingRegistry | null ): void => { const { commands, docRegistry } = app; const command = 'router:tree'; commands.addCommand(command, { execute: (args: any) => { const parsed = args as IRouter.ILocation; const matches = parsed.path.match(TREE_PATTERN) ?? []; const [, , path] = matches; if (!path) { return; } app.started.then(async () => { const file = decodeURIComponent(path); const urlParams = new URLSearchParams(parsed.search); let defaultFactory = docRegistry.defaultWidgetFactory(path).name; // Explicitly get the default viewers from the settings because // JupyterLab might not have had the time to load the settings yet (race condition) // Relevant code: https://github.com/jupyterlab/jupyterlab/blob/d56ff811f39b3c10c6d8b6eb27a94624b753eb53/packages/docmanager-extension/src/index.tsx#L265-L293 if (settingRegistry) { const settings = await settingRegistry.load( JUPYTERLAB_DOCMANAGER_PLUGIN_ID ); const defaultViewers = settings.get('defaultViewers').composite as { [ft: string]: string; }; // get the file types for the path const types = docRegistry.getFileTypesForPath(path); // for each file type, check if there is a default viewer and if it // is available in the docRegistry. If it is the case, use it as the // default factory types.forEach((ft) => { if ( defaultViewers[ft.name] !== undefined && docRegistry.getWidgetFactory(defaultViewers[ft.name]) ) { defaultFactory = defaultViewers[ft.name]; } }); } const factory = urlParams.get('factory') ?? defaultFactory; docManager.open(file, factory, undefined, { ref: '_noref', }); }); }, }); router.register({ command, pattern: TREE_PATTERN }); }, }; /** * A plugin to customize menus */ const menus: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:menus', description: 'A plugin to customize menus.', requires: [IMainMenu], autoStart: true, activate: (app: JupyterFrontEnd, menu: IMainMenu) => { // always disable the Tabs menu menu.tabsMenu.dispose(); const page = PageConfig.getOption('notebookPage'); switch (page) { case 'consoles': case 'terminals': case 'tree': menu.editMenu.dispose(); menu.kernelMenu.dispose(); menu.runMenu.dispose(); break; case 'edit': menu.kernelMenu.dispose(); menu.runMenu.dispose(); break; default: break; } }, }; /** * A plugin to provide a spacer at rank 900 in the menu area */ const menuSpacer: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:menu-spacer', description: 'A plugin to provide a spacer at rank 900 in the menu area.', autoStart: true, activate: (app: JupyterFrontEnd) => { const menu = new Widget(); menu.id = DOMUtils.createDomID(); menu.addClass('jp-NotebookSpacer'); app.shell.add(menu, 'menu', { rank: 900 }); }, }; /** * Add commands to open the tree and running pages. */ const pages: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:pages', description: 'Add commands to open the tree and running pages.', autoStart: true, requires: [ITranslator], optional: [ICommandPalette], activate: ( app: JupyterFrontEnd, translator: ITranslator, palette: ICommandPalette | null ): void => { const trans = translator.load('notebook'); const baseUrl = PageConfig.getBaseUrl(); app.commands.addCommand(CommandIDs.openLab, { label: trans.__('Open JupyterLab'), execute: () => { window.open(URLExt.join(baseUrl, 'lab')); }, }); const page = PageConfig.getOption('notebookPage'); app.commands.addCommand(CommandIDs.openTree, { label: trans.__('File Browser'), execute: () => { if (page === 'tree') { app.commands.execute('filebrowser:activate'); } else { window.open(URLExt.join(baseUrl, 'tree')); } }, }); if (palette) { palette.addItem({ command: CommandIDs.openLab, category: 'View' }); palette.addItem({ command: CommandIDs.openTree, category: 'View' }); } }, }; /** * A plugin to open paths in new browser tabs. */ const pathOpener: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:path-opener', description: 'A plugin to open paths in new browser tabs.', autoStart: true, provides: INotebookPathOpener, activate: (app: JupyterFrontEnd): INotebookPathOpener => { return defaultNotebookPathOpener; }, }; /** * The default paths for a Jupyter Notebook app. */ const paths: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:paths', description: 'The default paths for a Jupyter Notebook app.', autoStart: true, provides: JupyterFrontEnd.IPaths, activate: (app: JupyterFrontEnd): JupyterFrontEnd.IPaths => { if (!(app instanceof NotebookApp)) { throw new Error(`${paths.id} must be activated in Jupyter Notebook.`); } return app.paths; }, }; /** * A plugin providing a rendermime registry. */ const rendermime: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:rendermime', description: 'A plugin providing a rendermime registry.', autoStart: true, provides: IRenderMimeRegistry, optional: [ IDocumentManager, ILatexTypesetter, ISanitizer, IMarkdownParser, ITranslator, INotebookPathOpener, ], activate: ( app: JupyterFrontEnd, docManager: IDocumentManager | null, latexTypesetter: ILatexTypesetter | null, sanitizer: IRenderMime.ISanitizer | null, markdownParser: IMarkdownParser | null, translator: ITranslator | null, notebookPathOpener: INotebookPathOpener | null ) => { const trans = (translator ?? nullTranslator).load('jupyterlab'); const opener = notebookPathOpener ?? defaultNotebookPathOpener; if (docManager) { app.commands.addCommand(CommandIDs.handleLink, { label: trans.__('Handle Local Link'), execute: (args) => { const path = args['path'] as string | undefined | null; if (path === undefined || path === null) { return; } return docManager.services.contents .get(path, { content: false }) .then((model) => { const baseUrl = PageConfig.getBaseUrl(); opener.open({ prefix: URLExt.join(baseUrl, 'tree'), path: model.path, target: '_blank', }); }); }, }); } return new RenderMimeRegistry({ initialFactories: standardRendererFactories, linkHandler: !docManager ? undefined : { handleLink: (node: HTMLElement, path: string, id?: string) => { // If node has the download attribute explicitly set, use the // default browser downloading behavior. if (node.tagName === 'A' && node.hasAttribute('download')) { return; } app.commandLinker.connectNode(node, CommandIDs.handleLink, { path, id, }); }, }, latexTypesetter: latexTypesetter ?? undefined, markdownParser: markdownParser ?? undefined, translator: translator ?? undefined, sanitizer: sanitizer ?? undefined, }); }, }; /** * The default Jupyter Notebook application shell. */ const shell: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:shell', description: 'The default Jupyter Notebook application shell.', autoStart: true, provides: INotebookShell, optional: [ISettingRegistry], activate: ( app: JupyterFrontEnd, settingRegistry: ISettingRegistry | null ) => { if (!(app.shell instanceof NotebookShell)) { throw new Error(`${shell.id} did not find a NotebookShell instance.`); } const notebookShell = app.shell; if (settingRegistry) { settingRegistry .load(shell.id) .then((settings) => { // Add a layer of customization to support app shell mode const customLayout = settings.composite['layout'] as any; // Restore the layout. void notebookShell.restoreLayout(customLayout); }) .catch((reason) => { console.error('Fail to load settings for the layout restorer.'); console.error(reason); }); } return notebookShell; }, }; /** * The default splash screen provider. */ const splash: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:splash', description: 'Provides an empty splash screen.', autoStart: true, provides: ISplashScreen, activate: (app: JupyterFrontEnd) => { const { restored } = app; const splash = document.createElement('div'); splash.style.position = 'absolute'; splash.style.width = '100%'; splash.style.height = '100%'; splash.style.zIndex = '10'; return { show: (light = true) => { splash.style.backgroundColor = light ? 'white' : '#111111'; document.body.appendChild(splash); return new DisposableDelegate(async () => { await restored; document.body.removeChild(splash); }); }, }; }, }; /** * The default JupyterLab application status provider. */ const status: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:status', description: 'The default JupyterLab application status provider.', autoStart: true, provides: ILabStatus, activate: (app: JupyterFrontEnd) => { if (!(app instanceof NotebookApp)) { throw new Error(`${status.id} must be activated in Jupyter Notebook.`); } return app.status; }, }; /** * A plugin to display the document title in the browser tab title */ const tabTitle: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:tab-title', description: 'A plugin to display the document title in the browser tab title.', autoStart: true, requires: [INotebookShell], activate: (app: JupyterFrontEnd, shell: INotebookShell) => { const setTabTitle = () => { const current = shell.currentWidget; if (current instanceof ConsolePanel) { const update = () => { const title = current.sessionContext.path || current.sessionContext.name; const basename = PathExt.basename(title); // Strip the ".ipynb" suffix from filenames for display in tab titles. document.title = basename.replace(STRIP_IPYNB, ''); }; current.sessionContext.sessionChanged.connect(update); update(); return; } else if (current instanceof DocumentWidget) { const update = () => { const basename = PathExt.basename(current.context.path); document.title = basename.replace(STRIP_IPYNB, ''); }; current.context.pathChanged.connect(update); update(); } }; shell.currentChanged.connect(setTabTitle); setTabTitle(); }, }; /** * A plugin to display and rename the title of a file */ const title: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:title', description: 'A plugin to display and rename the title of a file.', autoStart: true, requires: [INotebookShell, ITranslator], optional: [IDocumentManager, IRouter, IToolbarWidgetRegistry], activate: ( app: JupyterFrontEnd, shell: INotebookShell, translator: ITranslator, docManager: IDocumentManager | null, router: IRouter | null, toolbarRegistry: IToolbarWidgetRegistry | null ) => { const { commands } = app; const trans = translator.load('notebook'); const node = document.createElement('div'); if (toolbarRegistry) { toolbarRegistry.addFactory('TopBar', 'widgetTitle', (toolbar) => { const widget = new Widget({ node }); widget.id = 'jp-title'; return widget; }); } const addTitle = async (): Promise => { const current = shell.currentWidget; if (!current || !(current instanceof DocumentWidget)) { return; } if (node.children.length > 0) { return; } const h = document.createElement('h1'); h.textContent = current.title.label.replace(STRIP_IPYNB, ''); node.appendChild(h); node.style.marginLeft = '10px'; if (!docManager) { return; } const isEnabled = () => { const { currentWidget } = shell; return !!(currentWidget && docManager.contextForWidget(currentWidget)); }; commands.addCommand(CommandIDs.duplicate, { label: () => trans.__('Duplicate'), isEnabled, execute: async () => { if (!isEnabled()) { return; } // Duplicate the file, and open the new file. const result = await docManager.duplicate(current.context.path); await commands.execute('docmanager:open', { path: result.path }); }, }); commands.addCommand(CommandIDs.rename, { label: () => trans.__('Rename…'), isEnabled, execute: async () => { if (!isEnabled()) { return; } try { const result = await renameDialog(docManager, current.context); // activate the current widget to bring the focus if (current) { current.activate(); } if (result === null) { return; } } catch (error) { showErrorMessage( trans.__('Rename Error'), (error as Error).message || trans.__('An error occurred while renaming the file.') ); return; } const newPath = current.context.path; const basename = PathExt.basename(newPath); h.textContent = basename.replace(STRIP_IPYNB, ''); if (!router) { return; } const matches = router.current.path.match(TREE_PATTERN) ?? []; const [, route, path] = matches; if (!route || !path) { return; } const encoded = encodeURIComponent(newPath); router.navigate(`/${route}/${encoded}`, { skipRouting: true, }); }, }); node.onclick = async () => { void commands.execute(CommandIDs.rename); }; }; shell.currentChanged.connect(addTitle); void addTitle(); }, }; /** * Plugin to toggle the top header visibility. */ const topVisibility: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:top', description: 'Plugin to toggle the top header visibility.', requires: [INotebookShell, ITranslator], optional: [ISettingRegistry, ICommandPalette], activate: ( app: JupyterFrontEnd, notebookShell: INotebookShell, translator: ITranslator, settingRegistry: ISettingRegistry | null, palette: ICommandPalette | null ) => { const trans = translator.load('notebook'); const top = notebookShell.top; const pluginId = topVisibility.id; app.commands.addCommand(CommandIDs.toggleTop, { label: trans.__('Show Header'), execute: () => { top.setHidden(top.isVisible); if (settingRegistry) { void settingRegistry.set( pluginId, 'visible', top.isVisible ? 'yes' : 'no' ); } }, isToggled: () => top.isVisible, }); let adjustToScreen = false; if (settingRegistry) { const loadSettings = settingRegistry.load(pluginId); const updateSettings = (settings: ISettingRegistry.ISettings): void => { // 'visible' property from user preferences or default settings let visible = settings.get('visible').composite; if (settings.user.visible !== undefined) { visible = settings.user.visible; } top.setHidden(visible === 'no'); // adjust to screen from user preferences or default settings adjustToScreen = visible === 'automatic'; }; Promise.all([loadSettings, app.restored]) .then(([settings]) => { updateSettings(settings); settings.changed.connect((settings) => { updateSettings(settings); }); }) .catch((reason: Error) => { console.error(reason.message); }); } if (palette) { palette.addItem({ command: CommandIDs.toggleTop, category: 'View' }); } const onChanged = (): void => { if (!adjustToScreen) { return; } if (app.format === 'desktop') { notebookShell.expandTop(); } else { notebookShell.collapseTop(); } }; // listen on format change (mobile and desktop) to make the view more compact app.formatChanged.connect(onChanged); }, autoStart: true, }; /** * Plugin to toggle the left or right side panel's visibility. */ const sidePanelVisibility: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:sidepanel', description: 'Plugin to toggle the visibility of left or right side panel.', requires: [INotebookShell, ITranslator], optional: [IMainMenu, ICommandPalette], autoStart: true, activate: ( app: JupyterFrontEnd, notebookShell: INotebookShell, translator: ITranslator, menu: IMainMenu | null, palette: ICommandPalette | null ) => { const trans = translator.load('notebook'); /* Arguments for togglePanel command: * side, left or right area * title, widget title to show in the menu * id, widget ID to activate in the side panel */ app.commands.addCommand(CommandIDs.togglePanel, { label: (args) => args['title'] as string, caption: (args) => { // We do not substitute the parameter into the string because the parameter is not // localized (e.g., it is always 'left') even though the string is localized. if (args['side'] === 'left') { return trans.__( 'Show %1 in the left sidebar', args['title'] as string ); } else if (args['side'] === 'right') { return trans.__( 'Show %1 in the right sidebar', args['title'] as string ); } return trans.__('Show %1 in the sidebar', args['title'] as string); }, execute: (args) => { switch (args['side'] as string) { case 'left': if (notebookShell.leftCollapsed) { notebookShell.expandLeft(args.id as string); } else if ( notebookShell.leftHandler.currentWidget?.id !== args.id ) { notebookShell.expandLeft(args.id as string); } else { notebookShell.collapseLeft(); if (notebookShell.currentWidget) { notebookShell.activateById(notebookShell.currentWidget.id); } } break; case 'right': if (notebookShell.rightCollapsed) { notebookShell.expandRight(args.id as string); } else if ( notebookShell.rightHandler.currentWidget?.id !== args.id ) { notebookShell.expandRight(args.id as string); } else { notebookShell.collapseRight(); if (notebookShell.currentWidget) { notebookShell.activateById(notebookShell.currentWidget.id); } } break; } }, isToggled: (args) => { switch (args['side'] as string) { case 'left': { if (notebookShell.leftCollapsed) { return false; } const currentWidget = notebookShell.leftHandler.currentWidget; if (!currentWidget) { return false; } return currentWidget.id === (args['id'] as string); } case 'right': { if (notebookShell.rightCollapsed) { return false; } const currentWidget = notebookShell.rightHandler.currentWidget; if (!currentWidget) { return false; } return currentWidget.id === (args['id'] as string); } } return false; }, }); const sidePanelMenu: { [area in SidePanel.Area]: IDisposable | null } = { left: null, right: null, }; /** * The function which adds entries to the View menu for each widget of a side panel. * * @param area - 'left' or 'right', the area of the side panel. * @param entryLabel - the name of the main entry in the View menu for that side panel. * @returns - The disposable menu added to the View menu or null. */ const updateMenu = (area: SidePanel.Area, entryLabel: string) => { if (menu === null) { return null; } // Remove the previous menu entry for this side panel. sidePanelMenu[area]?.dispose(); // Creates a new menu entry and populates it with side panel widgets. const newMenu = new Menu({ commands: app.commands }); newMenu.title.label = entryLabel; const widgets = notebookShell.widgets(area); let menuToAdd = false; for (const widget of widgets) { newMenu.addItem({ command: CommandIDs.togglePanel, args: { side: area, title: `Show ${widget.title.caption}`, id: widget.id, }, }); menuToAdd = true; } // If there are widgets, add the menu to the main menu entry. if (menuToAdd) { sidePanelMenu[area] = menu.viewMenu.addItem({ type: 'submenu', submenu: newMenu, }); } }; app.restored.then(() => { // Create menu entries for the left and right panel. if (menu) { const getSidePanelLabel = (area: SidePanel.Area): string => { if (area === 'left') { return trans.__('Left Sidebar'); } else { return trans.__('Right Sidebar'); } }; const leftArea = notebookShell.leftHandler.area; const leftLabel = getSidePanelLabel(leftArea); updateMenu(leftArea, leftLabel); const rightArea = notebookShell.rightHandler.area; const rightLabel = getSidePanelLabel(rightArea); updateMenu(rightArea, rightLabel); const handleSidePanelChange = ( sidePanel: SidePanelHandler, widget: Widget ) => { const label = getSidePanelLabel(sidePanel.area); updateMenu(sidePanel.area, label); }; notebookShell.leftHandler.widgetAdded.connect(handleSidePanelChange); notebookShell.leftHandler.widgetRemoved.connect(handleSidePanelChange); notebookShell.rightHandler.widgetAdded.connect(handleSidePanelChange); notebookShell.rightHandler.widgetRemoved.connect(handleSidePanelChange); } // Add palette entries for side panels. if (palette) { const sidePanelPalette = new SidePanelPalette({ commandPalette: palette as ICommandPalette, command: CommandIDs.togglePanel, }); notebookShell.leftHandler.widgets.forEach((widget) => { sidePanelPalette.addItem(widget, notebookShell.leftHandler.area); }); notebookShell.rightHandler.widgets.forEach((widget) => { sidePanelPalette.addItem(widget, notebookShell.rightHandler.area); }); // Update menu and palette when widgets are added or removed from side panels. notebookShell.leftHandler.widgetAdded.connect((sidePanel, widget) => { sidePanelPalette.addItem(widget, sidePanel.area); }); notebookShell.leftHandler.widgetRemoved.connect((sidePanel, widget) => { sidePanelPalette.removeItem(widget, sidePanel.area); }); notebookShell.rightHandler.widgetAdded.connect((sidePanel, widget) => { sidePanelPalette.addItem(widget, sidePanel.area); }); notebookShell.rightHandler.widgetRemoved.connect( (sidePanel, widget) => { sidePanelPalette.removeItem(widget, sidePanel.area); } ); } }); }, }; /** * A plugin for defining keyboard shortcuts specific to the notebook application. */ const shortcuts: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:shortcuts', description: 'A plugin for defining keyboard shortcuts specific to the notebook application.', autoStart: true, activate: (app: JupyterFrontEnd) => { // for now this plugin is mostly useful for defining keyboard shortcuts // specific to the notebook application }, }; /** * The default tree route resolver plugin. */ const tree: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:tree-resolver', description: 'The default tree route resolver plugin.', autoStart: true, requires: [IRouter], provides: JupyterFrontEnd.ITreeResolver, activate: ( app: JupyterFrontEnd, router: IRouter ): JupyterFrontEnd.ITreeResolver => { const { commands } = app; const set = new DisposableSet(); const delegate = new PromiseDelegate(); const treePattern = new RegExp('/(/tree/.*)?'); set.add( commands.addCommand(CommandIDs.resolveTree, { execute: (async (args: IRouter.ILocation) => { if (set.isDisposed) { return; } const query = URLExt.queryStringToObject(args.search ?? ''); const browser = query['file-browser-path'] || ''; // Remove the file browser path from the query string. delete query['file-browser-path']; // Clean up artifacts immediately upon routing. set.dispose(); delegate.resolve({ browser, file: PageConfig.getOption('treePath') }); }) as (args: any) => Promise, }) ); set.add( router.register({ command: CommandIDs.resolveTree, pattern: treePattern }) ); // If a route is handled by the router without the tree command being // invoked, resolve to `null` and clean up artifacts. const listener = () => { if (set.isDisposed) { return; } set.dispose(); delegate.resolve(null); }; router.routed.connect(listener); set.add( new DisposableDelegate(() => { router.routed.disconnect(listener); }) ); return { paths: delegate.promise }; }, }; /** * Plugin to update tree path. */ const treePathUpdater: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:tree-updater', description: 'Plugin to update tree path.', requires: [IRouter], provides: ITreePathUpdater, activate: (app: JupyterFrontEnd, router: IRouter) => { function updateTreePath(treePath: string) { if (treePath !== PageConfig.getOption('treePath')) { const path = URLExt.join( PageConfig.getOption('baseUrl') || '/', 'tree', URLExt.encodeParts(treePath) ); router.navigate(path, { skipRouting: true }); // Persist the new tree path to PageConfig as it is used elsewhere at runtime. PageConfig.setOption('treePath', treePath); } } return updateTreePath; }, autoStart: true, }; /** * Translator plugin */ const translator: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:translator', description: 'Translator plugin', requires: [INotebookShell, ITranslator], autoStart: true, activate: ( app: JupyterFrontEnd, notebookShell: INotebookShell, translator: ITranslator ) => { notebookShell.translator = translator; }, }; /** * Zen mode plugin */ const zen: JupyterFrontEndPlugin = { id: '@jupyter-notebook/application-extension:zen', description: 'Zen mode plugin.', autoStart: true, requires: [ITranslator], optional: [ICommandPalette, INotebookShell], activate: ( app: JupyterFrontEnd, translator: ITranslator, palette: ICommandPalette | null, notebookShell: INotebookShell | null ): void => { const { commands } = app; const elem = document.documentElement; const trans = translator.load('notebook'); const toggleOn = () => { notebookShell?.collapseTop(); notebookShell?.menu.setHidden(true); zenModeEnabled = true; }; const toggleOff = () => { notebookShell?.expandTop(); notebookShell?.menu.setHidden(false); zenModeEnabled = false; }; let zenModeEnabled = false; commands.addCommand(CommandIDs.toggleZen, { label: trans.__('Toggle Zen Mode'), execute: () => { if (!zenModeEnabled) { elem.requestFullscreen(); toggleOn(); } else { document.exitFullscreen(); toggleOff(); } }, }); document.addEventListener('fullscreenchange', () => { if (!document.fullscreenElement) { toggleOff(); } }); if (palette) { palette.addItem({ command: CommandIDs.toggleZen, category: 'Mode' }); } }, }; /** * Export the plugins as default. */ const plugins: JupyterFrontEndPlugin[] = [ dirty, info, logo, menus, menuSpacer, opener, pages, pathOpener, paths, rendermime, shell, sidePanelVisibility, shortcuts, splash, status, tabTitle, title, topVisibility, tree, treePathUpdater, translator, zen, ]; export default plugins; ================================================ FILE: packages/application-extension/style/base.css ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ .jp-NotebookSpacer { flex-grow: 1; flex-shrink: 1; } .jp-MainAreaWidget { height: 100%; } .jp-Toolbar > .jp-Toolbar-item { height: unset; } #jp-UserMenu { flex: 0 0 auto; display: flex; text-align: center; margin-top: 8px; } .jp-MimeDocument .jp-RenderedJSON { background: var(--jp-layout-color0); } /* Hide the stub toolbar that appears above terminals and documents */ .jp-MainAreaWidget > .jp-Toolbar-micro { display: none; } #jp-NotebookLogo { /* bring logo to the front so it is selectable by tab*/ z-index: 10; } /* Hide the notification status item */ .jp-Notification-Status { display: none; } ================================================ FILE: packages/application-extension/style/index.css ================================================ @import url('~@jupyter-notebook/application/style/index.css'); @import url('~@lumino/widgets/style/index.css'); @import url('./base.css'); ================================================ FILE: packages/application-extension/style/index.js ================================================ import '@jupyter-notebook/application/style/index.js'; import '@lumino/widgets/style/index.js'; import './base.css'; ================================================ FILE: packages/application-extension/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"], "references": [ { "path": "../application" }, { "path": "../ui-components" } ] } ================================================ FILE: packages/console-extension/package.json ================================================ { "name": "@jupyter-notebook/console-extension", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Console Extension", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/**/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "watch": "tsc -b --watch" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/apputils": "~4.7.0-alpha.4", "@jupyterlab/console": "~4.6.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/notebook": "~4.6.0-alpha.4", "@jupyterlab/translation": "~4.6.0-alpha.4", "@jupyterlab/ui-components": "~4.6.0-alpha.4", "@lumino/algorithm": "^2.0.4", "@lumino/coreutils": "^2.2.2", "@lumino/widgets": "^2.7.2" }, "devDependencies": { "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "extension": true, "schemaDir": "schema" }, "styleModule": "style/index.js" } ================================================ FILE: packages/console-extension/schema/scratchpad-console.json ================================================ { "title": "Jupyter Notebook Scratchpad Console", "description": "Jupyter Notebook Scratchpad Console", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-file", "items": [ { "type": "submenu", "submenu": { "id": "jp-mainmenu-file-new", "items": [ { "command": "scratchpad-console:open", "rank": 2, "args": { "isMenu": true } } ] } } ] } ] }, "jupyter.lab.shortcuts": [ { "command": "scratchpad-console:open", "keys": ["Accel B"], "selector": "body" } ], "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/console-extension/src/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { IRouter, JupyterFrontEnd, JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { ICommandPalette } from '@jupyterlab/apputils'; import { IConsoleTracker } from '@jupyterlab/console'; import { PageConfig, URLExt } from '@jupyterlab/coreutils'; import { INotebookTracker } from '@jupyterlab/notebook'; import { ITranslator, nullTranslator } from '@jupyterlab/translation'; import { consoleIcon } from '@jupyterlab/ui-components'; import { INotebookPathOpener, INotebookShell, defaultNotebookPathOpener, } from '@jupyter-notebook/application'; import { find } from '@lumino/algorithm'; import { ReadonlyJSONObject } from '@lumino/coreutils'; import { Widget } from '@lumino/widgets'; /** * A plugin to open consoles in a new tab */ const opener: JupyterFrontEndPlugin = { id: '@jupyter-notebook/console-extension:opener', requires: [IRouter], autoStart: true, description: 'A plugin to open consoles in a new tab', activate: (app: JupyterFrontEnd, router: IRouter) => { const { commands } = app; const consolePattern = new RegExp('/consoles/(.*)'); const command = 'router:console'; commands.addCommand(command, { execute: (args: any) => { const parsed = args as IRouter.ILocation; const matches = parsed.path.match(consolePattern); if (!matches) { return; } const [, match] = matches; if (!match) { return; } const path = decodeURIComponent(match); commands.execute('console:create', { path }); }, }); router.register({ command, pattern: consolePattern }); }, }; /** * Open consoles in a new tab or in the side panel (scratchpad like). */ const redirect: JupyterFrontEndPlugin = { id: '@jupyter-notebook/console-extension:redirect', requires: [IConsoleTracker], optional: [INotebookPathOpener, INotebookShell, INotebookTracker], autoStart: true, description: 'Open consoles in a new tab', activate: ( app: JupyterFrontEnd, tracker: IConsoleTracker, notebookPathOpener: INotebookPathOpener | null, notebookShell: INotebookShell | null, notebookTracker: INotebookTracker | null ) => { const baseUrl = PageConfig.getBaseUrl(); const opener = notebookPathOpener ?? defaultNotebookPathOpener; tracker.widgetAdded.connect(async (send, console) => { // Check if we should open the console in side panel: // - this is a notebook view // - the notebook and the console share the same kernel // Otherwise, the console opens in a new tab. if (notebookShell && notebookTracker) { const notebook = notebookTracker.currentWidget; // Wait for the notebook and console to be ready. await Promise.all([ notebook?.sessionContext.ready, console.sessionContext.ready, ]); const notebookKernelId = notebook?.sessionContext.session?.kernel?.id; const consoleKernelId = console.sessionContext.session?.kernel?.id; if (notebookKernelId === consoleKernelId) { notebookShell.add(console, 'right'); notebookShell.expandRight(console.id); return; } } const { sessionContext } = console; await sessionContext.ready; const widget = find( app.shell.widgets('main'), (w) => w.id === console.id ); if (widget) { // bail if the console is already added to the main area return; } opener.open({ prefix: URLExt.join(baseUrl, 'consoles'), path: sessionContext.path, target: '_blank', }); // the widget is not needed anymore console.dispose(); }); }, }; /** * Open consoles in the side panel. */ const scratchpadConsole: JupyterFrontEndPlugin = { id: '@jupyter-notebook/console-extension:scratchpad-console', requires: [INotebookTracker], optional: [INotebookShell, ICommandPalette, ITranslator], autoStart: true, description: 'Open scratchpad console in side panel', activate: ( app: JupyterFrontEnd, tracker: INotebookTracker, notebookShell: INotebookShell | null, palette: ICommandPalette | null, translator: ITranslator | null ) => { const { commands } = app; const manager = app.serviceManager; const trans = (translator ?? nullTranslator).load('notebook'); const command = 'scratchpad-console:open'; commands.addCommand(command, { label: (args) => args['isPalette'] ? trans.__('Open a scratchpad console') : trans.__('Scratchpad console'), isVisible: () => !!tracker.currentWidget, icon: (args) => (args['isPalette'] ? undefined : consoleIcon), execute: async (args) => { if (!notebookShell) { return; } const consoleId = scratchpadConsole.id; const sidebar = notebookShell.rightHandler; // Close the console if it is already opened (shortcut only). if (sidebar.isVisible && sidebar.currentWidget?.id === consoleId) { if (!args.isPalette && !args.isMenu) { notebookShell.collapseRight(); notebookShell.currentWidget?.activate(); } return; } let panel: Widget | undefined = sidebar.widgets.find( (w) => w.id === consoleId ); // Create the widget if it is not already in the right area. if (!panel) { const notebook = tracker.currentWidget; if (!notebook) { return; } const notebookSessionContext = notebook.sessionContext; await Promise.all([notebookSessionContext.ready, manager.ready]); const id = notebookSessionContext.session?.kernel?.id; const kernelPref = notebookSessionContext.kernelPreference; panel = await commands.execute('console:create', { kernelPreference: { ...kernelPref, id } as ReadonlyJSONObject, preventTitleUpdate: true, }); if (!panel) { console.error( 'An error occurred during scratchpad console creation' ); return; } panel.title.caption = trans.__('Console'); panel.id = consoleId; } else { notebookShell.expandRight(consoleId); } }, describedBy: { args: { type: 'object', properties: { isPalette: { type: 'boolean', description: trans.__( 'Whether the command is executed from the palette' ), }, isMenu: { type: 'boolean', description: trans.__( 'Whether the command is executed from the menu' ), }, }, }, }, }); if (palette) { palette.addItem({ category: 'Notebook Console', command, args: { isPalette: true }, }); } }, }; /** * Export the plugins as default. */ const plugins: JupyterFrontEndPlugin[] = [ opener, redirect, scratchpadConsole, ]; export default plugins; ================================================ FILE: packages/console-extension/style/base.css ================================================ ================================================ FILE: packages/console-extension/style/index.css ================================================ @import url('./base.css'); ================================================ FILE: packages/console-extension/style/index.js ================================================ import './base.css'; ================================================ FILE: packages/console-extension/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"], "references": [ { "path": "../application" } ] } ================================================ FILE: packages/docmanager-extension/package.json ================================================ { "name": "@jupyter-notebook/docmanager-extension", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Document Manager Extension", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/**/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "watch": "tsc -b --watch" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/docmanager": "~4.6.0-alpha.4", "@jupyterlab/docregistry": "~4.6.0-alpha.4", "@jupyterlab/services": "~7.6.0-alpha.4", "@lumino/algorithm": "^2.0.4", "@lumino/signaling": "^2.1.5" }, "devDependencies": { "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "extension": true }, "styleModule": "style/index.js" } ================================================ FILE: packages/docmanager-extension/src/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { JupyterFrontEnd, JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { PageConfig, PathExt, URLExt } from '@jupyterlab/coreutils'; import { IDocumentWidgetOpener } from '@jupyterlab/docmanager'; import { IDocumentWidget, DocumentRegistry } from '@jupyterlab/docregistry'; import { INotebookPathOpener, INotebookShell, defaultNotebookPathOpener, } from '@jupyter-notebook/application'; import { Signal } from '@lumino/signaling'; /** * A plugin to open documents in a new browser tab. * */ const opener: JupyterFrontEndPlugin = { id: '@jupyter-notebook/docmanager-extension:opener', autoStart: true, optional: [INotebookPathOpener, INotebookShell], provides: IDocumentWidgetOpener, description: 'Open documents in a new browser tab', activate: ( app: JupyterFrontEnd, notebookPathOpener: INotebookPathOpener, notebookShell: INotebookShell | null ) => { const baseUrl = PageConfig.getBaseUrl(); const docRegistry = app.docRegistry; const pathOpener = notebookPathOpener ?? defaultNotebookPathOpener; let id = 0; return new (class { async open( widget: IDocumentWidget, options?: DocumentRegistry.IOpenOptions ) { const widgetName = options?.type ?? ''; const ref = options?.ref; // check if there is an setting override and if it would add the widget in the main area const userLayoutArea = notebookShell?.userLayout?.[widgetName]?.area; if (ref !== '_noref' && userLayoutArea === undefined) { const path = widget.context.path; const ext = PathExt.extname(path); let route = 'edit'; if ( (widgetName === 'default' && ext === '.ipynb') || widgetName.includes('Notebook') ) { // make sure to save the notebook before opening it in a new tab // so the kernel info is saved (if created from the New dropdown) if (widget.context.sessionContext.kernelPreference.name) { await widget.context.save(); } route = 'notebooks'; } // append ?factory only if it's not the default const defaultFactory = docRegistry.defaultWidgetFactory(path); let searchParams = undefined; if (widgetName !== defaultFactory.name) { searchParams = new URLSearchParams({ factory: widgetName, }); } pathOpener.open({ prefix: URLExt.join(baseUrl, route), path, searchParams, }); // dispose the widget since it is not used on this page widget.dispose(); return; } // otherwise open the document on the current page if (!widget.id) { widget.id = `document-manager-${++id}`; } widget.title.dataset = { type: 'document-title', ...widget.title.dataset, }; if (!widget.isAttached) { app.shell.add(widget, 'main', options || {}); } app.shell.activateById(widget.id); this._opened.emit(widget); } get opened() { return this._opened; } private _opened = new Signal(this); })(); }, }; /** * Export the plugins as default. */ const plugins: JupyterFrontEndPlugin[] = [opener]; export default plugins; ================================================ FILE: packages/docmanager-extension/style/base.css ================================================ .jp-Document { height: 100%; } ================================================ FILE: packages/docmanager-extension/style/index.css ================================================ @import url('./base.css'); ================================================ FILE: packages/docmanager-extension/style/index.js ================================================ import './base.css'; ================================================ FILE: packages/docmanager-extension/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"], "references": [ { "path": "../application" } ] } ================================================ FILE: packages/documentsearch-extension/package.json ================================================ { "name": "@jupyter-notebook/documentsearch-extension", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Document Search Extension", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/**/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "watch": "tsc -b --watch" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/documentsearch": "~4.6.0-alpha.4", "@lumino/widgets": "^2.7.2" }, "devDependencies": { "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "extension": true, "schemaDir": "schema" }, "styleModule": "style/index.js" } ================================================ FILE: packages/documentsearch-extension/src/index.ts ================================================ import { JupyterFrontEnd, JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { ISearchProviderRegistry } from '@jupyterlab/documentsearch'; import { Widget } from '@lumino/widgets'; import { INotebookShell } from '@jupyter-notebook/application'; const SEARCHABLE_CLASS = 'jp-mod-searchable'; /** * A plugin to add document search functionalities. */ const notebookShellWidgetListener: JupyterFrontEndPlugin = { id: '@jupyter-notebook/documentsearch-extension:notebookShellWidgetListener', requires: [INotebookShell, ISearchProviderRegistry], autoStart: true, description: 'A plugin to add document search functionalities', activate: ( app: JupyterFrontEnd, notebookShell: INotebookShell, registry: ISearchProviderRegistry ) => { // If a given widget is searchable, apply the searchable class. // If it's not searchable, remove the class. const transformWidgetSearchability = (widget: Widget | null) => { if (!widget) { return; } if (registry.hasProvider(widget)) { widget.addClass(SEARCHABLE_CLASS); } else { widget.removeClass(SEARCHABLE_CLASS); } }; // Update searchability of the active widget when the registry // changes, in case a provider for the current widget was added // or removed registry.changed.connect(() => transformWidgetSearchability(notebookShell.currentWidget) ); // Apply the searchable class only to the active widget if it is actually // searchable. Remove the searchable class from a widget when it's // no longer active. notebookShell.currentChanged.connect((_, args) => { if (notebookShell.currentWidget) { transformWidgetSearchability(notebookShell.currentWidget); } }); }, }; /** * Export the plugins as default. */ const plugins: JupyterFrontEndPlugin[] = [notebookShellWidgetListener]; export default plugins; ================================================ FILE: packages/documentsearch-extension/style/base.css ================================================ ================================================ FILE: packages/documentsearch-extension/style/index.css ================================================ @import url('./base.css'); ================================================ FILE: packages/documentsearch-extension/style/index.js ================================================ import './base.css'; ================================================ FILE: packages/documentsearch-extension/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"] } ================================================ FILE: packages/help-extension/package.json ================================================ { "name": "@jupyter-notebook/help-extension", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Help Extension", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/**/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "watch": "tsc -b --watch" }, "dependencies": { "@jupyter-notebook/ui-components": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/apputils": "~4.7.0-alpha.4", "@jupyterlab/mainmenu": "~4.6.0-alpha.4", "@jupyterlab/translation": "~4.6.0-alpha.4", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "extension": true, "schemaDir": "schema" }, "styleModule": "style/index.js" } ================================================ FILE: packages/help-extension/schema/open.json ================================================ { "title": "Jupyter Notebook Help Menu Entries", "description": "Jupyter Notebook Help Menu Entries", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-help", "items": [ { "command": "help:about", "rank": 0 }, { "type": "separator", "rank": 1 } ] } ] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/help-extension/src/index.tsx ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { JupyterFrontEnd, JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { Dialog, ICommandPalette } from '@jupyterlab/apputils'; import { IMainMenu } from '@jupyterlab/mainmenu'; import { ITranslator } from '@jupyterlab/translation'; import { jupyterIcon } from '@jupyter-notebook/ui-components'; import * as React from 'react'; /** * A list of resources to show in the help menu. */ const RESOURCES = [ { text: 'About Jupyter', url: 'https://jupyter.org', }, { text: 'Markdown Reference', url: 'https://commonmark.org/help/', }, { text: 'Documentation', url: 'https://jupyter-notebook.readthedocs.io/en/stable/', }, ]; /** * The command IDs used by the help plugin. */ namespace CommandIDs { export const open = 'help:open'; export const about = 'help:about'; } /** * A plugin to open the about section with resources. */ const open: JupyterFrontEndPlugin = { id: '@jupyter-notebook/help-extension:open', autoStart: true, description: 'A plugin to open the about section with resources', activate: (app: JupyterFrontEnd): void => { const { commands } = app; commands.addCommand(CommandIDs.open, { label: (args) => args['text'] as string, execute: (args) => { const url = args['url'] as string; window.open(url); }, }); }, }; /** * Plugin to add a command to show an About Jupyter Notebook and Markdown Reference. */ const about: JupyterFrontEndPlugin = { id: '@jupyter-notebook/help-extension:about', autoStart: true, requires: [ITranslator], optional: [IMainMenu, ICommandPalette], description: 'Plugin to add a command to show an About Jupyter Notebook and Markdown Reference', activate: ( app: JupyterFrontEnd, translator: ITranslator, menu: IMainMenu | null, palette: ICommandPalette | null ): void => { const { commands } = app; const trans = translator.load('notebook'); const category = trans.__('Help'); commands.addCommand(CommandIDs.about, { label: trans.__('About %1', app.name), execute: () => { const title = ( <> ); const notebookURL = 'https://github.com/jupyter/notebook'; const contributorURL = 'https://github.com/jupyter/notebook/pulse'; const aboutJupyter = trans.__('JUPYTER NOTEBOOK ON GITHUB'); const contributorList = trans.__('CONTRIBUTOR LIST'); const externalLinks = ( {aboutJupyter} {contributorList} ); const version = trans.__('Version: %1', app.version); const copyright = trans.__('© 2021-2025 Jupyter Notebook Contributors'); const body = ( <> {version}
{externalLinks}
{copyright} ); const dialog = new Dialog({ title, body, buttons: [ Dialog.createButton({ label: trans.__('Dismiss'), className: 'jp-AboutNotebook-about-button jp-mod-reject jp-mod-styled', }), ], }); dialog.addClass('jp-AboutNotebook'); void dialog.launch(); }, }); if (palette) { palette.addItem({ command: CommandIDs.about, category }); } const resourcesGroup = RESOURCES.map((args) => ({ args, command: CommandIDs.open, })); if (menu) { menu.helpMenu.addGroup(resourcesGroup, 30); } }, }; const plugins: JupyterFrontEndPlugin[] = [open, about]; export default plugins; ================================================ FILE: packages/help-extension/style/base.css ================================================ .jp-AboutNotebook .jp-Dialog-header { justify-content: center; padding: 0; } .jp-AboutNotebook-header { display: flex; flex-direction: row; align-items: center; padding: var(--jp-flat-button-padding); } .jp-AboutNotebook-header-text { margin-left: 16px; } .jp-AboutNotebook-version { color: var(--jp-ui-font-color1); font-size: var(--jp-ui-font-size1); padding-bottom: 30px; font-weight: 400; letter-spacing: 0.4px; line-height: 1.12; min-width: 360px; text-align: center; } .jp-AboutNotebook-body { display: flex; font-size: var(--jp-ui-font-size2); padding: var(--jp-flat-button-padding); color: var(--jp-ui-font-color1); text-align: center; flex-direction: column; min-width: 360px; overflow: hidden; } .jp-AboutNotebook-about-body pre { white-space: pre-wrap; } .jp-AboutNotebook-about-externalLinks { display: flex; flex-direction: column; justify-content: flex-start; align-items: flex-start; color: var(--jp-warn-color0); } .jp-AboutNotebook-about-copyright { padding-top: 25px; } ================================================ FILE: packages/help-extension/style/index.css ================================================ @import url('./base.css'); ================================================ FILE: packages/help-extension/style/index.js ================================================ import './base.css'; ================================================ FILE: packages/help-extension/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"], "references": [ { "path": "../ui-components" } ] } ================================================ FILE: packages/lab-extension/package.json ================================================ { "name": "@jupyter-notebook/lab-extension", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Lab Extension", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/index.js" ], "scripts": { "build": "jlpm run build:labextension:dev", "build:labextension": "jupyter labextension build .", "build:labextension:dev": "jupyter labextension build --development True .", "build:lib": "tsc -b", "build:prod": "jlpm run build:labextension", "clean": "jlpm run clean:lib && jlpm run clean:labextension", "clean:labextension": "rimraf ../../notebook/labextension", "clean:lib": "rimraf lib tsconfig.tsbuildinfo", "watch": "run-p watch:src watch:labextension", "watch:labextension": "jupyter labextension watch .", "watch:src": "tsc -w" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/apputils": "~4.7.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/docregistry": "~4.6.0-alpha.4", "@jupyterlab/notebook": "~4.6.0-alpha.4", "@jupyterlab/translation": "~4.6.0-alpha.4", "@jupyterlab/ui-components": "~4.6.0-alpha.4", "@lumino/commands": "^2.3.3", "@lumino/disposable": "^2.1.5" }, "devDependencies": { "@jupyterlab/builder": "~4.6.0-alpha.4", "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "extension": true, "outputDir": "../../notebook/labextension", "schemaDir": "schema" }, "nx": { "targets": { "build:labextension:dev": { "dependsOn": [ "^build:lib", "build:lib" ], "outputs": [ "{workspaceRoot}/notebook/labextension", "{workspaceRoot}/notebook/labextension/build_log.json" ] }, "build:labextension": { "dependsOn": [ "^build:lib", "build:lib" ], "outputs": [ "{workspaceRoot}/notebook/labextension" ] }, "build": { "dependsOn": [ "build:labextension:dev" ] }, "build:prod": { "dependsOn": [ "build:labextension" ] } } }, "styleModule": "style/index.js" } ================================================ FILE: packages/lab-extension/schema/interface-switcher.json ================================================ { "title": "Interface Switcher", "description": "Interface Switcher settings.", "jupyter.lab.toolbars": { "Notebook": [{ "name": "interfaceSwitcher", "rank": 990 }] }, "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-view", "items": [ { "command": "jupyter-notebook:open-notebook", "rank": 10, "args": { "isMenu": true } }, { "command": "jupyter-notebook:open-lab", "rank": 10, "args": { "isMenu": true } }, { "command": "jupyter-notebook:open-nbclassic", "rank": 10, "args": { "isMenu": true } } ] } ] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/lab-extension/schema/launch-tree.json ================================================ { "title": "Launch Shortcuts", "description": "Launch Shortcuts.", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-help", "items": [ { "command": "jupyter-notebook:launch-tree", "rank": 1 } ] } ] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/lab-extension/src/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { ILabShell, JupyterFrontEnd, JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { ICommandPalette, IToolbarWidgetRegistry } from '@jupyterlab/apputils'; import { PageConfig, URLExt } from '@jupyterlab/coreutils'; import { INotebookTracker, NotebookPanel } from '@jupyterlab/notebook'; import { ITranslator } from '@jupyterlab/translation'; import { Menu, MenuBar, Widget } from '@lumino/widgets'; import { defaultNotebookPathOpener, INotebookPathOpener, INotebookShell, } from '@jupyter-notebook/application'; import { caretDownIcon, CommandToolbarButton, launchIcon, } from '@jupyterlab/ui-components'; /** * The command IDs used by the application plugin. */ namespace CommandIDs { /** * Launch Jupyter Notebook Tree */ export const launchNotebookTree = 'jupyter-notebook:launch-tree'; /** * Open Jupyter Notebook */ export const openNotebook = 'jupyter-notebook:open-notebook'; /** * Open in JupyterLab */ export const openLab = 'jupyter-notebook:open-lab'; /** * Open in NbClassic */ export const openNbClassic = 'jupyter-notebook:open-nbclassic'; } interface ISwitcherChoice { command: string; commandLabel: string; commandDescription: string; buttonLabel: string; urlPrefix: string; } /** * A plugin to add custom toolbar items to the notebook page */ const interfaceSwitcher: JupyterFrontEndPlugin = { id: '@jupyter-notebook/lab-extension:interface-switcher', description: 'A plugin to add custom toolbar items to the notebook page.', autoStart: true, requires: [ITranslator], optional: [ INotebookTracker, ICommandPalette, INotebookPathOpener, INotebookShell, ILabShell, IToolbarWidgetRegistry, ], activate: ( app: JupyterFrontEnd, translator: ITranslator, notebookTracker: INotebookTracker | null, palette: ICommandPalette | null, notebookPathOpener: INotebookPathOpener | null, notebookShell: INotebookShell | null, labShell: ILabShell | null, toolbarRegistry: IToolbarWidgetRegistry | null ) => { if (!notebookTracker) { // bail if trying to use this plugin without a notebook tracker return; } const { commands, shell } = app; const baseUrl = PageConfig.getBaseUrl(); const trans = translator.load('notebook'); const nbClassicEnabled = PageConfig.getOption('nbclassic_enabled') === 'true'; const switcher = new Menu({ commands }); const switcherOptions: ISwitcherChoice[] = []; const opener = notebookPathOpener ?? defaultNotebookPathOpener; if (!notebookShell) { switcherOptions.push({ command: CommandIDs.openNotebook, commandLabel: trans.__('Notebook'), commandDescription: trans.__('Open in %1', 'Jupyter Notebook'), buttonLabel: 'openNotebook', urlPrefix: `${baseUrl}tree`, }); } if (!labShell) { switcherOptions.push({ command: CommandIDs.openLab, commandLabel: trans.__('JupyterLab'), commandDescription: trans.__('Open in %1', 'JupyterLab'), buttonLabel: 'openLab', urlPrefix: `${baseUrl}doc/tree`, }); } if (nbClassicEnabled) { switcherOptions.push({ command: CommandIDs.openNbClassic, commandLabel: trans.__('NbClassic'), commandDescription: trans.__('Open in %1', 'NbClassic'), buttonLabel: 'openNbClassic', urlPrefix: `${baseUrl}nbclassic/notebooks`, }); } const isEnabled = () => { return ( notebookTracker.currentWidget !== null && notebookTracker.currentWidget === shell.currentWidget ); }; const addSwitcherCommand = (option: ISwitcherChoice) => { const { command, commandLabel, commandDescription, urlPrefix } = option; const execute = () => { const current = notebookTracker.currentWidget; if (!current) { return; } opener.open({ prefix: urlPrefix, path: current.context.path, }); }; commands.addCommand(command, { label: (args) => { if (args.noLabel) { return ''; } if (args.isMenu || args.isPalette) { return commandDescription; } return commandLabel; }, caption: commandLabel, execute, isEnabled, }); if (palette) { palette.addItem({ command, category: 'Other', args: { isPalette: true }, }); } }; switcherOptions.forEach((option) => { const { command } = option; addSwitcherCommand(option); switcher.addItem({ command }); }); let toolbarFactory: (panel: NotebookPanel) => Widget; if (switcherOptions.length === 1) { toolbarFactory = (panel: NotebookPanel) => { const toolbarButton = new CommandToolbarButton({ commands, id: switcherOptions[0].command, label: switcherOptions[0].commandLabel, icon: launchIcon, }); toolbarButton.addClass('jp-nb-interface-switcher-button'); return toolbarButton; }; } else { const overflowOptions = { overflowMenuOptions: { isVisible: false }, }; const menubar = new MenuBar(overflowOptions); switcher.title.label = trans.__('Open in...'); switcher.title.icon = caretDownIcon; menubar.addMenu(switcher); toolbarFactory = (panel: NotebookPanel) => { const menubar = new MenuBar(overflowOptions); menubar.addMenu(switcher); menubar.addClass('jp-InterfaceSwitcher'); return menubar; }; } if (toolbarRegistry) { toolbarRegistry.addFactory( 'Notebook', 'interfaceSwitcher', toolbarFactory ); } }, }; /** * A plugin to add a command to open the Jupyter Notebook Tree. */ const launchNotebookTree: JupyterFrontEndPlugin = { id: '@jupyter-notebook/lab-extension:launch-tree', description: 'A plugin to add a command to open the Jupyter Notebook Tree.', autoStart: true, requires: [ITranslator], optional: [ICommandPalette], activate: ( app: JupyterFrontEnd, translator: ITranslator, palette: ICommandPalette | null ): void => { const { commands } = app; const trans = translator.load('notebook'); const category = trans.__('Help'); commands.addCommand(CommandIDs.launchNotebookTree, { label: trans.__('Launch Jupyter Notebook File Browser'), execute: () => { const url = URLExt.join(PageConfig.getBaseUrl(), 'tree'); window.open(url); }, }); if (palette) { palette.addItem({ command: CommandIDs.launchNotebookTree, category }); } }, }; /** * Export the plugins as default. */ const plugins: JupyterFrontEndPlugin[] = [ launchNotebookTree, interfaceSwitcher, ]; export default plugins; ================================================ FILE: packages/lab-extension/style/base.css ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ .jp-InterfaceSwitcher { display: flex; flex-direction: column; align-items: center; justify-content: center; } .jp-InterfaceSwitcher .lm-MenuBar-itemIcon svg { vertical-align: sub; } .jp-nb-interface-switcher-button > .jp-ToolbarButtonComponent::part(content) { flex-direction: row-reverse; } .jp-nb-interface-switcher-button > .jp-ToolbarButtonComponent > svg { padding-left: 3px; } ================================================ FILE: packages/lab-extension/style/index.css ================================================ @import url('./base.css'); ================================================ FILE: packages/lab-extension/style/index.js ================================================ import './base.css'; ================================================ FILE: packages/lab-extension/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"], "references": [ { "path": "../application" } ] } ================================================ FILE: packages/notebook-extension/package.json ================================================ { "name": "@jupyter-notebook/notebook-extension", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Notebook Extension", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/**/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "watch": "tsc -b --watch" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/apputils": "~4.7.0-alpha.4", "@jupyterlab/cells": "~4.6.0-alpha.4", "@jupyterlab/debugger": "~4.6.0-alpha.4", "@jupyterlab/docmanager": "~4.6.0-alpha.4", "@jupyterlab/notebook": "~4.6.0-alpha.4", "@jupyterlab/settingregistry": "~4.6.0-alpha.4", "@jupyterlab/toc": "~6.6.0-alpha.4", "@jupyterlab/translation": "~4.6.0-alpha.4", "@lumino/algorithm": "2.0.4", "@lumino/polling": "^2.1.5", "@lumino/widgets": "^2.7.2", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "extension": true, "schemaDir": "schema" }, "styleModule": "style/index.js" } ================================================ FILE: packages/notebook-extension/schema/checkpoints.json ================================================ { "title": "Notebook checkpoint indicator", "description": "Notebook checkpoint indicator", "jupyter.lab.toolbars": { "TopBar": [{ "name": "checkpoint", "rank": 20 }] }, "properties": { "checkpointPollingInterval": { "type": "number", "title": "Checkpoint Polling Interval (seconds)", "description": "How often to check for checkpoints (in seconds). Set to 0 to disable polling.", "default": 30, "minimum": 0 } }, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/notebook-extension/schema/edit-notebook-metadata.json ================================================ { "title": "Jupyter Notebook Menu Entries", "description": "Jupyter Notebook Menu Entries", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-file", "items": [ { "command": "notebook:open-tree-tab", "rank": 1 } ] }, { "id": "jp-mainmenu-edit", "items": [ { "type": "separator", "rank": 8.5 }, { "command": "notebook:edit-metadata", "rank": 8.5 }, { "type": "separator", "rank": 8.5 } ] } ] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/notebook-extension/schema/full-width-notebook.json ================================================ { "title": "Jupyter Notebook Full Width Notebook", "description": "Jupyter Notebook Notebook With settings", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-view", "items": [ { "command": "notebook:toggle-full-width", "rank": 4 } ] } ] }, "properties": { "fullWidthNotebook": { "type": "boolean", "title": "Full Width Notebook", "description": "Whether to the notebook should take up the full width of the application", "default": false } }, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/notebook-extension/schema/kernel-logo.json ================================================ { "title": "Kernel logo", "description": "Kernel logo in the top area", "jupyter.lab.toolbars": { "TopBar": [{ "name": "kernelLogo", "rank": 110 }] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/notebook-extension/schema/menu-override.json ================================================ { "title": "Menu override", "description": "Override some menu items", "jupyter.lab.menus": { "main": [ { "id": "jp-mainmenu-view", "items": [ { "command": "toc:show-panel", "disabled": true }, { "command": "toc:toggle-panel", "rank": 4 }, { "command": "debugger:show-panel", "disabled": true }, { "command": "debugger:toggle-panel", "rank": 5 } ] } ] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/notebook-extension/schema/scroll-output.json ================================================ { "jupyter.lab.setting-icon": "notebook-ui-components:jupyter", "jupyter.lab.setting-icon-label": "Jupyter Notebook Notebook", "title": "Jupyter Notebook Notebook", "description": "Jupyter Notebook Notebook settings", "properties": { "autoScrollOutputs": { "type": "boolean", "title": "Auto Scroll Outputs", "description": "Whether to auto scroll the output area when the outputs become too long", "default": true } }, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/notebook-extension/src/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { JupyterFrontEnd, JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { ISessionContext, DOMUtils, IToolbarWidgetRegistry, ICommandPalette, } from '@jupyterlab/apputils'; import { Cell, CodeCell } from '@jupyterlab/cells'; import { PageConfig, Text, Time, URLExt } from '@jupyterlab/coreutils'; import { IDebugger, IDebuggerSidebar } from '@jupyterlab/debugger'; import { IDocumentManager } from '@jupyterlab/docmanager'; import { DocumentRegistry } from '@jupyterlab/docregistry'; import { IMainMenu } from '@jupyterlab/mainmenu'; import { NotebookPanel, INotebookTracker, INotebookTools, } from '@jupyterlab/notebook'; import { ISettingRegistry } from '@jupyterlab/settingregistry'; import { ITableOfContentsTracker } from '@jupyterlab/toc'; import { ITranslator, nullTranslator } from '@jupyterlab/translation'; import { INotebookShell } from '@jupyter-notebook/application'; import { find } from '@lumino/algorithm'; import { Poll } from '@lumino/polling'; import { Widget } from '@lumino/widgets'; import { TrustedComponent } from './trusted'; /** * The class for kernel status errors. */ const KERNEL_STATUS_ERROR_CLASS = 'jp-NotebookKernelStatus-error'; /** * The class for kernel status warnings. */ const KERNEL_STATUS_WARN_CLASS = 'jp-NotebookKernelStatus-warn'; /** * The class for kernel status infos. */ const KERNEL_STATUS_INFO_CLASS = 'jp-NotebookKernelStatus-info'; /** * The class to fade out the kernel status. */ const KERNEL_STATUS_FADE_OUT_CLASS = 'jp-NotebookKernelStatus-fade'; /** * The class for scrolled outputs */ const SCROLLED_OUTPUTS_CLASS = 'jp-mod-outputsScrolled'; /** * The class for the full width notebook */ const FULL_WIDTH_NOTEBOOK_CLASS = 'jp-mod-fullwidth'; /** * The command IDs used by the notebook plugins. */ namespace CommandIDs { /** * A command to open right sidebar for Editing Notebook Metadata */ export const openEditNotebookMetadata = 'notebook:edit-metadata'; /** * A command to toggle full width of the notebook */ export const toggleFullWidth = 'notebook:toggle-full-width'; } /** * A plugin for the checkpoint indicator */ const checkpoints: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:checkpoints', description: 'A plugin for the checkpoint indicator.', autoStart: true, requires: [IDocumentManager, ITranslator], optional: [INotebookShell, IToolbarWidgetRegistry, ISettingRegistry], activate: ( app: JupyterFrontEnd, docManager: IDocumentManager, translator: ITranslator, notebookShell: INotebookShell | null, toolbarRegistry: IToolbarWidgetRegistry | null, settingRegistry: ISettingRegistry | null ) => { const { shell } = app; const trans = translator.load('notebook'); const node = document.createElement('div'); if (toolbarRegistry) { toolbarRegistry.addFactory('TopBar', 'checkpoint', (toolbar) => { const widget = new Widget({ node }); widget.id = DOMUtils.createDomID(); widget.addClass('jp-NotebookCheckpoint'); return widget; }); } const getCurrent = () => { const current = shell.currentWidget; if (!current) { return null; } const context = docManager.contextForWidget(current); if (!context) { return null; } return context; }; const updateCheckpointDisplay = async () => { const current = getCurrent(); if (!current) { return; } const checkpoints = await current.listCheckpoints(); if (!checkpoints || !checkpoints.length) { node.textContent = ''; return; } const checkpoint = checkpoints[checkpoints.length - 1]; node.textContent = trans.__( 'Last Checkpoint: %1', Time.formatHuman(new Date(checkpoint.last_modified)) ); }; const onSaveState = async ( sender: DocumentRegistry.IContext, state: DocumentRegistry.SaveState ) => { if (state !== 'completed') { return; } // Add a small artificial delay so that the UI can pick up the newly created checkpoint. // Since the save state signal is emitted after a file save, but not after a checkpoint has been created. setTimeout(() => { void updateCheckpointDisplay(); }, 500); }; const onChange = async () => { const context = getCurrent(); if (!context) { return; } context.saveState.disconnect(onSaveState); context.saveState.connect(onSaveState); await updateCheckpointDisplay(); }; if (notebookShell) { notebookShell.currentChanged.connect(onChange); } let checkpointPollingInterval = 30; // Default 30 seconds let poll: Poll | null = null; const createPoll = () => { if (poll) { poll.dispose(); } if (checkpointPollingInterval > 0) { poll = new Poll({ auto: true, factory: () => updateCheckpointDisplay(), frequency: { interval: checkpointPollingInterval * 1000, backoff: false, }, standby: 'when-hidden', }); } }; const updateSettings = (settings: ISettingRegistry.ISettings): void => { checkpointPollingInterval = settings.get('checkpointPollingInterval') .composite as number; createPoll(); }; if (settingRegistry) { const loadSettings = settingRegistry.load(checkpoints.id); Promise.all([loadSettings, app.restored]) .then(([settings]) => { updateSettings(settings); settings.changed.connect(updateSettings); }) .catch((reason: Error) => { console.error( `Failed to load settings for ${checkpoints.id}: ${reason.message}` ); // Fall back to creating poll with default settings createPoll(); }); } else { // Create poll with default settings createPoll(); } }, }; /** * Add a command to close the browser tab when clicking on "Close and Shut Down" */ const closeTab: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:close-tab', description: 'Add a command to close the browser tab when clicking on "Close and Shut Down".', autoStart: true, requires: [IMainMenu], optional: [ITranslator], activate: ( app: JupyterFrontEnd, menu: IMainMenu, translator: ITranslator | null ) => { const { commands } = app; translator = translator ?? nullTranslator; const trans = translator.load('notebook'); const id = 'notebook:close-and-halt'; commands.addCommand(id, { label: trans.__('Close and Shut Down Notebook'), execute: async () => { // Shut the kernel down, without confirmation await commands.execute('notebook:shutdown-kernel', { activate: false }); window.close(); }, }); menu.fileMenu.closeAndCleaners.add({ id, // use a small rank to it takes precedence over the default // shut down action for the notebook rank: 0, }); }, }; /** * Add a command to open the tree view from the notebook view */ const openTreeTab: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:open-tree-tab', description: 'Add a command to open a browser tab on the tree view when clicking "Open...".', autoStart: true, optional: [ITranslator], activate: (app: JupyterFrontEnd, translator: ITranslator | null) => { const { commands } = app; translator = translator ?? nullTranslator; const trans = translator.load('notebook'); const id = 'notebook:open-tree-tab'; commands.addCommand(id, { label: trans.__('Open…'), execute: async () => { const url = URLExt.join(PageConfig.getBaseUrl(), 'tree'); window.open(url); }, }); }, }; /** * A plugin to set the notebook to full width. */ const fullWidthNotebook: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:full-width-notebook', description: 'A plugin to set the notebook to full width.', autoStart: true, requires: [INotebookTracker], optional: [ICommandPalette, ISettingRegistry, ITranslator], activate: ( app: JupyterFrontEnd, tracker: INotebookTracker, palette: ICommandPalette | null, settingRegistry: ISettingRegistry | null, translator: ITranslator | null ) => { const trans = (translator ?? nullTranslator).load('notebook'); let fullWidth = false; const toggleFullWidth = () => { const current = tracker.currentWidget; fullWidth = !fullWidth; if (!current) { return; } const content = current; content.toggleClass(FULL_WIDTH_NOTEBOOK_CLASS, fullWidth); }; let notebookSettings: ISettingRegistry.ISettings; if (settingRegistry) { const loadSettings = settingRegistry.load(fullWidthNotebook.id); const updateSettings = (settings: ISettingRegistry.ISettings): void => { const newFullWidth = settings.get('fullWidthNotebook') .composite as boolean; if (newFullWidth !== fullWidth) { toggleFullWidth(); } }; Promise.all([loadSettings, app.restored]) .then(([settings]) => { notebookSettings = settings; updateSettings(settings); settings.changed.connect((settings) => { updateSettings(settings); }); }) .catch((reason: Error) => { console.error(reason.message); }); } app.commands.addCommand(CommandIDs.toggleFullWidth, { label: trans.__('Enable Full Width Notebook'), execute: () => { toggleFullWidth(); if (notebookSettings) { notebookSettings.set('fullWidthNotebook', fullWidth); } }, isEnabled: () => tracker.currentWidget !== null, isToggled: () => fullWidth, }); if (palette) { palette.addItem({ command: CommandIDs.toggleFullWidth, category: 'Notebook Operations', }); } }, }; /** * The kernel logo plugin. */ const kernelLogo: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:kernel-logo', description: 'The kernel logo plugin.', autoStart: true, requires: [INotebookShell], optional: [IToolbarWidgetRegistry], activate: ( app: JupyterFrontEnd, shell: INotebookShell, toolbarRegistry: IToolbarWidgetRegistry | null ) => { const { serviceManager } = app; const node = document.createElement('div'); const img = document.createElement('img'); const onChange = async () => { const current = shell.currentWidget; if (!(current instanceof NotebookPanel)) { return; } if (!node.hasChildNodes()) { node.appendChild(img); } await current.sessionContext.ready; current.sessionContext.kernelChanged.disconnect(onChange); current.sessionContext.kernelChanged.connect(onChange); const name = current.sessionContext.session?.kernel?.name ?? ''; const spec = serviceManager.kernelspecs?.specs?.kernelspecs[name]; if (!spec) { node.childNodes[0].remove(); return; } const kernelIconUrl = spec.resources['logo-64x64']; if (!kernelIconUrl) { node.childNodes[0].remove(); return; } img.src = kernelIconUrl; img.title = spec.display_name; }; if (toolbarRegistry) { toolbarRegistry.addFactory('TopBar', 'kernelLogo', (toolbar) => { const widget = new Widget({ node }); widget.addClass('jp-NotebookKernelLogo'); return widget; }); } app.started.then(() => { shell.currentChanged.connect(onChange); }); }, }; /** * A plugin to display the kernel status; */ const kernelStatus: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:kernel-status', description: 'A plugin to display the kernel status.', autoStart: true, requires: [INotebookShell, ITranslator], activate: ( app: JupyterFrontEnd, shell: INotebookShell, translator: ITranslator ) => { const trans = translator.load('notebook'); const widget = new Widget(); widget.addClass('jp-NotebookKernelStatus'); app.shell.add(widget, 'menu', { rank: 10_010 }); const removeClasses = () => { widget.removeClass(KERNEL_STATUS_ERROR_CLASS); widget.removeClass(KERNEL_STATUS_WARN_CLASS); widget.removeClass(KERNEL_STATUS_INFO_CLASS); widget.removeClass(KERNEL_STATUS_FADE_OUT_CLASS); }; const onStatusChanged = (sessionContext: ISessionContext) => { const status = sessionContext.kernelDisplayStatus; let text = `Kernel ${Text.titleCase(status)}`; removeClasses(); switch (status) { case 'busy': case 'idle': text = ''; widget.addClass(KERNEL_STATUS_FADE_OUT_CLASS); break; case 'dead': case 'terminating': widget.addClass(KERNEL_STATUS_ERROR_CLASS); break; case 'unknown': widget.addClass(KERNEL_STATUS_WARN_CLASS); break; default: widget.addClass(KERNEL_STATUS_INFO_CLASS); widget.addClass(KERNEL_STATUS_FADE_OUT_CLASS); break; } widget.node.textContent = trans.__(text); }; const onChange = async () => { const current = shell.currentWidget; if (!(current instanceof NotebookPanel)) { return; } const sessionContext = current.sessionContext; sessionContext.statusChanged.connect(onStatusChanged); }; shell.currentChanged.connect(onChange); }, }; /** * A plugin to enable scrolling for outputs by default. * Mimic the logic from the classic notebook, as found here: * https://github.com/jupyter/notebook/blob/a9a31c096eeffe1bff4e9164c6a0442e0e13cdb3/notebook/static/notebook/js/outputarea.js#L96-L120 */ const scrollOutput: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:scroll-output', description: 'A plugin to enable scrolling for outputs by default.', autoStart: true, requires: [INotebookTracker], optional: [ISettingRegistry], activate: async ( app: JupyterFrontEnd, tracker: INotebookTracker, settingRegistry: ISettingRegistry | null ) => { const autoScrollThreshold = 100; let autoScrollOutputs = true; // decide whether to scroll the output of the cell based on some heuristics const autoScroll = (cell: CodeCell) => { if (!autoScrollOutputs) { // bail if disabled via the settings cell.removeClass(SCROLLED_OUTPUTS_CLASS); return; } const { outputArea } = cell; // respect cells with an explicit scrolled state const scrolled = cell.model.getMetadata('scrolled'); if (scrolled !== undefined) { return; } const { node } = outputArea; const height = node.scrollHeight; const fontSize = parseFloat(node.style.fontSize.replace('px', '')); const lineHeight = (fontSize || 14) * 1.3; // do not set via cell.outputScrolled = true, as this would // otherwise synchronize the scrolled state to the notebook metadata const scroll = height > lineHeight * autoScrollThreshold; cell.toggleClass(SCROLLED_OUTPUTS_CLASS, scroll); }; const handlers: { [id: string]: () => void } = {}; const setAutoScroll = (cell: Cell) => { if (cell.model.type === 'code') { const codeCell = cell as CodeCell; const id = codeCell.model.id; autoScroll(codeCell); if (handlers[id]) { codeCell.outputArea.model.changed.disconnect(handlers[id]); } handlers[id] = () => autoScroll(codeCell); codeCell.outputArea.model.changed.connect(handlers[id]); } }; tracker.widgetAdded.connect((sender, notebook) => { // when the notebook widget is created, process all the cells notebook.sessionContext.ready.then(() => { notebook.content.widgets.forEach(setAutoScroll); }); notebook.model?.cells.changed.connect((sender, args) => { notebook.content.widgets.forEach(setAutoScroll); }); }); if (settingRegistry) { const loadSettings = settingRegistry.load(scrollOutput.id); const updateSettings = (settings: ISettingRegistry.ISettings): void => { autoScrollOutputs = settings.get('autoScrollOutputs') .composite as boolean; }; Promise.all([loadSettings, app.restored]) .then(([settings]) => { updateSettings(settings); settings.changed.connect((settings) => { updateSettings(settings); }); }) .catch((reason: Error) => { console.error(reason.message); }); } }, }; /** * A plugin to add the NotebookTools to the side panel; */ const notebookToolsWidget: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:notebook-tools', description: 'A plugin to add the NotebookTools to the side panel.', autoStart: true, requires: [INotebookShell], optional: [INotebookTools], activate: ( app: JupyterFrontEnd, shell: INotebookShell, notebookTools: INotebookTools | null ) => { const onChange = async () => { const current = shell.currentWidget; if (!(current instanceof NotebookPanel)) { return; } // Add the notebook tools in right area. if (notebookTools) { shell.add(notebookTools, 'right', { type: 'Property Inspector' }); } }; shell.currentChanged.connect(onChange); }, }; /** * A plugin to update the tab icon based on the kernel status. */ const tabIcon: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:tab-icon', description: 'A plugin to update the tab icon based on the kernel status.', autoStart: true, requires: [INotebookTracker], activate: (app: JupyterFrontEnd, tracker: INotebookTracker) => { // the favicons are provided by Jupyter Server const baseURL = PageConfig.getBaseUrl(); const notebookIcon = URLExt.join( baseURL, 'static/favicons/favicon-notebook.ico' ); const busyIcon = URLExt.join(baseURL, 'static/favicons/favicon-busy-1.ico'); const updateBrowserFavicon = ( status: ISessionContext.KernelDisplayStatus ) => { const link = document.querySelector( "link[rel*='icon']" ) as HTMLLinkElement; switch (status) { case 'busy': link.href = busyIcon; break; case 'idle': link.href = notebookIcon; break; } }; const onChange = async () => { const current = tracker.currentWidget; const sessionContext = current?.sessionContext; if (!sessionContext) { return; } sessionContext.statusChanged.connect(() => { const status = sessionContext.kernelDisplayStatus; updateBrowserFavicon(status); }); }; tracker.currentChanged.connect(onChange); }, }; /** * A plugin that adds a Trusted indicator to the menu area */ const trusted: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:trusted', description: 'A plugin that adds a Trusted indicator to the menu area.', autoStart: true, requires: [INotebookShell, ITranslator], activate: ( app: JupyterFrontEnd, notebookShell: INotebookShell, translator: ITranslator ): void => { const onChange = async () => { const current = notebookShell.currentWidget; if (!(current instanceof NotebookPanel)) { return; } const notebook = current.content; await current.context.ready; const widget = TrustedComponent.create({ notebook, translator }); notebookShell.add(widget, 'menu', { rank: 11_000, }); }; notebookShell.currentChanged.connect(onChange); }, }; /** * Add a command to open right sidebar for Editing Notebook Metadata when clicking on "Edit Notebook Metadata" under Edit menu */ const editNotebookMetadata: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:edit-notebook-metadata', description: 'Add a command to open right sidebar for Editing Notebook Metadata when clicking on "Edit Notebook Metadata" under Edit menu', autoStart: true, optional: [ICommandPalette, ITranslator, INotebookTools], activate: ( app: JupyterFrontEnd, palette: ICommandPalette | null, translator: ITranslator | null, notebookTools: INotebookTools | null ) => { const { commands, shell } = app; translator = translator ?? nullTranslator; const trans = translator.load('notebook'); commands.addCommand(CommandIDs.openEditNotebookMetadata, { label: trans.__('Edit Notebook Metadata'), execute: async () => { const command = 'application:toggle-panel'; const args = { side: 'right', title: 'Show Notebook Tools', id: 'notebook-tools', }; // Check if Show Notebook Tools (Right Sidebar) is open (expanded) if (!commands.isToggled(command, args)) { await commands.execute(command, args).then((_) => { // For expanding the 'Advanced Tools' section (default: collapsed) if (notebookTools) { const tools = (notebookTools?.layout as any).widgets; tools.forEach((tool: any) => { if ( tool.widget.title.label === trans.__('Advanced Tools') && tool.collapsed ) { tool.toggle(); } }); } }); } }, isVisible: () => shell.currentWidget !== null && shell.currentWidget instanceof NotebookPanel, }); if (palette) { palette.addItem({ command: CommandIDs.openEditNotebookMetadata, category: 'Notebook Operations', }); } }, }; /** * A plugin to replace the menu item activating the TOC panel, to allow toggling it. */ const overrideMenuItems: JupyterFrontEndPlugin = { id: '@jupyter-notebook/notebook-extension:menu-override', description: 'A plugin to override some menu items', autoStart: true, optional: [ IDebuggerSidebar, IMainMenu, INotebookShell, ITableOfContentsTracker, ITranslator, ], activate: ( app: JupyterFrontEnd, debuggerSidebar: IDebugger.ISidebar | null, mainMenu: IMainMenu | null, shell: INotebookShell | null, tocTracker: ITableOfContentsTracker | null, translator: ITranslator | null ) => { if (!mainMenu || !shell) { return; } const trans = (translator ?? nullTranslator).load('notebook'); const { commands } = app; if (tocTracker) { const TOC_PANEL_ID = 'table-of-contents'; commands.addCommand('toc:toggle-panel', { label: trans.__('Table of Contents'), isToggleable: true, isToggled: () => { const area = shell.getWidgetArea(TOC_PANEL_ID); if (!area) { return false; } const widget = find( shell.widgets(area as INotebookShell.Area), (w) => w.id === TOC_PANEL_ID ); if (!widget) { return false; } return shell.isSidePanelVisible(area) && widget.isVisible; }, execute: () => { const area = shell.getWidgetArea(TOC_PANEL_ID); if (!area) { return; } const widget = find( shell.widgets(area as INotebookShell.Area), (w) => w.id === TOC_PANEL_ID ); if (shell.isSidePanelVisible(area) && widget?.isVisible) { shell.collapse(area); } else { shell.activateById(TOC_PANEL_ID); } }, describedBy: { args: { type: 'object', properties: {}, }, }, }); } if (debuggerSidebar) { const DEBUGGER_PANEL_ID = 'jp-debugger-sidebar'; commands.addCommand('debugger:toggle-panel', { label: trans.__('Debugger Panel'), isToggleable: true, isToggled: () => { const area = shell.getWidgetArea(DEBUGGER_PANEL_ID); if (!area) { return false; } const widget = find( shell.widgets(area as INotebookShell.Area), (w) => w.id === DEBUGGER_PANEL_ID ); if (!widget) { return false; } return shell.isSidePanelVisible(area) && widget.isVisible; }, execute: () => { const area = shell.getWidgetArea(DEBUGGER_PANEL_ID); if (!area) { return; } const widget = find( shell.widgets(area as INotebookShell.Area), (w) => w.id === DEBUGGER_PANEL_ID ); if (shell.isSidePanelVisible(area) && widget?.isVisible) { shell.collapse(area); } else { shell.activateById(DEBUGGER_PANEL_ID); } }, describedBy: { args: { type: 'object', properties: {}, }, }, }); } }, }; /** * Export the plugins as default. */ const plugins: JupyterFrontEndPlugin[] = [ checkpoints, closeTab, openTreeTab, editNotebookMetadata, fullWidthNotebook, kernelLogo, kernelStatus, notebookToolsWidget, overrideMenuItems, scrollOutput, tabIcon, trusted, ]; export default plugins; ================================================ FILE: packages/notebook-extension/src/trusted.tsx ================================================ import { ReactWidget } from '@jupyterlab/apputils'; import { Notebook, NotebookActions } from '@jupyterlab/notebook'; import { ITranslator } from '@jupyterlab/translation'; import React, { useEffect, useState } from 'react'; /** * Check if a notebook is trusted * @param notebook The notebook to check * @returns true if the notebook is trusted, false otherwise */ const isTrusted = (notebook: Notebook): boolean => { const model = notebook.model; if (!model) { return false; } const cells = Array.from(model.cells); let total = 0; let trusted = 0; for (const currentCell of cells) { if (currentCell.type !== 'code') { continue; } total++; if (currentCell.trusted) { trusted++; } } return trusted === total; }; /** * A React component to display the Trusted badge in the menu bar. * @param notebook The Notebook * @param translator The Translation service */ const TrustedButton = ({ notebook, translator, }: { notebook: Notebook; translator: ITranslator; }): JSX.Element => { const trans = translator.load('notebook'); const [trusted, setTrusted] = useState(isTrusted(notebook)); const checkTrust = () => { const v = isTrusted(notebook); setTrusted(v); }; const trust = async () => { await NotebookActions.trust(notebook, translator); checkTrust(); }; useEffect(() => { notebook.modelContentChanged.connect(checkTrust); notebook.activeCellChanged.connect(checkTrust); checkTrust(); return () => { notebook.modelContentChanged.disconnect(checkTrust); notebook.activeCellChanged.disconnect(checkTrust); }; }); return ( ); }; /** * A namespace for TrustedComponent static methods. */ export namespace TrustedComponent { /** * Create a new TrustedComponent * * @param notebook The notebook * @param translator The translator */ export const create = ({ notebook, translator, }: { notebook: Notebook; translator: ITranslator; }): ReactWidget => { return ReactWidget.create( ); }; } ================================================ FILE: packages/notebook-extension/style/base.css ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ @import './variables.css'; /** Document oriented look for the notebook. This includes changes to the look and feel of the JupyterLab Notebook component like: - scrollbar to the right of the page - drop shadow on the notebook - smaller empty space at the bottom of the notebook - compact view on mobile */ /* Make the notebook take up the full width of the page when jp-mod-fullwidth is set */ body[data-notebook='notebooks'] .jp-NotebookPanel.jp-mod-fullwidth .jp-WindowedPanel-outer { padding-left: unset; padding-right: unset !important; width: unset; } /* Keep the notebook centered on the page */ body[data-notebook='notebooks'] .jp-NotebookPanel-toolbar { padding-left: calc(calc(100% - var(--jp-notebook-max-width)) * 0.5); padding-right: calc(calc(100% - var(--jp-notebook-max-width)) * 0.5); } body[data-notebook='notebooks'] .jp-WindowedPanel-outer { width: unset !important; padding-top: unset; padding-left: calc(calc(100% - var(--jp-notebook-max-width)) * 0.5); padding-right: calc( calc( 100% - var(--jp-notebook-max-width) - var(--jp-notebook-padding-offset) ) * 0.5 ) !important; background: var(--jp-layout-color2); } body[data-notebook='notebooks'] .jp-WindowedPanel-inner { margin-top: var(--jp-notebook-toolbar-margin-bottom); /* Adjustments for the extra top and bottom notebook padding */ margin-bottom: calc(4 * var(--jp-notebook-padding)); } body[data-notebook='notebooks'] .jp-Notebook-cell { background: var(--jp-layout-color0); } /* Empty space at the bottom of the notebook (similar to classic) */ body[data-notebook='notebooks'] .jp-Notebook.jp-mod-scrollPastEnd .jp-WindowedPanel-outer::after { min-height: 100px; } /* Fix background colors */ body[data-notebook='notebooks'] .jp-WindowedPanel-outer > * { background: var(--jp-layout-color0); } body[data-notebook='notebooks'] .jp-Notebook.jp-mod-commandMode .jp-Cell.jp-mod-active.jp-mod-selected:not(.jp-mod-multiSelected) { background: var(--jp-layout-color0) !important; } body[data-notebook='notebooks'] .jp-Notebook .jp-Notebook-cell:not(:first-child)::before { content: ' '; height: 100%; position: absolute; top: 0; width: 11px; } /* Cell toolbar adjustments */ body[data-notebook='notebooks'] .jp-cell-toolbar { background: unset; box-shadow: unset; } /** first code cell on mobile (keep the selector above the media query) */ body[data-notebook='notebooks'] .jp-CodeCell[data-windowed-list-index='0'] .jp-cell-toolbar { top: unset; } @media only screen and (max-width: 760px) { /* first code cell on mobile */ body[data-notebook='notebooks'] .jp-CodeCell[data-windowed-list-index='0'] .jp-cell-toolbar { top: var(--jp-notebook-padding); } body[data-notebook='notebooks'] .jp-MarkdownCell .jp-cell-toolbar, body[data-notebook='notebooks'] .jp-RawCell .jp-cell-toolbar { top: calc(0.5 * var(--jp-notebook-padding)); } } /* Tweak the notebook footer (to add a new cell) */ body[data-notebook='notebooks'] .jp-Notebook-footer { background: unset; width: 100%; margin-left: unset; } /* Mobile View */ body[data-format='mobile'] .jp-NotebookCheckpoint { display: none; } body[data-format='mobile'] .jp-WindowedPanel-outer > *:first-child { margin-top: 0; } body[data-format='mobile'] .jp-ToolbarButton .jp-DebuggerBugButton { display: none; } body[data-notebook='notebooks'] .jp-WindowedPanel-viewport { background: var(--jp-layout-color0); box-shadow: var(--jp-elevation-z4); /* Extra padding at the top and bottom so the notebook looks nicer */ padding-top: calc(2 * var(--jp-notebook-padding)); padding-bottom: calc(2 * var(--jp-notebook-padding)); } /* Notebook box shadow */ body[data-notebook='notebooks'] .jp-Notebook > *:first-child:last-child::before { content: ''; position: absolute; top: 0; bottom: 0; left: 0; right: 0; box-shadow: 0px 0px 12px 1px var(--jp-shadow-umbra-color); } /* Additional customizations of the components on the notebook page */ .jp-NotebookKernelLogo { flex: 0 0 auto; display: flex; align-items: center; text-align: center; margin-right: 8px; } .jp-NotebookKernelLogo img { max-width: 28px; max-height: 28px; display: flex; } .jp-NotebookKernelStatus { margin: 0; font-weight: normal; font-size: var(--jp-ui-font-size1); color: var(--jp-ui-font-color0); font-family: var(--jp-ui-font-family); line-height: var(--jp-private-title-panel-height); padding-left: var(--jp-kernel-status-padding); padding-right: var(--jp-kernel-status-padding); } .jp-NotebookKernelStatus-error { background-color: var(--jp-error-color0); } .jp-NotebookKernelStatus-warn { background-color: var(--jp-warn-color0); } .jp-NotebookKernelStatus-info { background-color: var(--jp-info-color0); } .jp-NotebookKernelStatus-fade { animation: 0.5s fade-out forwards; } .jp-NotebookTrustedStatus { background: var(--jp-layout-color1); color: var(--jp-ui-font-color1); margin-top: 4px; margin-bottom: 4px; border: solid 1px var(--jp-border-color2); cursor: help; } .jp-NotebookTrustedStatus-not-trusted { cursor: pointer; } @keyframes fade-out { 0% { opacity: 1; } 100% { opacity: 0; } } #jp-title h1 { cursor: pointer; font-size: 18px; margin: 0; font-weight: normal; color: var(--jp-ui-font-color0); font-family: var(--jp-ui-font-family); line-height: calc(1.5 * var(--jp-private-title-panel-height)); text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } #jp-title h1:hover { background: var(--jp-layout-color2); } .jp-NotebookCheckpoint { font-size: 14px; margin-left: 5px; margin-right: 5px; font-weight: normal; color: var(--jp-ui-font-color0); font-family: var(--jp-ui-font-family); line-height: calc(1.5 * var(--jp-private-title-panel-height)); text-overflow: ellipsis; overflow: hidden; white-space: nowrap; } .jp-skiplink { position: absolute; top: -100em; } .jp-skiplink:focus-within { position: absolute; z-index: 10000; top: 0; left: 46%; margin: 0 auto; padding: 1em; width: 15%; box-shadow: var(--jp-elevation-z4); border-radius: 4px; background: var(--jp-layout-color0); text-align: center; } .jp-skiplink:focus-within a { text-decoration: underline; color: var(--jp-content-link-color); } ================================================ FILE: packages/notebook-extension/style/index.css ================================================ @import url('./base.css'); ================================================ FILE: packages/notebook-extension/style/index.js ================================================ import './base.css'; ================================================ FILE: packages/notebook-extension/style/variables.css ================================================ :root { --jp-notebook-toolbar-margin-bottom: 20px; --jp-notebook-padding-offset: 20px; --jp-kernel-status-padding: 5px; } ================================================ FILE: packages/notebook-extension/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"] } ================================================ FILE: packages/terminal-extension/package.json ================================================ { "name": "@jupyter-notebook/terminal-extension", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Terminal Extension", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/**/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "watch": "tsc -b --watch" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/terminal": "~4.6.0-alpha.4", "@lumino/algorithm": "^2.0.4" }, "devDependencies": { "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "extension": true }, "styleModule": "style/index.js" } ================================================ FILE: packages/terminal-extension/src/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { IRouter, JupyterFrontEnd, JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { PageConfig, URLExt } from '@jupyterlab/coreutils'; import { ITerminalTracker } from '@jupyterlab/terminal'; import { INotebookPathOpener, defaultNotebookPathOpener, } from '@jupyter-notebook/application'; import { find } from '@lumino/algorithm'; /** * A plugin to open terminals in a new tab */ const opener: JupyterFrontEndPlugin = { id: '@jupyter-notebook/terminal-extension:opener', description: 'A plugin to open terminals in a new tab.', requires: [IRouter, ITerminalTracker], autoStart: true, activate: ( app: JupyterFrontEnd, router: IRouter, tracker: ITerminalTracker ) => { const { commands } = app; const terminalPattern = new RegExp('/terminals/(.*)'); const command = 'router:terminal'; commands.addCommand(command, { execute: (args: any) => { const parsed = args as IRouter.ILocation; const matches = parsed.path.match(terminalPattern); if (!matches) { return; } const [, name] = matches; if (!name) { return; } tracker.widgetAdded.connect((send, terminal) => { terminal.content.setOption('closeOnExit', false); }); commands.execute('terminal:open', { name }); }, }); router.register({ command, pattern: terminalPattern }); }, }; /** * Open terminals in a new tab. */ const redirect: JupyterFrontEndPlugin = { id: '@jupyter-notebook/terminal-extension:redirect', description: 'Open terminals in a new tab.', requires: [ITerminalTracker], optional: [INotebookPathOpener], autoStart: true, activate: ( app: JupyterFrontEnd, tracker: ITerminalTracker, notebookPathOpener: INotebookPathOpener | null ) => { const baseUrl = PageConfig.getBaseUrl(); const opener = notebookPathOpener ?? defaultNotebookPathOpener; tracker.widgetAdded.connect((send, terminal) => { const widget = find( app.shell.widgets('main'), (w) => w.id === terminal.id ); if (widget) { // bail if the terminal is already added to the main area return; } const name = terminal.content.session.name; opener.open({ prefix: URLExt.join(baseUrl, 'terminals'), path: name, target: '_blank', }); // dispose the widget since it is not used on this page terminal.dispose(); }); }, }; /** * Export the plugins as default. */ const plugins: JupyterFrontEndPlugin[] = [opener, redirect]; export default plugins; ================================================ FILE: packages/terminal-extension/style/base.css ================================================ ================================================ FILE: packages/terminal-extension/style/index.css ================================================ @import url('./base.css'); ================================================ FILE: packages/terminal-extension/style/index.js ================================================ import './base.css'; ================================================ FILE: packages/terminal-extension/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"], "references": [ { "path": "../application" } ] } ================================================ FILE: packages/tree/package.json ================================================ { "name": "@jupyter-notebook/tree", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Tree", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/**/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "watch": "tsc -b --watch" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/apputils": "~4.7.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/docmanager": "~4.6.0-alpha.4", "@jupyterlab/filebrowser": "~4.6.0-alpha.4", "@jupyterlab/mainmenu": "~4.6.0-alpha.4", "@jupyterlab/services": "~7.6.0-alpha.4", "@jupyterlab/settingregistry": "~4.6.0-alpha.4", "@jupyterlab/statedb": "~4.6.0-alpha.4", "@jupyterlab/translation": "~4.6.0-alpha.4", "@jupyterlab/ui-components": "~4.6.0-alpha.4", "@lumino/algorithm": "^2.0.4", "@lumino/commands": "^2.3.3", "@lumino/coreutils": "^2.2.2", "@lumino/widgets": "^2.7.2" }, "devDependencies": { "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "styleModule": "style/index.js" } ================================================ FILE: packages/tree/src/index.ts ================================================ export * from './notebook-tree'; export * from './token'; ================================================ FILE: packages/tree/src/notebook-tree.ts ================================================ import { TabBarSvg } from '@jupyterlab/ui-components'; import { TabPanel } from '@lumino/widgets'; import { INotebookTree } from './token'; /** * The widget added in main area of the tree view. */ export class NotebookTreeWidget extends TabPanel implements INotebookTree { /** * Constructor of the NotebookTreeWidget. */ constructor() { super({ tabPlacement: 'top', tabsMovable: true, renderer: TabBarSvg.defaultRenderer, }); this.addClass('jp-TreePanel'); } } ================================================ FILE: packages/tree/src/token.ts ================================================ import { Token } from '@lumino/coreutils'; import { TabPanel } from '@lumino/widgets'; /** * The INotebookTree interface. */ export interface INotebookTree extends TabPanel {} /** * The INotebookTree token. */ export const INotebookTree = new Token( '@jupyter-notebook/tree:INotebookTree' ); ================================================ FILE: packages/tree/style/base.css ================================================ .jp-FileBrowser { height: 100%; } .lm-TabPanel { height: 100%; } .jp-TreePanel .lm-TabPanel-tabBar { overflow: visible; min-height: 32px; border-bottom: unset; height: var(--jp-private-toolbar-height); } .jp-TreePanel .lm-TabBar-content { height: 100%; } .jp-TreePanel .lm-TabBar-tab { flex: 0 1 auto; color: var(--jp-ui-font-color0); font-size: var(--jp-ui-font-size1); height: 100%; } .jp-TreePanel .lm-TabBar-tabLabel { padding-left: 5px; padding-right: 5px; } .jp-FileBrowser-toolbar.jp-Toolbar .jp-ToolbarButtonComponent { width: unset; } .jp-FileBrowser-toolbar > .jp-Toolbar-item { flex-direction: column; justify-content: center; } .jp-DropdownMenu .lm-MenuBar-itemIcon svg { vertical-align: sub; } jp-button[data-command='filebrowser:refresh'] .jp-ToolbarButtonComponent-label { display: none; } .jp-TreePanel .lm-TabBar-tabIcon svg { vertical-align: sub; } ================================================ FILE: packages/tree/style/index.css ================================================ @import url('~@jupyterlab/filebrowser/style/index.css'); @import url('./base.css'); ================================================ FILE: packages/tree/style/index.js ================================================ import '@jupyterlab/filebrowser/style/index.js'; import './base.css'; ================================================ FILE: packages/tree/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"], "references": [ { "path": "../application" } ] } ================================================ FILE: packages/tree-extension/package.json ================================================ { "name": "@jupyter-notebook/tree-extension", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - Tree Extension", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*.css", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/*.d.ts", "lib/*.js.map", "lib/*.js", "schema/*.json", "style/**/*.css", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "docs": "typedoc src", "watch": "tsc -b --watch" }, "dependencies": { "@jupyter-notebook/application": "^7.6.0-alpha.4", "@jupyter-notebook/tree": "^7.6.0-alpha.4", "@jupyterlab/application": "~4.6.0-alpha.4", "@jupyterlab/apputils": "~4.7.0-alpha.4", "@jupyterlab/coreutils": "~6.6.0-alpha.4", "@jupyterlab/docmanager": "~4.6.0-alpha.4", "@jupyterlab/filebrowser": "~4.6.0-alpha.4", "@jupyterlab/mainmenu": "~4.6.0-alpha.4", "@jupyterlab/services": "~7.6.0-alpha.4", "@jupyterlab/settingeditor": "~4.6.0-alpha.4", "@jupyterlab/settingregistry": "~4.6.0-alpha.4", "@jupyterlab/statedb": "~4.6.0-alpha.4", "@jupyterlab/translation": "~4.6.0-alpha.4", "@jupyterlab/ui-components": "~4.6.0-alpha.4", "@lumino/algorithm": "^2.0.4", "@lumino/commands": "^2.3.3", "@lumino/widgets": "^2.7.2" }, "devDependencies": { "rimraf": "^3.0.2", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "extension": true, "schemaDir": "schema" }, "styleModule": "style/index.js" } ================================================ FILE: packages/tree-extension/schema/file-actions.json ================================================ { "title": "File Browser Widget - File Actions", "description": "File Browser widget - File Actions settings.", "jupyter.lab.toolbars": { "FileBrowser": [ { "name": "fileAction-placeholder", "rank": 0 }, { "name": "fileAction-open", "rank": 1 }, { "name": "fileAction-download", "rank": 2 }, { "name": "fileAction-rename", "rank": 3 }, { "name": "fileAction-duplicate", "rank": 4 }, { "name": "fileAction-delete", "rank": 5 } ] }, "properties": {}, "additionalProperties": false, "type": "object" } ================================================ FILE: packages/tree-extension/schema/widget.json ================================================ { "title": "File Browser Widget", "description": "File Browser widget settings.", "jupyter.lab.toolbars": { "FileBrowser": [ { "name": "spacer", "type": "spacer", "rank": 900 }, { "name": "toggle-file-filter", "label": "", "command": "filebrowser:toggle-file-filter", "rank": 990 }, { "name": "new-dropdown", "rank": 1000 }, { "name": "uploader", "rank": 1010 }, { "name": "refresh", "command": "filebrowser:refresh", "rank": 1020 } ] }, "jupyter.lab.transform": true, "properties": { "toolbar": { "title": "File browser toolbar items", "description": "Note: To disable a toolbar item,\ncopy it to User Preferences and add the\n\"disabled\" key. The following example will disable the uploader button:\n{\n \"toolbar\": [\n {\n \"name\": \"uploader\",\n \"disabled\": true\n }\n ]\n}\n\nToolbar description:", "items": { "$ref": "#/definitions/toolbarItem" }, "type": "array", "default": [] } }, "additionalProperties": false, "type": "object", "definitions": { "toolbarItem": { "properties": { "name": { "title": "Unique name", "type": "string" }, "args": { "title": "Command arguments", "type": "object" }, "command": { "title": "Command id", "type": "string", "default": "" }, "disabled": { "title": "Whether the item is ignored or not", "type": "boolean", "default": false }, "icon": { "title": "Item icon id", "description": "If defined, it will override the command icon", "type": "string" }, "label": { "title": "Item label", "description": "If defined, it will override the command label", "type": "string" }, "type": { "title": "Item type", "type": "string", "enum": ["command", "spacer"] }, "rank": { "title": "Item rank", "type": "number", "minimum": 0, "default": 50 } }, "required": ["name"], "additionalProperties": false, "type": "object" } } } ================================================ FILE: packages/tree-extension/src/fileactions.tsx ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { CommandToolbarButtonComponent, ReactWidget, } from '@jupyterlab/apputils'; import { FileBrowser } from '@jupyterlab/filebrowser'; import { ITranslator } from '@jupyterlab/translation'; import { CommandRegistry } from '@lumino/commands'; import { ISignal } from '@lumino/signaling'; import React from 'react'; export class FilesActionButtons { /** * The constructor of FilesActionButtons. * @param options */ constructor(options: { commands: CommandRegistry; browser: FileBrowser; selectionChanged: ISignal; translator: ITranslator; }) { this._browser = options.browser; const { commands, selectionChanged, translator } = options; const trans = translator.load('notebook'); // Placeholder, when no file is selected. const placeholder = ReactWidget.create(
{trans.__('Select items to perform actions on them.')}
); placeholder.id = 'fileAction-placeholder'; this._widgets.set('placeholder', placeholder); // The action buttons. const actions = ['open', 'download', 'rename', 'duplicate', 'delete']; actions.forEach((action) => { const widget = ReactWidget.create( ); widget.id = `fileAction-${action}`; widget.addClass('jp-ToolbarButton'); widget.addClass('jp-FileAction'); this._widgets.set(action, widget); }); selectionChanged.connect(this._onSelectionChanged, this); this._onSelectionChanged(); } /** * Return an iterator with all the action widgets. */ get widgets(): IterableIterator { return this._widgets.values(); } /** * Triggered when the selection change in file browser. */ private _onSelectionChanged = () => { const selectedItems = Array.from(this._browser.selectedItems()); const selection = selectedItems.length > 0; const oneFolder = selectedItems.some((item) => item.type === 'directory'); this._widgets.get('placeholder')?.setHidden(selection); this._widgets.get('delete')?.setHidden(!selection); this._widgets.get('duplicate')?.setHidden(!selection || oneFolder); this._widgets.get('download')?.setHidden(!selection || oneFolder); this._widgets.get('open')?.setHidden(!selection || oneFolder); this._widgets.get('rename')?.setHidden(selectedItems.length !== 1); }; private _browser: FileBrowser; private _widgets = new Map(); } ================================================ FILE: packages/tree-extension/src/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { JupyterFrontEnd, JupyterFrontEndPlugin, } from '@jupyterlab/application'; import { ICommandPalette, IToolbarWidgetRegistry, createToolbarFactory, setToolbar, } from '@jupyterlab/apputils'; import { PageConfig } from '@jupyterlab/coreutils'; import { FileBrowser, Uploader, IDefaultFileBrowser, IFileBrowserFactory, } from '@jupyterlab/filebrowser'; import { ISettingRegistry } from '@jupyterlab/settingregistry'; import { IRunningSessionManagers, RunningSessions } from '@jupyterlab/running'; import { IJSONSettingEditorTracker, ISettingEditorTracker, } from '@jupyterlab/settingeditor'; import { ITranslator } from '@jupyterlab/translation'; import { caretDownIcon, folderIcon, runningIcon, } from '@jupyterlab/ui-components'; import { Menu, MenuBar } from '@lumino/widgets'; import { NotebookTreeWidget, INotebookTree } from '@jupyter-notebook/tree'; import { FilesActionButtons } from './fileactions'; /** * The file browser factory. */ const FILE_BROWSER_FACTORY = 'FileBrowser'; /** * The file browser plugin id. */ const FILE_BROWSER_PLUGIN_ID = '@jupyterlab/filebrowser-extension:browser'; /** * The namespace for command IDs. */ namespace CommandIDs { // The command to activate the filebrowser widget in tree view. export const activate = 'filebrowser:activate'; // Activate the file filter in the file browser export const toggleFileFilter = 'filebrowser:toggle-file-filter'; } /** * Plugin to add extra commands to the file browser to create * new notebooks, files, consoles and terminals */ const createNew: JupyterFrontEndPlugin = { id: '@jupyter-notebook/tree-extension:new', description: 'Plugin to add extra commands to the file browser to create new notebooks, files, consoles and terminals.', requires: [ITranslator], optional: [IToolbarWidgetRegistry], autoStart: true, activate: ( app: JupyterFrontEnd, translator: ITranslator, toolbarRegistry: IToolbarWidgetRegistry | null ) => { const { commands, serviceManager } = app; const trans = translator.load('notebook'); const overflowOptions = { overflowMenuOptions: { isVisible: false }, }; const menubar = new MenuBar(overflowOptions); const newMenu = new Menu({ commands }); newMenu.title.label = trans.__('New'); newMenu.title.icon = caretDownIcon; menubar.addMenu(newMenu); const populateNewMenu = () => { // create an entry per kernel spec for creating a new notebook const specs = serviceManager.kernelspecs?.specs?.kernelspecs; for (const name in specs) { newMenu.addItem({ args: { kernelName: name, isLauncher: true }, command: 'notebook:create-new', }); } const baseCommands = [ 'terminal:create-new', 'console:create', 'filebrowser:create-new-file', 'filebrowser:create-new-directory', ]; baseCommands.forEach((command) => { newMenu.addItem({ command }); }); }; serviceManager.kernelspecs?.specsChanged.connect(() => { newMenu.clearItems(); populateNewMenu(); }); populateNewMenu(); if (toolbarRegistry) { toolbarRegistry.addFactory( FILE_BROWSER_FACTORY, 'new-dropdown', (browser: FileBrowser) => { const menubar = new MenuBar(overflowOptions); menubar.addMenu(newMenu); menubar.addClass('jp-DropdownMenu'); return menubar; } ); } }, }; /** * A plugin to add file browser actions to the file browser toolbar. */ const fileActions: JupyterFrontEndPlugin = { id: '@jupyter-notebook/tree-extension:file-actions', description: 'A plugin to add file browser actions to the file browser toolbar.', autoStart: true, requires: [IDefaultFileBrowser, IToolbarWidgetRegistry, ITranslator], activate: ( app: JupyterFrontEnd, browser: IDefaultFileBrowser, toolbarRegistry: IToolbarWidgetRegistry, translator: ITranslator ) => { // Create a toolbar item that adds buttons to the file browser toolbar // to perform actions on the files const { commands } = app; const { selectionChanged } = browser; const fileActions = new FilesActionButtons({ commands, browser, selectionChanged, translator, }); for (const widget of fileActions.widgets) { toolbarRegistry.addFactory(FILE_BROWSER_FACTORY, widget.id, () => widget); } }, }; /** * A plugin to set the default file browser settings. */ const fileBrowserSettings: JupyterFrontEndPlugin = { id: '@jupyter-notebook/tree-extension:settings', description: 'Set up the default file browser settings', requires: [IDefaultFileBrowser], optional: [ISettingRegistry], autoStart: true, activate: ( app: JupyterFrontEnd, browser: IDefaultFileBrowser, settingRegistry: ISettingRegistry | null ) => { // Default config for notebook. // This is a different set of defaults than JupyterLab. const defaultFileBrowserConfig = { navigateToCurrentDirectory: false, singleClickNavigation: true, showLastModifiedColumn: true, showFileSizeColumn: true, showHiddenFiles: false, showFileCheckboxes: true, sortNotebooksFirst: true, showFullPath: false, }; // Apply defaults on plugin activation let key: keyof typeof defaultFileBrowserConfig; for (key in defaultFileBrowserConfig) { browser[key] = defaultFileBrowserConfig[key]; } if (settingRegistry) { void settingRegistry.load(FILE_BROWSER_PLUGIN_ID).then((settings) => { function onSettingsChanged(settings: ISettingRegistry.ISettings): void { let key: keyof typeof defaultFileBrowserConfig; for (key in defaultFileBrowserConfig) { const value = settings.get(key).user as boolean; // only set the setting if it is defined by the user if (value !== undefined) { browser[key] = value; } } } settings.changed.connect(onSettingsChanged); onSettingsChanged(settings); }); } }, }; /** * A plugin to add the file filter toggle command to the palette */ const fileFilterCommand: JupyterFrontEndPlugin = { id: '@jupyter-notebook/tree-extension:file-filter-command', description: 'A plugin to add file filter command to the palette.', autoStart: true, optional: [ICommandPalette], activate: (app: JupyterFrontEnd, palette: ICommandPalette | null) => { if (palette) { palette.addItem({ command: CommandIDs.toggleFileFilter, category: 'File Browser', }); } }, }; /** * Plugin to load the default plugins that are loaded on all the Notebook pages * (tree, edit, view, etc.) so they are visible in the settings editor. */ const loadPlugins: JupyterFrontEndPlugin = { id: '@jupyter-notebook/tree-extension:load-plugins', description: 'Plugin to load the default plugins that are loaded on all the Notebook pages (tree, edit, view, etc.) so they are visible in the settings editor.', autoStart: true, requires: [ISettingRegistry], activate(app: JupyterFrontEnd, settingRegistry: ISettingRegistry) { const { isDisabled } = PageConfig.Extension; const connector = settingRegistry.connector; const allPluginsOption = PageConfig.getOption('allPlugins'); if (!allPluginsOption) { return; } // build the list of plugins shipped by default on the all the notebook pages // this avoid explicitly loading `'all'` plugins such as the ones used // in JupyterLab only const allPlugins = JSON.parse(allPluginsOption); const pluginsSet = new Set(); Object.keys(allPlugins).forEach((key: string) => { const extensionsAndPlugins: { [key: string]: boolean | [string] } = allPlugins[key]; Object.keys(extensionsAndPlugins).forEach((plugin) => { const value = extensionsAndPlugins[plugin]; if (typeof value === 'boolean' && value) { pluginsSet.add(plugin); } else if (Array.isArray(value)) { value.forEach((v: string) => { pluginsSet.add(v); }); } }); }); app.restored.then(async () => { const plugins = await connector.list('all'); await Promise.all( plugins.ids.map(async (id: string) => { const [extension] = id.split(':'); // load the plugin if it is built-in the notebook application explicitly // either included as an extension or as a plugin directly const hasPlugin = pluginsSet.has(extension) || pluginsSet.has(id); if (!hasPlugin || isDisabled(id) || id in settingRegistry.plugins) { return; } try { await settingRegistry.load(id); } catch (error) { console.warn(`Settings failed to load for (${id})`, error); } }) ); }); }, }; /** * A plugin to add file browser commands for the tree view. */ const openFileBrowser: JupyterFrontEndPlugin = { id: '@jupyter-notebook/tree-extension:open-file-browser', description: 'A plugin to add file browser commands for the tree view.', requires: [INotebookTree, IDefaultFileBrowser], autoStart: true, activate: ( app: JupyterFrontEnd, notebookTree: INotebookTree, browser: IDefaultFileBrowser ) => { const { commands } = app; commands.addCommand(CommandIDs.activate, { execute: () => { notebookTree.currentWidget = browser; }, }); }, }; /** * A plugin to add the file browser widget to an INotebookShell */ const notebookTreeWidget: JupyterFrontEndPlugin = { id: '@jupyter-notebook/tree-extension:widget', description: 'A plugin to add the file browser widget to an INotebookShell.', requires: [ IDefaultFileBrowser, ITranslator, ISettingRegistry, IToolbarWidgetRegistry, IFileBrowserFactory, ], optional: [ IRunningSessionManagers, ISettingEditorTracker, IJSONSettingEditorTracker, ], autoStart: true, provides: INotebookTree, activate: ( app: JupyterFrontEnd, browser: IDefaultFileBrowser, translator: ITranslator, settingRegistry: ISettingRegistry, toolbarRegistry: IToolbarWidgetRegistry, factory: IFileBrowserFactory, manager: IRunningSessionManagers | null, settingEditorTracker: ISettingEditorTracker | null, jsonSettingEditorTracker: IJSONSettingEditorTracker | null ): INotebookTree => { const nbTreeWidget = new NotebookTreeWidget(); const trans = translator.load('notebook'); browser.title.label = trans.__('Files'); browser.node.setAttribute('role', 'region'); browser.node.setAttribute('aria-label', trans.__('File Browser Section')); browser.title.icon = folderIcon; nbTreeWidget.addWidget(browser); nbTreeWidget.tabBar.addTab(browser.title); nbTreeWidget.tabsMovable = false; toolbarRegistry.addFactory( FILE_BROWSER_FACTORY, 'uploader', (browser: FileBrowser) => new Uploader({ model: browser.model, translator, label: trans.__('Upload'), }) ); setToolbar( browser, createToolbarFactory( toolbarRegistry, settingRegistry, FILE_BROWSER_FACTORY, notebookTreeWidget.id, translator ) ); if (manager) { const running = new RunningSessions(manager, translator); running.id = 'jp-running-sessions-tree'; running.title.label = trans.__('Running'); running.title.icon = runningIcon; nbTreeWidget.addWidget(running); nbTreeWidget.tabBar.addTab(running.title); } app.shell.add(nbTreeWidget, 'main', { rank: 100 }); // add a separate tab for each setting editor [settingEditorTracker, jsonSettingEditorTracker].forEach( (editorTracker) => { if (editorTracker) { editorTracker.widgetAdded.connect((_, editor) => { nbTreeWidget.addWidget(editor); nbTreeWidget.tabBar.addTab(editor.title); nbTreeWidget.currentWidget = editor; }); } } ); const { tracker } = factory; // TODO: remove // Workaround to force the focus on the default file browser // See https://github.com/jupyterlab/jupyterlab/issues/15629 for more info const setCurrentToDefaultBrower = () => { tracker['_pool'].current = browser; }; tracker.widgetAdded.connect((sender, widget) => { setCurrentToDefaultBrower(); }); setCurrentToDefaultBrower(); return nbTreeWidget; }, }; /** * Export the plugins as default. */ const plugins: JupyterFrontEndPlugin[] = [ createNew, fileActions, fileBrowserSettings, fileFilterCommand, loadPlugins, openFileBrowser, notebookTreeWidget, ]; export default plugins; ================================================ FILE: packages/tree-extension/style/base.css ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ .jp-FileBrowser-toolbar .jp-Toolbar-item.jp-DropdownMenu, .jp-FileBrowser-toolbar .jp-Toolbar-item.jp-ToolbarButton, .jp-FileBrowser-toolbar .jp-Toolbar-item.jp-CommandToolbarButton { border: solid 1px var(--jp-border-color2); margin: 1px; padding: 0px; } .jp-FileBrowser-toolbar > .jp-Toolbar-item.jp-ToolbarButton:hover, .jp-FileBrowser-toolbar > .jp-Toolbar-item.jp-CommandToolbarButton:hover, .jp-FileBrowser-toolbar > .jp-Toolbar-item.jp-DropdownMenu:hover { background: var(--neutral-fill-stealth-hover); } .jp-FileBrowser-toolbar .lm-MenuBar-item { height: var(--jp-private-toolbar-height); display: inline-flex; align-items: center; } .jp-FileBrowser-toolbar .jp-ToolbarButtonComponent { height: var(--jp-flat-button-height); } .jp-FileBrowser-toolbar jp-button.jp-ToolbarButtonComponent:hover { background: inherit; } .jp-DirListing-content .jp-DirListing-checkboxWrapper { visibility: visible; } /* Action buttons */ .jp-FileBrowser-toolbar > .jp-FileAction > .jp-ToolbarButtonComponent > svg { display: none; } .jp-FileBrowser-toolbar > #fileAction-delete { background-color: var(--jp-error-color1); } .jp-FileBrowser-toolbar .jp-ToolbarButtonComponent[data-command='filebrowser:delete'] .jp-ToolbarButtonComponent-label { color: var(--jp-ui-inverse-font-color1); } .jp-FileBrowser-toolbar .jp-FileAction { border: solid 1px var(--jp-border-color2); margin: 1px; min-height: var(--jp-private-toolbar-height); } body[data-format='mobile'] #fileAction-placeholder { display: none; } ================================================ FILE: packages/tree-extension/style/index.css ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ @import url('~@jupyterlab/filebrowser/style/index.css'); @import url('~@jupyter-notebook/tree/style/index.css'); @import './base.css'; ================================================ FILE: packages/tree-extension/style/index.js ================================================ import '@jupyterlab/filebrowser/style/index.js'; import '@jupyter-notebook/tree/style/index.js'; import './base.css'; ================================================ FILE: packages/tree-extension/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"], "references": [ { "path": "../application" } ] } ================================================ FILE: packages/ui-components/babel.config.js ================================================ module.exports = require('@jupyterlab/testutils/lib/babel.config'); ================================================ FILE: packages/ui-components/jest.config.js ================================================ const func = require('@jupyterlab/testutils/lib/jest-config'); module.exports = func(__dirname); ================================================ FILE: packages/ui-components/package.json ================================================ { "name": "@jupyter-notebook/ui-components", "version": "7.6.0-alpha.4", "description": "Jupyter Notebook - UI components", "homepage": "https://github.com/jupyter/notebook", "bugs": { "url": "https://github.com/jupyter/notebook/issues" }, "repository": { "type": "git", "url": "https://github.com/jupyter/notebook.git" }, "license": "BSD-3-Clause", "author": "Project Jupyter", "sideEffects": [ "style/**/*", "style/index.js" ], "main": "lib/index.js", "types": "lib/index.d.ts", "style": "style/index.css", "directories": { "lib": "lib/" }, "files": [ "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", "style/**/*.{css,eot,gif,html,jpg,json,png,svg,woff2,ttf}", "style/index.js" ], "scripts": { "build": "tsc -b", "build:prod": "tsc -b", "build:test": "tsc --build tsconfig.test.json", "clean": "rimraf lib && rimraf tsconfig.tsbuildinfo", "cleansvg": "svgo --config svgo.yaml", "docs": "typedoc src", "docs:init": "bash docs/build.sh", "test": "jest", "test:cov": "jest --collect-coverage", "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand", "test:debug:watch": "node --inspect-brk node_modules/.bin/jest --runInBand --watch", "watch": "tsc -b --watch" }, "dependencies": { "@jupyterlab/ui-components": "~4.6.0-alpha.4", "react": "^18.2.0", "react-dom": "^18.2.0" }, "devDependencies": { "@babel/core": "^7.10.2", "@babel/preset-env": "^7.10.2", "@jupyterlab/testutils": "~4.6.0-alpha.0", "@types/jest": "^29.2.5", "babel-loader": "^8.0.6", "jest": "^29.3.1", "rimraf": "^3.0.2", "ts-jest": "^29.0.3", "typescript": "~5.9.3" }, "publishConfig": { "access": "public" }, "jupyterlab": { "coreDependency": true }, "styleModule": "style/index.js" } ================================================ FILE: packages/ui-components/src/icon/iconimports.ts ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ import { LabIcon } from '@jupyterlab/ui-components'; import jupyterSvgstr from '../../style/icons/jupyter.svg'; export const jupyterIcon = new LabIcon({ name: 'notebook-ui-components:jupyter', svgstr: jupyterSvgstr, }); ================================================ FILE: packages/ui-components/src/icon/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. export * from './iconimports'; ================================================ FILE: packages/ui-components/src/index.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. export * from './icon'; ================================================ FILE: packages/ui-components/src/svg.d.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. declare module '*.svg' { const value: string; export default value; } ================================================ FILE: packages/ui-components/style/base.css ================================================ ================================================ FILE: packages/ui-components/style/index.css ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ @import url('./base.css'); ================================================ FILE: packages/ui-components/style/index.js ================================================ /*----------------------------------------------------------------------------- | Copyright (c) Jupyter Development Team. | Distributed under the terms of the Modified BSD License. |----------------------------------------------------------------------------*/ import './base.css'; ================================================ FILE: packages/ui-components/test/foo.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. describe('foo', () => { describe('bar', () => { it('should pass', () => { expect(true).toBe(true); }); }); }); ================================================ FILE: packages/ui-components/tsconfig.json ================================================ { "extends": "../../tsconfigbase", "compilerOptions": { "outDir": "lib", "rootDir": "src" }, "include": ["src/**/*"] } ================================================ FILE: packages/ui-components/tsconfig.test.json ================================================ { "extends": "../../tsconfigbase.test", "include": ["src/**/*", "test/**/*"], "references": [ { "path": "." } ] } ================================================ FILE: pyproject.toml ================================================ [build-system] requires = [ "hatchling>=1.11", "hatch-jupyter-builder>=0.5", "jupyterlab>=4.6.0a4,<4.7", ] build-backend = "hatchling.build" [project] name = "notebook" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" readme = "README.md" license = { file = "LICENSE" } requires-python = ">=3.10" authors = [ { name = "Jupyter Development Team", email = "jupyter@googlegroups.com" }, ] keywords = [ "Jupyter", "JupyterLab", "Notebook", ] classifiers = [ "Framework :: Jupyter", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "Intended Audience :: System Administrators", "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Typing :: Typed", ] dependencies = [ "jupyter_server>=2.4.0,<3", "jupyterlab>=4.6.0a4,<4.7", "jupyterlab_server>=2.28.0,<3", "notebook_shim>=0.2,<0.3", "tornado>=6.2.0", ] dynamic = ["version"] [project.scripts] jupyter-notebook = "notebook.app:main" [project.urls] Documentation = "https://jupyter-notebook.readthedocs.io/" Homepage = "https://github.com/jupyter/notebook" Source = "https://github.com/jupyter/notebook" Tracker = "https://github.com/jupyter/notebook/issues" [project.optional-dependencies] test = [ "nbval", "pytest>=7.0", "requests", "pytest-tornasync", "pytest-timeout", "pytest-console-scripts", "ipykernel", "jupyter_server[test]>=2.4.0,<3", "jupyterlab_server[test]>=2.28.0,<3", ] docs = [ "myst_parser", "nbsphinx", "pydata-sphinx-theme", "sphinx>=1.3.6", "sphinxcontrib_github_alt", "sphinxcontrib_spelling" ] dev = [ "pre-commit", "hatch" ] [tool.hatch.version] path = "notebook/_version.py" validate-bump = false [tool.hatch.build.targets.wheel.shared-data] "notebook/labextension" = "share/jupyter/labextensions/@jupyter-notebook/lab-extension" "notebook/schemas/@jupyter-notebook" = "share/jupyter/lab/schemas/@jupyter-notebook" "jupyter-config/jupyter_server_config.d" = "etc/jupyter/jupyter_server_config.d" "notebook.svg" = "share/icons/hicolor/scalable/apps/notebook.svg" "jupyter-notebook.desktop" = "share/applications/jupyter-notebook.desktop" [tool.hatch.build.targets.sdist] artifacts = [ "notebook/labextension", "notebook/static", "notebook/schemas/@jupyter-notebook", "notebook/templates", "notebook.svg", "jupyter-notebook.desktop", ] include = [ "/jupyter-config", "/notebook", "/tests", "/package.json", "/install.json", "/ts*.json", "/*.md" ] [tool.hatch.build.targets.wheel] artifacts = [ "notebook/static", "notebook/templates", ] include = ["/notebook"] exclude = [ "notebook/labextension", "notebook/schemas/@jupyter-notebook", ] [tool.hatch.envs.docs] features = ["docs"] [tool.hatch.envs.docs.scripts] build = "make -C docs html SPHINXOPTS='-W'" serve = "cd docs/build/html && python -m http.server" [tool.hatch.envs.default.scripts] npm_pack = "jlpm lerna exec -- npm pack" js_test = "jlpm run build:test && jlpm run test" [tool.hatch.envs.test] features = ["test"] [tool.hatch.envs.test.scripts] test = "python -m pytest -vv {args}" nowarn = "test -W default {args}" [tool.hatch.envs.cov] features = ["test"] dependencies = ["coverage[toml]", "pytest-cov"] [tool.hatch.envs.cov.scripts] test = "python -m pytest -vv --cov notebook --cov-branch --cov-report term-missing:skip-covered {args}" nowarn = "test -W default {args}" [tool.hatch.envs.lint] detached = true dependencies = ["pre-commit"] [tool.hatch.envs.lint.scripts] build = [ "pre-commit run --all-files ruff", "pre-commit run --all-files ruff-format" ] [tool.hatch.envs.typing] dependencies = [ "pre-commit"] detached = true [tool.hatch.envs.typing.scripts] test = "pre-commit run --all-files --hook-stage manual mypy" [tool.hatch.build.hooks.jupyter-builder] dependencies = ["hatch-jupyter-builder>=0.5"] build-function = "hatch_jupyter_builder.npm_builder" ensured-targets = [ "notebook/labextension/static/style.js", ] install-pre-commit-hook = true [tool.hatch.build.hooks.jupyter-builder.build-kwargs] build_cmd = "build:prod" source_dir = "packages" build_dir = "notebook/static" npm = ["jlpm"] [tool.hatch.build.hooks.jupyter-builder.editable-build-kwargs] build_cmd = "build" source_dir = "packages" build_dir = "notebook/static" npm = ["jlpm"] [tool.jupyter-releaser.options] version-cmd = "jlpm run release:bump --force --skip-commit" [tool.jupyter-releaser.hooks] before-bump-version = [ "python -m pip install -U \"jupyterlab>=4.6.0a4,<4.7\"", "jlpm", "jlpm run build:utils", "python -m pip install hatch" ] before-build-npm = [ "jlpm clean", "jlpm build:prod" ] before-build-python = [ "jlpm clean" ] [tool.pytest.ini_options] minversion = "6.0" xfail_strict = true log_cli_level = "info" addopts = [ "-ra", "--durations=10", "--color=yes", "--doctest-modules", "--showlocals", "--strict-markers", "--strict-config" ] testpaths = [ "tests/", ] timeout = 300 filterwarnings = [ "error", "ignore:There is no current event loop:DeprecationWarning", "ignore:make_current is deprecated; start the event loop first", "ignore:clear_current is deprecated", "ignore:datetime.utc.* is deprecated", "ignore:datetime.datetime.* is deprecated", ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "if self.debug:", "if settings.DEBUG", "raise AssertionError", "raise NotImplementedError", "if 0:", "if __name__ == .__main__.:", "class .*\bProtocol\\):", "@(abc\\.)?abstractmethod", ] [tool.coverage.run] relative_files = true source = ["notebook"] [tool.mypy] files = "notebook" python_version = "3.10" strict = true enable_error_code = ["ignore-without-code", "redundant-expr", "truthy-bool"] warn_unreachable = true [tool.ruff] line-length = 100 [tool.ruff.format] docstring-code-format = true [tool.ruff.lint] extend-select = [ "B", # flake8-bugbear "I", # isort "ARG", # flake8-unused-arguments "C4", # flake8-comprehensions "EM", # flake8-errmsg "ICN", # flake8-import-conventions "G", # flake8-logging-format "PGH", # pygrep-hooks "PIE", # flake8-pie "PL", # pylint "PTH", # flake8-use-pathlib "PT", # flake8-pytest-style "RET", # flake8-return "RUF", # Ruff-specific "SIM", # flake8-simplify "T20", # flake8-print "UP", # pyupgrade "YTT", # flake8-2020 "EXE", # flake8-executable "PYI", # flake8-pyi "S", # flake8-bandit ] ignore = [ "PLR", # Design related pylint codes "C408", "C416", # Unnecessary `dict` call (rewrite as a literal) "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` ] [tool.ruff.lint.per-file-ignores] # S101 Use of `assert` detected # F841 Local variable `foo` is assigned to but never used "tests/*" = ["S101", "F841", "ARG", "PTH"] "docs/source/conf.py" = ["PTH"] "ui-tests/test/jupyter_server_config.py" = ["F821"] "*.ipynb" = ["E402", "B018", "E501", "T201", "RET"] [tool.interrogate] ignore-init-module=true ignore-private=true ignore-semiprivate=true ignore-property-decorators=true ignore-nested-functions=true ignore-nested-classes=true fail-under=100 exclude = ["tests", "ui-tests", "docs", "node_modules", "setup.py"] [tool.repo-review] ignore = ["GH102", "PC180", "PC111"] [tool.pixi.project] channels = ["conda-forge"] platforms = ["linux-64"] [tool.pixi.pypi-dependencies] notebook = { path = ".", editable = true, extras = ["dev", "docs"] } [tool.pixi.environments] default = { solve-group = "default" } dev = { features = ["dev"], solve-group = "default" } docs = { features = ["docs"], solve-group = "default" } test = { features = ["test"], solve-group = "default" } [tool.pixi.tasks] develop = "jlpm develop" start = "jupyter notebook --no-browser --ServerApp.token='' --ServerApp.allow_remote_access=True" [tool.pixi.dependencies] pip = ">=25.0.1,<26" nodejs = "22.*" python = ">=3.12.0,<3.15" ================================================ FILE: setup.py ================================================ # setup.py shim for use with versions of JupyterLab that require # it for extensions. __import__("setuptools").setup() ================================================ FILE: tests/conftest.py ================================================ import glob import json import os import os.path as osp import pathlib import shutil from importlib.resources import files import pytest from notebook.app import JupyterNotebookApp pytest_plugins = ["jupyter_server.pytest_plugin"] def mkdir(tmp_path, *parts): path = tmp_path.joinpath(*parts) if not path.exists(): path.mkdir(parents=True) return path app_settings_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "app_settings")) user_settings_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "user_settings")) schemas_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "schemas")) workspaces_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "workspaces")) labextensions_dir = pytest.fixture(lambda tmp_path: mkdir(tmp_path, "labextensions_dir")) @pytest.fixture def make_notebook_app( # PLR0913 jp_root_dir, jp_template_dir, app_settings_dir, user_settings_dir, schemas_dir, workspaces_dir, labextensions_dir, ): def _make_notebook_app(**kwargs): return JupyterNotebookApp( static_dir=str(jp_root_dir), templates_dir=str(jp_template_dir), app_url="/", app_settings_dir=str(app_settings_dir), user_settings_dir=str(user_settings_dir), schemas_dir=str(schemas_dir), workspaces_dir=str(workspaces_dir), extra_labextensions_path=[str(labextensions_dir)], ) # Copy the template files. for html_path in glob.glob(str(files("notebook.templates").joinpath("*.html"))): shutil.copy(html_path, jp_template_dir) # Create the index file. index = jp_template_dir.joinpath("index.html") index.write_text( """ {{page_config['appName'] | e}} {# Copy so we do not modify the page_config with updates. #} {% set page_config_full = page_config.copy() %} {# Set a dummy variable - we just want the side effect of the update. #} {% set _ = page_config_full.update(baseUrl=base_url, wsUrl=ws_url) %} """ ) # Copy the schema files. test_data = str(files("jupyterlab_server.test_data")._paths[0]) src = pathlib.PurePath(test_data, "schemas", "@jupyterlab") dst = pathlib.PurePath(str(schemas_dir), "@jupyterlab") if os.path.exists(dst): shutil.rmtree(dst) shutil.copytree(src, dst) # Create the federated extensions for name in ["apputils-extension", "codemirror-extension"]: target_name = name + "-federated" target = pathlib.PurePath(str(labextensions_dir), "@jupyterlab", target_name) src = pathlib.PurePath(test_data, "schemas", "@jupyterlab", name) dst = target / "schemas" / "@jupyterlab" / target_name if osp.exists(dst): shutil.rmtree(dst) shutil.copytree(src, dst) with open(target / "package.orig.json", "w") as fid: data = dict(name=target_name, jupyterlab=dict(extension=True)) json.dump(data, fid) # Copy the overrides file. src = pathlib.PurePath(test_data, "app-settings", "overrides.json") dst = pathlib.PurePath(str(app_settings_dir), "overrides.json") if os.path.exists(dst): os.remove(dst) shutil.copyfile(src, dst) # Copy workspaces. ws_path = pathlib.PurePath(test_data, "workspaces") for item in os.listdir(ws_path): src = ws_path / item dst = pathlib.PurePath(str(workspaces_dir), item) if os.path.exists(dst): os.remove(dst) shutil.copy(src, str(workspaces_dir)) return _make_notebook_app @pytest.fixture def notebookapp(jp_serverapp, make_notebook_app): app = make_notebook_app() app._link_jupyter_server_extension(jp_serverapp) app.initialize() return app ================================================ FILE: tests/test_app.py ================================================ import os import pytest from tornado.httpclient import HTTPClientError from notebook.app import JupyterNotebookApp, NotebookHandler, TreeHandler @pytest.fixture def notebooks(jp_create_notebook, notebookapp): nbpaths = ( "notebook1.ipynb", "jlab_test_notebooks/notebook2.ipynb", "jlab_test_notebooks/level2/notebook3.ipynb", ) for nb in nbpaths: jp_create_notebook(nb) return nbpaths async def test_notebook_handler(notebooks, jp_fetch): for nbpath in notebooks: r = await jp_fetch("/", nbpath) assert r.code == 200 # Check that the lab template is loaded html = r.body.decode() assert "Jupyter Notebook" in html r = await jp_fetch("/notebooks", nbpath) assert r.code == 200 # Check that the lab template is loaded html = r.body.decode() assert "Jupyter Notebook" in html redirected_url = None def redirect(self, url): nonlocal redirected_url redirected_url = url NotebookHandler.redirect = redirect await jp_fetch("notebooks", "jlab_test_notebooks") assert redirected_url == "/a%40b/tree/jlab_test_notebooks" async def test_tree_handler(notebooks, notebookapp, jp_fetch): app: JupyterNotebookApp = notebookapp r = await jp_fetch("tree", "jlab_test_notebooks") assert r.code == 200 # Check that the tree template is loaded html = r.body.decode() assert "Home" in html redirected_url = None def redirect(self, url): nonlocal redirected_url redirected_url = url TreeHandler.redirect = redirect await jp_fetch("tree", "notebook1.ipynb") assert redirected_url == "/a%40b/notebooks/notebook1.ipynb" with open(os.path.join(app.serverapp.root_dir, "foo.txt"), "w") as fid: fid.write("hello") await jp_fetch("tree", "foo.txt") assert redirected_url == "/a%40b/files/foo.txt" with pytest.raises(HTTPClientError): await jp_fetch("tree", "does_not_exist.ipynb") async def test_console_handler(notebookapp, jp_fetch): r = await jp_fetch("consoles", "foo") assert r.code == 200 html = r.body.decode() assert "- Console" in html async def test_terminals_handler(notebookapp, jp_fetch): r = await jp_fetch("terminals", "foo") assert r.code == 200 html = r.body.decode() assert "- Terminal" in html async def test_edit_handler(notebooks, jp_fetch): r = await jp_fetch("edit", "notebook1.ipynb") assert r.code == 200 html = r.body.decode() assert "- Edit" in html async def test_app(notebookapp): app: JupyterNotebookApp = notebookapp assert app.static_dir assert app.templates_dir assert app.app_settings_dir assert app.schemas_dir assert app.user_settings_dir assert app.workspaces_dir ================================================ FILE: tsconfig.eslint.json ================================================ { "extends": "./tsconfigbase", "include": [ "packages/**/*", "app/**/*", "buildutils/**/*", "ui-tests/**/*", "docs/**/*", "eslint.config.mjs" ], "compilerOptions": { "types": ["jest"] } } ================================================ FILE: tsconfigbase.json ================================================ { "compilerOptions": { "allowSyntheticDefaultImports": true, "composite": true, "declaration": true, "esModuleInterop": true, "incremental": true, "jsx": "react", "module": "esnext", "moduleResolution": "node", "noEmitOnError": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, "noUnusedLocals": true, "preserveWatchOutput": true, "resolveJsonModule": true, "strict": true, "target": "ES2018", "types": [], "lib": ["DOM", "DOM.Iterable", "ES2018", "ES2020.Intl"] } } ================================================ FILE: tsconfigbase.test.json ================================================ { "compilerOptions": { "declaration": true, "noEmitOnError": true, "noImplicitAny": true, "noUnusedLocals": true, "module": "commonjs", "moduleResolution": "node", "target": "ES2018", "lib": ["DOM", "DOM.iterable"], "types": ["jest", "node"], "jsx": "react", "resolveJsonModule": true, "esModuleInterop": true, "strictNullChecks": true } } ================================================ FILE: ui-tests/package.json ================================================ { "name": "@jupyter-notebook/ui-tests", "private": true, "version": "0.1.0", "author": "Project Jupyter", "license": "BSD-3-Clause", "description": "Jupyter Notebook UI Tests", "scripts": { "deduplicate": "jlpm dlx yarn-berry-deduplicate -s fewerHighest && jlpm install", "rimraf": "rimraf", "start": "jupyter notebook --config test/jupyter_server_config.py", "test": "playwright test", "test:debug": "PWDEBUG=1 playwright test", "test:report": "http-server ./playwright-report -a localhost -o", "test:update": "playwright test --update-snapshots" }, "dependencies": { "@jupyterlab/galata": "~5.6.0-alpha.4", "@playwright/test": "~1.58.0", "rimraf": "^3.0.2" } } ================================================ FILE: ui-tests/playwright.config.ts ================================================ import baseConfig from '@jupyterlab/galata/lib/playwright-config'; module.exports = { ...baseConfig, use: { appPath: '', trace: 'on-first-retry', video: 'retain-on-failure', }, retries: 1, webServer: [ { command: 'jlpm start', port: 8888, timeout: 120 * 1000, reuseExistingServer: true, stdout: 'pipe', }, ], }; ================================================ FILE: ui-tests/test/console.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { expect } from '@jupyterlab/galata'; import { Locator } from '@playwright/test'; import path from 'path'; import { test } from './fixtures'; import { waitForNotebook } from './utils'; const NOTEBOOK = 'empty.ipynb'; test.use({ autoGoto: false }); test.describe('ScratchPad', () => { test.beforeEach(async ({ page, tmpPath }) => { await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${NOTEBOOK}`), `${tmpPath}/${NOTEBOOK}` ); }); test('Should not have a menu entry in tree', async ({ page }) => { await page.goto('tree'); const menu = (await page.menu.openLocator('File>New')) as Locator; const entry = menu.getByText('Scratchpad console'); expect(entry).not.toBeVisible(); }); test('Should have a menu entry in Notebook', async ({ page, tmpPath }) => { await page.goto(`notebooks/${tmpPath}/${NOTEBOOK}`); const menu = (await page.menu.openLocator('File>New')) as Locator; const entry = menu.getByText('Scratchpad console'); expect(entry).toBeVisible(); }); test('Should open scratchpad console with menu', async ({ page, tmpPath, }) => { await page.goto(`notebooks/${tmpPath}/${NOTEBOOK}`); const menu = (await page.menu.openLocator('File>New')) as Locator; await menu.getByText('Scratchpad console').click(); const rightStack = page.locator('#jp-right-stack'); await expect(rightStack).toBeVisible(); await expect(rightStack.locator('.jp-ConsolePanel')).toBeVisible(); }); test('Should open scratchpad console with shortcut', async ({ page, tmpPath, }) => { await page.goto(`notebooks/${tmpPath}/${NOTEBOOK}`); await page.locator('body').press('Control+B'); const rightStack = page.locator('#jp-right-stack'); await expect(rightStack).toBeVisible(); await expect(rightStack.locator('.jp-ConsolePanel')).toBeVisible(); }); test('Scratch pad console should use the notebook kernel', async ({ page, tmpPath, browserName, }) => { await page.goto(`notebooks/${tmpPath}/${NOTEBOOK}`); await waitForNotebook(page, browserName); const cellInput = page .locator( '.jp-Notebook-cell >> .jp-Cell-inputArea >> .cm-editor >> .cm-content[contenteditable="true"]' ) .first(); await cellInput.fill('a = 1'); await cellInput.press('Shift+Enter'); await page.locator('body').press('Control+B'); const console = page.locator('#jp-right-stack .jp-ConsolePanel'); const input = console.locator( '.jp-CodeConsole-input >> .cm-editor >> .cm-content[contenteditable="true"]' ); await input.fill('print(a)'); await input.press('Shift+Enter'); const output = console.locator('.jp-OutputArea-output').first(); await expect(output).toHaveText('1'); }); }); ================================================ FILE: ui-tests/test/editor.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import path from 'path'; import { test } from './fixtures'; import { expect } from '@jupyterlab/galata'; const FILE = 'environment.yml'; test.use({ autoGoto: false }); const processRenameDialog = async (page, prevName: string, newName: string) => { // Rename in the input dialog await page .locator(`text=File Path${prevName}New Name >> input`) .fill(newName); await Promise.all([ await page.click('text="Rename"'), // wait until the URL is updated await page.waitForNavigation(), ]); }; test.describe('Editor', () => { test.beforeEach(async ({ page, tmpPath }) => { await page.contents.uploadFile( path.resolve(__dirname, `../../binder/${FILE}`), `${tmpPath}/${FILE}` ); }); test('Renaming the file by clicking on the title', async ({ page, tmpPath, }) => { const file = `${tmpPath}/${FILE}`; await page.goto(`edit/${file}`); // Click on the title await page.click(`text="${FILE}"`); const newName = 'test.yml'; await processRenameDialog(page, FILE, newName); // Check the URL contains the new name const url = page.url(); expect(url).toContain(newName); }); test('Renaming the file via the menu entry', async ({ page, tmpPath }) => { const file = `${tmpPath}/${FILE}`; await page.goto(`edit/${file}`); // Click on the title await page.menu.clickMenuItem('File>Rename…'); // Rename in the input dialog const newName = 'test.yml'; await processRenameDialog(page, FILE, newName); // Check the URL contains the new name const url = page.url(); expect(url).toContain(newName); }); }); ================================================ FILE: ui-tests/test/filebrowser.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import path from 'path'; import { expect } from '@jupyterlab/galata'; import { test } from './fixtures'; test.describe('File Browser', () => { test.beforeEach(async ({ page, tmpPath }) => { await page.contents.uploadFile( path.resolve(__dirname, './notebooks/empty.ipynb'), `${tmpPath}/empty.ipynb` ); await page.contents.createDirectory(`${tmpPath}/folder1`); await page.contents.createDirectory(`${tmpPath}/folder2`); }); test('Select one folder', async ({ page, tmpPath }) => { await page.filebrowser.refresh(); await page.keyboard.down('Control'); await page.getByText('folder1').last().click(); const toolbar = page.getByRole('toolbar'); expect(toolbar.getByText('Rename')).toBeVisible(); expect(toolbar.getByText('Move to Trash')).toBeVisible(); }); test('Select one file', async ({ page, tmpPath }) => { await page.filebrowser.refresh(); await page.keyboard.down('Control'); await page.getByText('empty.ipynb').last().click(); const toolbar = page.getByRole('toolbar'); ['Rename', 'Open', 'Download', 'Move to Trash'].forEach(async (text) => { expect(toolbar.getByText(text)).toBeVisible(); }); }); test('Select files and folders', async ({ page, tmpPath }) => { await page.filebrowser.refresh(); await page.keyboard.down('Control'); await page.getByText('folder1').last().click(); await page.getByText('folder2').last().click(); await page.getByText('empty.ipynb').last().click(); const toolbar = page.getByRole('toolbar'); expect(toolbar.getByText('Rename')).toBeHidden(); expect(toolbar.getByText('Open')).toBeHidden(); expect(toolbar.getByText('Move to Trash')).toBeVisible(); }); test('Select files and open', async ({ page, tmpPath }) => { // upload an additional notebook await page.contents.uploadFile( path.resolve(__dirname, './notebooks/simple.ipynb'), `${tmpPath}/simple.ipynb` ); await page.filebrowser.refresh(); await page.keyboard.down('Control'); await page.getByText('simple.ipynb').last().click(); await page.getByText('empty.ipynb').last().click(); const toolbar = page.getByRole('toolbar'); const [nb1, nb2] = await Promise.all([ page.waitForEvent('popup'), page.waitForEvent('popup'), toolbar.getByText('Open').last().click(), ]); await nb1.waitForLoadState(); await nb1.close(); await nb2.waitForLoadState(); await nb2.close(); }); }); ================================================ FILE: ui-tests/test/fixtures.ts ================================================ import { test as base } from '@jupyterlab/galata'; export const test = base.extend({ waitForApplication: async ({ baseURL }, use, testInfo) => { const waitIsReady = async (page): Promise => { await page.waitForSelector('#main-panel'); }; await use(waitIsReady); }, }); ================================================ FILE: ui-tests/test/general.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import path from 'path'; import { expect } from '@jupyterlab/galata'; import { test } from './fixtures'; import { waitForNotebook } from './utils'; test.describe('General', () => { test('The notebook should render', async ({ page, tmpPath, browserName }) => { const notebook = 'simple.ipynb'; await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${notebook}`), `${tmpPath}/${notebook}` ); await page.goto(`notebooks/${tmpPath}/${notebook}`); // check the notebook footer shows up on hover const notebookFooter = '.jp-Notebook-footer'; await page.hover(notebookFooter); await page.waitForSelector(notebookFooter); // hover somewhere else to make the add cell disappear await page.hover('#jp-top-bar'); // click to make the blue border around the cell disappear await page.click('.jp-WindowedPanel-outer'); // wait for the notebook to be ready await waitForNotebook(page, browserName); expect(await page.screenshot()).toMatchSnapshot('notebook.png'); }); }); ================================================ FILE: ui-tests/test/jupyter_server_config.py ================================================ from typing import Any from jupyterlab.galata import configure_jupyter_server c: Any c.JupyterNotebookApp.expose_app_in_browser = True configure_jupyter_server(c) ================================================ FILE: ui-tests/test/layout.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import path from 'path'; import { expect } from '@jupyterlab/galata'; import { galata } from '@jupyterlab/galata'; import { test } from './fixtures'; test.use({ mockSettings: { ...galata.DEFAULT_SETTINGS, '@jupyter-notebook/application-extension:shell': { layout: { Debugger: { area: 'left' }, }, }, }, }); test.describe('Layout Customization', () => { test('The Debugger panel should respect the settings and open in the left area', async ({ page, tmpPath, }) => { const notebook = 'simple.ipynb'; await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${notebook}`), `${tmpPath}/${notebook}` ); await page.goto(`notebooks/${tmpPath}/${notebook}`); const menuPath = 'View>Left Sidebar>Show Debugger'; await page.menu.clickMenuItem(menuPath); const panel = page.locator('#jp-left-stack'); expect(await panel.isVisible()).toBe(true); expect(await panel.screenshot()).toMatchSnapshot('debugger.png'); }); }); ================================================ FILE: ui-tests/test/links.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import path from 'path'; import { expect } from '@jupyterlab/galata'; import { test } from './fixtures'; const NOTEBOOK = 'local_links.ipynb'; const SUBFOLDER = 'test'; test.describe('Local Links', () => { test.beforeEach(async ({ page, tmpPath }) => { await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${NOTEBOOK}`), `${tmpPath}/${NOTEBOOK}` ); }); test('Open the current directory', async ({ page, tmpPath }) => { await page.goto(`notebooks/${tmpPath}/${NOTEBOOK}`); const [current] = await Promise.all([ page.waitForEvent('popup'), page.getByText('Current Directory').last().click(), ]); await current.waitForLoadState(); await current.waitForSelector('.jp-DirListing-content'); // Check that the link opened in a new tab expect(current.url()).toContain(`tree/${tmpPath}`); await current.close(); }); test('Open a folder', async ({ page, tmpPath }) => { // Create a test folder await page.contents.createDirectory(`${tmpPath}/${SUBFOLDER}`); await page.goto(`notebooks/${tmpPath}/${NOTEBOOK}`); const [folder] = await Promise.all([ page.waitForEvent('popup'), page.getByText('Open Test Folder').last().click(), ]); await folder.waitForLoadState(); await folder.waitForSelector('.jp-DirListing-content'); await folder.close(); // Check that the link opened in a new tab expect(folder.url()).toContain(`tree/${tmpPath}/${SUBFOLDER}`); }); }); ================================================ FILE: ui-tests/test/menus.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import path from 'path'; import { test } from './fixtures'; import { expect } from '@jupyterlab/galata'; import { waitForKernelReady } from './utils'; const NOTEBOOK = 'empty.ipynb'; const MENU_PATHS = [ 'File', 'File>New', 'File>Save and Export Notebook As', 'Edit', 'View', 'Run', 'Kernel', 'Settings', 'Settings>Theme', 'Help', ]; test.use({ autoGoto: false }); test.describe('Notebook Menus', () => { test.beforeEach(async ({ page, tmpPath }) => { await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${NOTEBOOK}`), `${tmpPath}/${NOTEBOOK}` ); }); MENU_PATHS.forEach((menuPath) => { test(`Open menu item ${menuPath}`, async ({ page, tmpPath }) => { await page.goto(`notebooks/${tmpPath}/${NOTEBOOK}`); await waitForKernelReady(page); await page.menu.open(menuPath); expect(await page.menu.isOpen(menuPath)).toBeTruthy(); const imageName = `opened-menu-${menuPath.replace(/>/g, '-')}.png`; const menu = await page.menu.getOpenMenu(); expect(menu).toBeDefined(); expect(await menu?.screenshot()).toMatchSnapshot(imageName.toLowerCase()); }); }); }); ================================================ FILE: ui-tests/test/mobile.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { expect, galata } from '@jupyterlab/galata'; import { test } from './fixtures'; import { hideAddCellButton, waitForKernelReady } from './utils'; test.use({ autoGoto: false, viewport: { width: 524, height: 800 }, // Set a fixed string as Playwright is preventing the unique test name to be too long // and replaces part of the path with a hash tmpPath: 'mobile-layout', }); test.describe('Mobile', () => { // manually create the test directory since tmpPath is set to a fixed value test.beforeAll(async ({ request, tmpPath }) => { const contents = galata.newContentsHelper(request); await contents.createDirectory(tmpPath); }); test.afterAll(async ({ request, tmpPath }) => { const contents = galata.newContentsHelper(request); await contents.deleteDirectory(tmpPath); }); test('The layout should be more compact on the file browser page', async ({ page, tmpPath, }) => { await page.goto(`tree/${tmpPath}`); await page.waitForSelector('#top-panel-wrapper', { state: 'hidden' }); expect(await page.screenshot()).toMatchSnapshot('tree.png', { maxDiffPixels: 300, }); }); test('The layout should be more compact on the notebook page', async ({ page, tmpPath, browserName, }) => { await page.goto(`tree/${tmpPath}`); // Create a new notebook const notebookPromise = page.waitForEvent('popup'); await page.click('text="New"'); await page .locator( '[data-command="notebook:create-new"] >> text="Python 3 (ipykernel)"' ) .click(); const notebook = await notebookPromise; // wait for the kernel status animations to be finished await waitForKernelReady(notebook); // force switching back to command mode to avoid capturing the cursor in the screenshot await notebook.evaluate(async () => { await window.jupyterapp.commands.execute('notebook:enter-command-mode'); }); // TODO: remove if (browserName === 'firefox') { await hideAddCellButton(notebook); } expect(await notebook.screenshot()).toMatchSnapshot('notebook.png'); await notebook.close(); }); }); ================================================ FILE: ui-tests/test/notebook.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import path from 'path'; import { expect } from '@jupyterlab/galata'; import { test } from './fixtures'; import { waitForNotebook, runAndAdvance, waitForKernelReady } from './utils'; const NOTEBOOK = 'example.ipynb'; test.use({ autoGoto: false }); test.describe('Notebook', () => { test.beforeEach(async ({ page, tmpPath }) => { await page.contents.uploadFile( path.resolve(__dirname, `../../binder/${NOTEBOOK}`), `${tmpPath}/${NOTEBOOK}` ); }); test('Title should be rendered', async ({ page, tmpPath }) => { await page.goto(`notebooks/${tmpPath}/${NOTEBOOK}`); const href = await page.evaluate(() => { return document.querySelector('#jp-NotebookLogo')?.getAttribute('href'); }); expect(href).toContain('/tree'); }); test('Renaming the notebook should be possible', async ({ page, tmpPath, }) => { const notebook = `${tmpPath}/${NOTEBOOK}`; await page.goto(`notebooks/${notebook}`); // Click on the title (with .ipynb extension stripped) await page.click('text="example"'); // Rename in the input dialog const newName = 'test.ipynb'; const newNameStripped = 'test'; await page .locator(`text=File Path${NOTEBOOK}New Name >> input`) .fill(newName); await Promise.all([ await page.click('text="Rename"'), // wait until the URL is updated await page.waitForNavigation(), ]); // Check the URL contains the new name const url = page.url(); expect(url).toContain(newNameStripped); }); // TODO: rewrite with page.notebook when fixed upstream in Galata // and usable in Jupyter Notebook without active tabs test('Outputs should be scrolled automatically', async ({ page, tmpPath, }) => { const notebook = 'autoscroll.ipynb'; await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${notebook}`), `${tmpPath}/${notebook}` ); await page.goto(`notebooks/${tmpPath}/${notebook}`); // wait for the checkpoint indicator to be displayed before executing the cells await page.waitForSelector('.jp-NotebookCheckpoint'); await page.click('.jp-Notebook'); // execute the first cell await runAndAdvance(page); await page .locator('.jp-mod-outputsScrolled') .nth(0) .waitFor({ state: 'visible' }); // execute the second cell await runAndAdvance(page); // the second cell should not be auto scrolled expect(page.locator('.jp-mod-outputsScrolled').nth(1)).toHaveCount(0); const checkCell = async (n: number): Promise => { const scrolled = await page.$eval(`.jp-Notebook-cell >> nth=${n}`, (el) => el.classList.contains('jp-mod-outputsScrolled') ); return scrolled; }; // check the long output area is auto scrolled expect(await checkCell(0)).toBe(true); // check the short output area is not auto scrolled expect(await checkCell(1)).toBe(false); }); test('Open table of content left panel', async ({ page, tmpPath }) => { const notebook = 'simple_toc.ipynb'; const menuPath = 'View>Left Sidebar>Show Table of Contents'; await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${notebook}`), `${tmpPath}/${notebook}` ); await page.goto(`notebooks/${tmpPath}/${notebook}`); await waitForKernelReady(page); await page.menu.clickMenuItem(menuPath); const panel = page.locator('#jp-left-stack'); expect(await panel.isVisible()).toBe(true); await expect( panel.locator( '.jp-SidePanel-content > .jp-TableOfContents-tree > .jp-TableOfContents-content' ) ).toHaveCount(1); await expect( panel.locator( '.jp-SidePanel-content > .jp-TableOfContents-tree > .jp-TableOfContents-content > .jp-tocItem' ) ).toHaveCount(3); const imageName = 'toc-left-panel.png'; expect(await panel.screenshot()).toMatchSnapshot(imageName); }); test('Open notebook tools right panel', async ({ page, tmpPath }) => { const notebook = 'simple.ipynb'; const menuPath = 'View>Right Sidebar>Show Notebook Tools'; await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${notebook}`), `${tmpPath}/${notebook}` ); await page.goto(`notebooks/${tmpPath}/${notebook}`); await waitForKernelReady(page); await page.menu.clickMenuItem(menuPath); const panel = page.locator('#jp-right-stack'); expect(await panel.isVisible()).toBe(true); await page.isVisible('#notebook-tools.jp-NotebookTools'); await page.isVisible('#notebook-tools.jp-NotebookTools > #add-tag.tag'); const imageName = 'notebooktools-right-panel.png'; expect(await panel.screenshot()).toMatchSnapshot(imageName); }); test('Clicking on "Close and Shut Down Notebook" should close the browser tab', async ({ page, tmpPath, }) => { const notebook = 'simple.ipynb'; await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${notebook}`), `${tmpPath}/${notebook}` ); await page.goto(`notebooks/${tmpPath}/${notebook}`); const menuPath = 'File>Close and Halt'; await page.menu.clickMenuItem(menuPath); // Press Enter to confirm the dialog await page.keyboard.press('Enter'); expect(page.isClosed()); }); test('Toggle the full width of the notebook', async ({ page, browserName, tmpPath, }) => { const notebook = 'simple.ipynb'; await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${notebook}`), `${tmpPath}/${notebook}` ); await page.goto(`notebooks/${tmpPath}/${notebook}`); const menuPath = 'View>Enable Full Width Notebook'; await page.menu.clickMenuItem(menuPath); const notebookPanel = page.locator('.jp-NotebookPanel').first(); await expect(notebookPanel).toHaveClass(/jp-mod-fullwidth/); // click to make the blue border around the cell disappear await page.click('.jp-WindowedPanel-outer'); // wait for the notebook to be ready await waitForNotebook(page, browserName); expect(await page.screenshot()).toMatchSnapshot('notebook-full-width.png'); // undo the full width await page.menu.clickMenuItem(menuPath); await expect(notebookPanel).not.toHaveClass(/jp-mod-fullwidth/); }); test('Open the log console widget in the down area', async ({ page, tmpPath, }) => { const notebook = 'simple.ipynb'; await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${notebook}`), `${tmpPath}/${notebook}` ); await page.goto(`notebooks/${tmpPath}/${notebook}`); const menuPath = 'View>Show Log Console'; await page.menu.clickMenuItem(menuPath); await expect(page.locator('.jp-LogConsole')).toBeVisible(); }); test('Toggle cell outputs with the O keyboard shortcut', async ({ page, tmpPath, }) => { const notebook = 'autoscroll.ipynb'; await page.contents.uploadFile( path.resolve(__dirname, `./notebooks/${notebook}`), `${tmpPath}/${notebook}` ); await page.goto(`notebooks/${tmpPath}/${notebook}`); await waitForKernelReady(page); // Wait for the first cell to be active const firstCell = page.locator('.jp-Cell').first(); await expect(firstCell).toHaveClass(/jp-mod-active/); // run the two cells await page.keyboard.press('Shift+Enter'); await page.keyboard.press('ControlOrMeta+Enter'); await page.keyboard.press('Escape'); await page.keyboard.press('O'); await page.waitForSelector('.jp-OutputPlaceholder', { state: 'visible' }); await page.keyboard.press('O'); await page.waitForSelector('.jp-OutputPlaceholder', { state: 'hidden' }); }); }); ================================================ FILE: ui-tests/test/notebooks/autoscroll.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": null, "id": "6f7028b9-4d2c-4fa2-96ee-bfa77bbee434", "metadata": {}, "outputs": [], "source": [ "print(\"1\\n\" * 200)" ] }, { "cell_type": "code", "execution_count": null, "id": "6f7028b9-4d2c-4fa2-96ee-bfa77bbee434", "metadata": {}, "outputs": [], "source": [ "print(\"1\\n\" * 20)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: ui-tests/test/notebooks/empty.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": null, "id": "6f7028b9-4d2c-4fa2-96ee-bfa77bbee434", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.7" } }, "nbformat": 4, "nbformat_minor": 5 } ================================================ FILE: ui-tests/test/notebooks/local_links.ipynb ================================================ { "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Handle Local Links" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "[Current Directory](./)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "[Open Test Folder](./test)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.3" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: ui-tests/test/notebooks/simple.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Test Notebook" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "name": "python" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: ui-tests/test/notebooks/simple_toc.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# part 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## subpart 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## subpart 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# part 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# part 3" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.5" }, "vscode": { "interpreter": { "hash": "0508733a7f73e6ddc798c911e704189485d436785f398d29dd8c20885fc63cb3" } } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: ui-tests/test/settings.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { test } from './fixtures'; import { expect, galata } from '@jupyterlab/galata'; // Set a fixed string as Playwright is preventing the unique test name to be too long // and replaces part of the path with a hash test.use({ autoGoto: false, tmpPath: 'settings' }); test.describe('Settings', () => { test.beforeAll(async ({ request, tmpPath }) => { const contents = galata.newContentsHelper(request); await contents.createDirectory(tmpPath); }); test.afterAll(async ({ request, tmpPath }) => { const contents = galata.newContentsHelper(request); await contents.deleteDirectory(tmpPath); }); test('Should be persisted after reloading the page', async ({ page, tmpPath, }) => { const showHeaderPath = 'View>Show Header'; await page.goto(`tree/${tmpPath}`); await page.waitForSelector('#top-panel', { state: 'visible' }); await page.menu.clickMenuItem(showHeaderPath); await page.waitForSelector('#top-panel', { state: 'hidden' }); await page.reload({ waitUntil: 'networkidle' }); await page.menu.getMenuItem(showHeaderPath); expect(await page.screenshot()).toMatchSnapshot('top-hidden.png', { maxDiffPixels: 300, }); await page.waitForSelector('#top-panel', { state: 'hidden' }); await page.menu.clickMenuItem(showHeaderPath); await page.waitForSelector('#top-panel', { state: 'visible' }); await page.reload({ waitUntil: 'networkidle' }); await page.menu.getMenuItem(showHeaderPath); expect(await page.screenshot()).toMatchSnapshot('top-visible.png', { maxDiffPixels: 300, }); }); }); ================================================ FILE: ui-tests/test/smoke.spec.ts ================================================ import { expect } from '@jupyterlab/galata'; import { test } from './fixtures'; import { runAndAdvance } from './utils'; test.use({ autoGoto: false }); test.describe('Smoke', () => { test('Tour', async ({ page, tmpPath }) => { // Open the tree page await page.goto(`tree/${tmpPath}`); await page.locator('.jp-TreePanel >> text="Running"').click(); await page.locator('.jp-TreePanel >> text="Files"').click(); // Create a new console await page.menu.clickMenuItem('New>Console'); // Choose the kernel const [console] = await Promise.all([ page.waitForEvent('popup'), page.click('text="Select"'), ]); await console.waitForLoadState(); await console.waitForSelector('.jp-CodeConsole'); // Create a new notebook const notebookPromise = page.waitForEvent('popup'); await page.click('text="New"'); await page .locator( '[data-command="notebook:create-new"] >> text="Python 3 (ipykernel)"' ) .click(); const notebook = await notebookPromise; try { // we may have to select the kernel first await notebook.click('text="Select"', { timeout: 5000 }); } catch { // The kernel is already selected } // Enter code in the first cell await notebook.locator( '.jp-Cell-inputArea >> .cm-editor >> .cm-content[contenteditable="true"]' ).type(`import math math.pi`); // Run the cell runAndAdvance(notebook); // Enter code in the next cell await notebook .locator( '.jp-Cell-inputArea >> .cm-editor >> .cm-content[contenteditable="true"]' ) .nth(1) .type('import this'); // Run the cell runAndAdvance(notebook); // Save the notebook // TODO: re-enable after fixing the name on save dialog? // await notebook.click('//span/*[local-name()="svg"]'); // Click on the Jupyter logo to open the tree page const [tree2] = await Promise.all([ notebook.waitForEvent('popup'), notebook.click( '//*[local-name()="svg" and normalize-space(.)=\'Jupyter\']' ), ]); // Shut down the kernels await tree2.locator('.jp-TreePanel >> text="Running"').click(); await tree2.click('#main-panel jp-button :text("Shut Down All")'); await tree2.press('.jp-Dialog', 'Enter'); // Close the pages await tree2.close(); await notebook.close(); await console.close(); await page.close(); expect(true).toBe(true); }); test('JupyterLab', async ({ page, tmpPath }) => { // Open the tree page await page.goto(`tree/${tmpPath}`); // Open JupyterLab const [lab] = await Promise.all([ page.waitForEvent('popup'), page.menu.clickMenuItem('View>Open JupyterLab'), ]); await lab.waitForSelector('.jp-Launcher'); await lab.close(); expect(true).toBe(true); }); }); ================================================ FILE: ui-tests/test/tree.spec.ts ================================================ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. import { test } from './fixtures'; import { expect } from '@jupyterlab/galata'; const SUBFOLDER = 'subfolder'; test('Tree', async ({ page }) => { await page.goto('tree'); const button = await page.$('text="New Notebook"'); expect(button).toBeDefined(); }); test('should go to subfolder', async ({ page, tmpPath }) => { const dir = `${tmpPath}/${SUBFOLDER}`; await page.contents.createDirectory(dir); await page.goto(`tree/${dir}`); expect( await page.waitForSelector(`.jp-FileBrowser-crumbs >> text=/${SUBFOLDER}/`) ).toBeTruthy(); }); test('should update url when navigating in filebrowser', async ({ page, tmpPath, }) => { await page.contents.createDirectory(`${tmpPath}/${SUBFOLDER}`); await page.dblclick(`.jp-FileBrowser-listing >> text=${SUBFOLDER}`); await page.waitForSelector(`.jp-FileBrowser-crumbs >> text=/${SUBFOLDER}/`); const url = new URL(page.url()); expect(url.pathname).toEqual(`/tree/${tmpPath}/${SUBFOLDER}`); }); test('Should activate file browser tab', async ({ page, tmpPath }) => { await page.goto(`tree/${tmpPath}`); await page.locator('.jp-TreePanel >> text="Running"').click(); await expect( page.locator('#main-panel #jp-running-sessions-tree') ).toBeVisible(); await page.menu.clickMenuItem('View>File Browser'); await expect(page.locator('#main-panel #filebrowser')).toBeVisible(); }); ================================================ FILE: ui-tests/test/utils.ts ================================================ import { IJupyterLabPageFixture } from '@jupyterlab/galata'; import { Page } from '@playwright/test'; /** * Run the selected cell and advance. */ export async function runAndAdvance( page: IJupyterLabPageFixture | Page ): Promise { await page.keyboard.press('Shift+Enter'); } /** * Wait for the kernel to be ready */ export async function waitForKernelReady(page: Page): Promise { await page.waitForSelector('.jp-NotebookKernelStatus-fade'); await page.waitForFunction(() => { const status = window.document.getElementsByClassName( 'jp-NotebookKernelStatus' )[0]; if (!status) { return false; } const finished = status?.getAnimations().reduce((prev, curr) => { return prev && curr.playState === 'finished'; }, true); return finished; }); const viewport = page.viewportSize(); const width = viewport?.width; if (width && width > 600) { await page.waitForSelector('.jp-DebuggerBugButton[aria-disabled="false"]'); } } /** * Special case for firefox headless issue * See https://github.com/jupyter/notebook/pull/6872#issuecomment-1549594166 for more details */ export async function hideAddCellButton(page: Page): Promise { await page .locator('.jp-Notebook-footer') .evaluate((element) => (element.style.display = 'none')); } /** * Wait for the notebook to be ready */ export async function waitForNotebook( page: Page, browserName = '' ): Promise { // wait for the kernel status animations to be finished await waitForKernelReady(page); await page.waitForSelector( ".jp-Notebook-ExecutionIndicator[data-status='idle']" ); const checkpointLocator = '.jp-NotebookCheckpoint'; // wait for the checkpoint indicator to be displayed await page.waitForSelector(checkpointLocator); // remove the amount of seconds manually since it might display strings such as "3 seconds ago" await page .locator(checkpointLocator) .evaluate( (element) => (element.innerHTML = 'Last Checkpoint: 3 seconds ago') ); // special case for firefox headless issue // see https://github.com/jupyter/notebook/pull/6872#issuecomment-1549594166 for more details if (browserName === 'firefox') { await hideAddCellButton(page); } } ================================================ FILE: ui-tests/tsconfig.test.json ================================================ { "extends": "../tsconfigbase.test", "include": ["test/**/*"] }