'
- )
- print('Pass: Pull request raiser has signed the Contributor Licence Agreement')
- return SUCCESS_MESSAGE
-
-
-def validate_commiters_cla(commits, employer_contributors, personal_contributors):
- # github logins of all committers
- commit_logins = []
- for commit in commits:
- commiter_github_login = commit['author']['login']
- if commiter_github_login not in commit_logins:
- commit_logins.append(commiter_github_login)
- print("All github users who made changes to the pull request: ", commit_logins)
-
- unauthorized_commiters = []
- for user in commit_logins:
- if user not in personal_contributors and user not in employer_contributors:
- unauthorized_commiters.append(user)
- if len(unauthorized_commiters) != 0:
- return task_failed('### Error: Contributor Licence Agreement Signature Missing\n' +
- 'The following commiter(s) has not signed the Contributor Licence Agreement:\n' +
- ', '.join(unauthorized_commiters) + '\n' +
- 'Please sign the Contributor Licence Agreement by clicking the following link. \n' +
- '
Please contact the owner of the site that linked you to the original URL and let them know their link is broken.
+
+
\ No newline at end of file
diff --git a/404.html.html b/404.html.html
new file mode 100644
index 00000000..f5f9be29
--- /dev/null
+++ b/404.html.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index 6e07e9a8..00000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-We as members, contributors, and leaders pledge to make participation in our
-community a harassment-free experience for everyone, regardless of age, body
-size, visible or invisible disability, ethnicity, sex characteristics, gender
-identity and expression, level of experience, education, socio-economic status,
-nationality, personal appearance, race, religion, or sexual identity
-and orientation.
-
-We pledge to act and interact in ways that contribute to an open, welcoming,
-diverse, inclusive, and healthy community.
-
-## Our Standards
-
-Examples of behavior that contributes to a positive environment for our
-community include:
-
-* Demonstrating empathy and kindness toward other people
-* Being respectful of differing opinions, viewpoints, and experiences
-* Giving and gracefully accepting constructive feedback
-* Accepting responsibility and apologizing to those affected by our mistakes,
- and learning from the experience
-* Focusing on what is best not just for us as individuals, but for the
- overall community
-
-Examples of unacceptable behavior include:
-
-* The use of sexualized language or imagery, and sexual attention or
- advances of any kind
-* Trolling, insulting or derogatory comments, and personal or political attacks
-* Public or private harassment
-* Publishing others' private information, such as a physical or email
- address, without their explicit permission
-* Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Enforcement Responsibilities
-
-Community leaders are responsible for clarifying and enforcing our standards of
-acceptable behavior and will take appropriate and fair corrective action in
-response to any behavior that they deem inappropriate, threatening, offensive,
-or harmful.
-
-Community leaders have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions that are
-not aligned to this Code of Conduct, and will communicate reasons for moderation
-decisions when appropriate.
-
-## Scope
-
-This Code of Conduct applies within all community spaces, and also applies when
-an individual is officially representing the community in public spaces.
-Examples of representing our community include using an official e-mail address,
-posting via an official social media account, or acting as an appointed
-representative at an online or offline event.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the community leaders responsible for enforcement at
-community-support@core.ai .
-All complaints will be reviewed and investigated promptly and fairly.
-
-All community leaders are obligated to respect the privacy and security of the
-reporter of any incident.
-
-## Enforcement Guidelines
-
-Community leaders will follow these Community Impact Guidelines in determining
-the consequences for any action they deem in violation of this Code of Conduct:
-
-### 1. Correction
-
-**Community Impact**: Use of inappropriate language or other behavior deemed
-unprofessional or unwelcome in the community.
-
-**Consequence**: A private, written warning from community leaders, providing
-clarity around the nature of the violation and an explanation of why the
-behavior was inappropriate. A public apology may be requested.
-
-### 2. Warning
-
-**Community Impact**: A violation through a single incident or series
-of actions.
-
-**Consequence**: A warning with consequences for continued behavior. No
-interaction with the people involved, including unsolicited interaction with
-those enforcing the Code of Conduct, for a specified period of time. This
-includes avoiding interactions in community spaces as well as external channels
-like social media. Violating these terms may lead to a temporary or
-permanent ban.
-
-### 3. Temporary Ban
-
-**Community Impact**: A serious violation of community standards, including
-sustained inappropriate behavior.
-
-**Consequence**: A temporary ban from any sort of interaction or public
-communication with the community for a specified period of time. No public or
-private interaction with the people involved, including unsolicited interaction
-with those enforcing the Code of Conduct, is allowed during this period.
-Violating these terms may lead to a permanent ban.
-
-### 4. Permanent Ban
-
-**Community Impact**: Demonstrating a pattern of violation of community
-standards, including sustained inappropriate behavior, harassment of an
-individual, or aggression toward or disparagement of classes of individuals.
-
-**Consequence**: A permanent ban from any sort of public interaction within
-the community.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage],
-version 2.0, available at
-https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
-
-Community Impact Guidelines were inspired by [Mozilla's code of conduct
-enforcement ladder](https://github.com/mozilla/diversity).
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see the FAQ at
-https://www.contributor-covenant.org/faq. Translations are available at
-https://www.contributor-covenant.org/translations.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index bff9c847..00000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# Contributing to Open Research
-:+1::tada: Thanks for taking the time to contribute! :tada::+1:
-## Table of Contents
-1. [About the Project](#about-the-project)
-1. [Project Status](#project-status)
-1. [Getting Started](#getting-started)
-
-## Community engagement
-1. [Code of Conduct](https://github.com/phcode-dev/docs/blob/main/CODE_OF_CONDUCT.md)
-1. [License](https://github.com/phcode-dev/docs/blob/main/LICENSE)
-### Need support?
- * Log an issue with us [here](https://github.com/phcode-dev/docs/issues/new/choose)
-### Engage with the community?
- * Discuss the project [here](https://github.com/phcode-dev/docs/discussions)
- * Join our community discord channel [here](https://discord.com/invite/rBpTBPttca).
-
-# About the Project
-Documentation for phoenix/brackets
-
-## Project Status
-* Active.
-
-# Getting Started
-* see https://github.com/phcode-dev/docs/blob/main/README.md
diff --git a/CREDITS.md b/CREDITS.md
deleted file mode 100644
index 3a304bd6..00000000
--- a/CREDITS.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Credits
-
-## Attributions for Images and other assets used
-
-### https://onlinewebfonts.com
-* https://www.onlinewebfonts.com/icon/434398
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index f987f3da..00000000
--- a/LICENSE
+++ /dev/null
@@ -1,395 +0,0 @@
-Attribution 4.0 International
-
-=======================================================================
-
-Creative Commons Corporation ("Creative Commons") is not a law firm and
-does not provide legal services or legal advice. Distribution of
-Creative Commons public licenses does not create a lawyer-client or
-other relationship. Creative Commons makes its licenses and related
-information available on an "as-is" basis. Creative Commons gives no
-warranties regarding its licenses, any material licensed under their
-terms and conditions, or any related information. Creative Commons
-disclaims all liability for damages resulting from their use to the
-fullest extent possible.
-
-Using Creative Commons Public Licenses
-
-Creative Commons public licenses provide a standard set of terms and
-conditions that creators and other rights holders may use to share
-original works of authorship and other material subject to copyright
-and certain other rights specified in the public license below. The
-following considerations are for informational purposes only, are not
-exhaustive, and do not form part of our licenses.
-
- Considerations for licensors: Our public licenses are
- intended for use by those authorized to give the public
- permission to use material in ways otherwise restricted by
- copyright and certain other rights. Our licenses are
- irrevocable. Licensors should read and understand the terms
- and conditions of the license they choose before applying it.
- Licensors should also secure all rights necessary before
- applying our licenses so that the public can reuse the
- material as expected. Licensors should clearly mark any
- material not subject to the license. This includes other CC-
- licensed material, or material used under an exception or
- limitation to copyright. More considerations for licensors:
- wiki.creativecommons.org/Considerations_for_licensors
-
- Considerations for the public: By using one of our public
- licenses, a licensor grants the public permission to use the
- licensed material under specified terms and conditions. If
- the licensor's permission is not necessary for any reason--for
- example, because of any applicable exception or limitation to
- copyright--then that use is not regulated by the license. Our
- licenses grant only permissions under copyright and certain
- other rights that a licensor has authority to grant. Use of
- the licensed material may still be restricted for other
- reasons, including because others have copyright or other
- rights in the material. A licensor may make special requests,
- such as asking that all changes be marked or described.
- Although not required by our licenses, you are encouraged to
- respect those requests where reasonable. More considerations
- for the public:
- wiki.creativecommons.org/Considerations_for_licensees
-
-=======================================================================
-
-Creative Commons Attribution 4.0 International Public License
-
-By exercising the Licensed Rights (defined below), You accept and agree
-to be bound by the terms and conditions of this Creative Commons
-Attribution 4.0 International Public License ("Public License"). To the
-extent this Public License may be interpreted as a contract, You are
-granted the Licensed Rights in consideration of Your acceptance of
-these terms and conditions, and the Licensor grants You such rights in
-consideration of benefits the Licensor receives from making the
-Licensed Material available under these terms and conditions.
-
-
-Section 1 -- Definitions.
-
- a. Adapted Material means material subject to Copyright and Similar
- Rights that is derived from or based upon the Licensed Material
- and in which the Licensed Material is translated, altered,
- arranged, transformed, or otherwise modified in a manner requiring
- permission under the Copyright and Similar Rights held by the
- Licensor. For purposes of this Public License, where the Licensed
- Material is a musical work, performance, or sound recording,
- Adapted Material is always produced where the Licensed Material is
- synched in timed relation with a moving image.
-
- b. Adapter's License means the license You apply to Your Copyright
- and Similar Rights in Your contributions to Adapted Material in
- accordance with the terms and conditions of this Public License.
-
- c. Copyright and Similar Rights means copyright and/or similar rights
- closely related to copyright including, without limitation,
- performance, broadcast, sound recording, and Sui Generis Database
- Rights, without regard to how the rights are labeled or
- categorized. For purposes of this Public License, the rights
- specified in Section 2(b)(1)-(2) are not Copyright and Similar
- Rights.
-
- d. Effective Technological Measures means those measures that, in the
- absence of proper authority, may not be circumvented under laws
- fulfilling obligations under Article 11 of the WIPO Copyright
- Treaty adopted on December 20, 1996, and/or similar international
- agreements.
-
- e. Exceptions and Limitations means fair use, fair dealing, and/or
- any other exception or limitation to Copyright and Similar Rights
- that applies to Your use of the Licensed Material.
-
- f. Licensed Material means the artistic or literary work, database,
- or other material to which the Licensor applied this Public
- License.
-
- g. Licensed Rights means the rights granted to You subject to the
- terms and conditions of this Public License, which are limited to
- all Copyright and Similar Rights that apply to Your use of the
- Licensed Material and that the Licensor has authority to license.
-
- h. Licensor means the individual(s) or entity(ies) granting rights
- under this Public License.
-
- i. Share means to provide material to the public by any means or
- process that requires permission under the Licensed Rights, such
- as reproduction, public display, public performance, distribution,
- dissemination, communication, or importation, and to make material
- available to the public including in ways that members of the
- public may access the material from a place and at a time
- individually chosen by them.
-
- j. Sui Generis Database Rights means rights other than copyright
- resulting from Directive 96/9/EC of the European Parliament and of
- the Council of 11 March 1996 on the legal protection of databases,
- as amended and/or succeeded, as well as other essentially
- equivalent rights anywhere in the world.
-
- k. You means the individual or entity exercising the Licensed Rights
- under this Public License. Your has a corresponding meaning.
-
-
-Section 2 -- Scope.
-
- a. License grant.
-
- 1. Subject to the terms and conditions of this Public License,
- the Licensor hereby grants You a worldwide, royalty-free,
- non-sublicensable, non-exclusive, irrevocable license to
- exercise the Licensed Rights in the Licensed Material to:
-
- a. reproduce and Share the Licensed Material, in whole or
- in part; and
-
- b. produce, reproduce, and Share Adapted Material.
-
- 2. Exceptions and Limitations. For the avoidance of doubt, where
- Exceptions and Limitations apply to Your use, this Public
- License does not apply, and You do not need to comply with
- its terms and conditions.
-
- 3. Term. The term of this Public License is specified in Section
- 6(a).
-
- 4. Media and formats; technical modifications allowed. The
- Licensor authorizes You to exercise the Licensed Rights in
- all media and formats whether now known or hereafter created,
- and to make technical modifications necessary to do so. The
- Licensor waives and/or agrees not to assert any right or
- authority to forbid You from making technical modifications
- necessary to exercise the Licensed Rights, including
- technical modifications necessary to circumvent Effective
- Technological Measures. For purposes of this Public License,
- simply making modifications authorized by this Section 2(a)
- (4) never produces Adapted Material.
-
- 5. Downstream recipients.
-
- a. Offer from the Licensor -- Licensed Material. Every
- recipient of the Licensed Material automatically
- receives an offer from the Licensor to exercise the
- Licensed Rights under the terms and conditions of this
- Public License.
-
- b. No downstream restrictions. You may not offer or impose
- any additional or different terms or conditions on, or
- apply any Effective Technological Measures to, the
- Licensed Material if doing so restricts exercise of the
- Licensed Rights by any recipient of the Licensed
- Material.
-
- 6. No endorsement. Nothing in this Public License constitutes or
- may be construed as permission to assert or imply that You
- are, or that Your use of the Licensed Material is, connected
- with, or sponsored, endorsed, or granted official status by,
- the Licensor or others designated to receive attribution as
- provided in Section 3(a)(1)(A)(i).
-
- b. Other rights.
-
- 1. Moral rights, such as the right of integrity, are not
- licensed under this Public License, nor are publicity,
- privacy, and/or other similar personality rights; however, to
- the extent possible, the Licensor waives and/or agrees not to
- assert any such rights held by the Licensor to the limited
- extent necessary to allow You to exercise the Licensed
- Rights, but not otherwise.
-
- 2. Patent and trademark rights are not licensed under this
- Public License.
-
- 3. To the extent possible, the Licensor waives any right to
- collect royalties from You for the exercise of the Licensed
- Rights, whether directly or through a collecting society
- under any voluntary or waivable statutory or compulsory
- licensing scheme. In all other cases the Licensor expressly
- reserves any right to collect such royalties.
-
-
-Section 3 -- License Conditions.
-
-Your exercise of the Licensed Rights is expressly made subject to the
-following conditions.
-
- a. Attribution.
-
- 1. If You Share the Licensed Material (including in modified
- form), You must:
-
- a. retain the following if it is supplied by the Licensor
- with the Licensed Material:
-
- i. identification of the creator(s) of the Licensed
- Material and any others designated to receive
- attribution, in any reasonable manner requested by
- the Licensor (including by pseudonym if
- designated);
-
- ii. a copyright notice;
-
- iii. a notice that refers to this Public License;
-
- iv. a notice that refers to the disclaimer of
- warranties;
-
- v. a URI or hyperlink to the Licensed Material to the
- extent reasonably practicable;
-
- b. indicate if You modified the Licensed Material and
- retain an indication of any previous modifications; and
-
- c. indicate the Licensed Material is licensed under this
- Public License, and include the text of, or the URI or
- hyperlink to, this Public License.
-
- 2. You may satisfy the conditions in Section 3(a)(1) in any
- reasonable manner based on the medium, means, and context in
- which You Share the Licensed Material. For example, it may be
- reasonable to satisfy the conditions by providing a URI or
- hyperlink to a resource that includes the required
- information.
-
- 3. If requested by the Licensor, You must remove any of the
- information required by Section 3(a)(1)(A) to the extent
- reasonably practicable.
-
- 4. If You Share Adapted Material You produce, the Adapter's
- License You apply must not prevent recipients of the Adapted
- Material from complying with this Public License.
-
-
-Section 4 -- Sui Generis Database Rights.
-
-Where the Licensed Rights include Sui Generis Database Rights that
-apply to Your use of the Licensed Material:
-
- a. for the avoidance of doubt, Section 2(a)(1) grants You the right
- to extract, reuse, reproduce, and Share all or a substantial
- portion of the contents of the database;
-
- b. if You include all or a substantial portion of the database
- contents in a database in which You have Sui Generis Database
- Rights, then the database in which You have Sui Generis Database
- Rights (but not its individual contents) is Adapted Material; and
-
- c. You must comply with the conditions in Section 3(a) if You Share
- all or a substantial portion of the contents of the database.
-
-For the avoidance of doubt, this Section 4 supplements and does not
-replace Your obligations under this Public License where the Licensed
-Rights include other Copyright and Similar Rights.
-
-
-Section 5 -- Disclaimer of Warranties and Limitation of Liability.
-
- a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE
- EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS
- AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF
- ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS,
- IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION,
- WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR
- PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS,
- ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT
- KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT
- ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU.
-
- b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE
- TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
- NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT,
- INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES,
- COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR
- USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN
- ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR
- DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR
- IN PART, THIS LIMITATION MAY NOT APPLY TO YOU.
-
- c. The disclaimer of warranties and limitation of liability provided
- above shall be interpreted in a manner that, to the extent
- possible, most closely approximates an absolute disclaimer and
- waiver of all liability.
-
-
-Section 6 -- Term and Termination.
-
- a. This Public License applies for the term of the Copyright and
- Similar Rights licensed here. However, if You fail to comply with
- this Public License, then Your rights under this Public License
- terminate automatically.
-
- b. Where Your right to use the Licensed Material has terminated under
- Section 6(a), it reinstates:
-
- 1. automatically as of the date the violation is cured, provided
- it is cured within 30 days of Your discovery of the
- violation; or
-
- 2. upon express reinstatement by the Licensor.
-
- For the avoidance of doubt, this Section 6(b) does not affect any
- right the Licensor may have to seek remedies for Your violations
- of this Public License.
-
- c. For the avoidance of doubt, the Licensor may also offer the
- Licensed Material under separate terms or conditions or stop
- distributing the Licensed Material at any time; however, doing so
- will not terminate this Public License.
-
- d. Sections 1, 5, 6, 7, and 8 survive termination of this Public
- License.
-
-
-Section 7 -- Other Terms and Conditions.
-
- a. The Licensor shall not be bound by any additional or different
- terms or conditions communicated by You unless expressly agreed.
-
- b. Any arrangements, understandings, or agreements regarding the
- Licensed Material not stated herein are separate from and
- independent of the terms and conditions of this Public License.
-
-
-Section 8 -- Interpretation.
-
- a. For the avoidance of doubt, this Public License does not, and
- shall not be interpreted to, reduce, limit, restrict, or impose
- conditions on any use of the Licensed Material that could lawfully
- be made without permission under this Public License.
-
- b. To the extent possible, if any provision of this Public License is
- deemed unenforceable, it shall be automatically reformed to the
- minimum extent necessary to make it enforceable. If the provision
- cannot be reformed, it shall be severed from this Public License
- without affecting the enforceability of the remaining terms and
- conditions.
-
- c. No term or condition of this Public License will be waived and no
- failure to comply consented to unless expressly agreed to by the
- Licensor.
-
- d. Nothing in this Public License constitutes or may be interpreted
- as a limitation upon, or waiver of, any privileges and immunities
- that apply to the Licensor or You, including from the legal
- processes of any jurisdiction or authority.
-
-
-=======================================================================
-
-Creative Commons is not a party to its public licenses.
-Notwithstanding, Creative Commons may elect to apply one of its public
-licenses to material it publishes and in those instances will be
-considered the “Licensor.” The text of the Creative Commons public
-licenses is dedicated to the public domain under the CC0 Public Domain
-Dedication. Except for the limited purpose of indicating that material
-is shared under a Creative Commons public license or as otherwise
-permitted by the Creative Commons policies published at
-creativecommons.org/policies, Creative Commons does not authorize the
-use of the trademark "Creative Commons" or any other trademark or logo
-of Creative Commons without its prior written consent including,
-without limitation, in connection with any unauthorized modifications
-to any of its public licenses or any other arrangements,
-understandings, or agreements concerning use of licensed material. For
-the avoidance of doubt, this paragraph does not form part of the public
-licenses.
-
-Creative Commons may be contacted at creativecommons.org.
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index abcba775..00000000
--- a/README.md
+++ /dev/null
@@ -1,54 +0,0 @@
-## Welcome to Phoenix Documentation
-
-This repository hosts the code for https://docs.phcode.dev/ . Please contribute
-to this repo for helping the Phoenix/Brackets community.
-
-## License
-
-CC BY License Copyright (c) 2022-present, core.ai
-
-# Website
-
-This website is built using [Docusaurus 2](https://docusaurus.io/), a modern
-static website generator.
-
-### Installation
-
-```
-$ npm install
-```
-
-### Local Development
-
-```
-$ npm run start
-```
-
-This command starts a local development server and opens up a browser window.
-Most changes are reflected live without having to restart the server.
-
-### Build
-
-```
-$ npm run build
-```
-
-This command generates static content into the `build` directory and can be
-served using any static contents hosting service.
-
-### Deployment
-
-Using SSH:
-
-```
-$ USE_SSH=true npm run deploy
-```
-
-Not using SSH:
-
-```
-$ GIT_USER= npm run deploy
-```
-
-If you are using GitHub pages for hosting, this command is a convenient way to
-build the website and push to the `gh-pages` branch.
diff --git a/SECURITY.md b/SECURITY.md
deleted file mode 100644
index 2cd2b52b..00000000
--- a/SECURITY.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Security Policy
-
-## Supported Versions
-
-| Version | Supported |
-| ------- | ------------------ |
-| > 1.0 | :white_check_mark: |
-| < 1.0 | :x: |
-
-## Reporting a Vulnerability
-
-If you have found a potential security threat, vulnerability or exploit in Phoenix Code Editor
-or one of its upstream dependencies, please DON’T create a pull-request, DON’T
-file an issue on GitHub, DON’T mention it on Discord and DON’T create a forum thread.
-
-Please submit your report via the [GitHub Private Vulnerability Disclosure functionality](https://github.com/phcode-dev/phoenix/security/advisories/new).
-
-Find out more about the reporting process [here](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability).
-
-Our team will triage your report and keep you informed about the progress.
-We may ask questions or request further guidance on reproduction of the vulnerability in the comments of the advisory, which will be publicized.
-
-Additionally, we may ask you to independently verify our patch, which will be available in the private advisory branch. Please do not publish your vulnerability during the process or before coordinated public disclosure from our side. We try to adhere to common standards of publication within 90-Days of disclosure.
-
-Depending on your decision to accept or deny credit for the vulnerability, you will be publicly attributed to the vulnerability and may be mentioned in our announcements.
-
-At the current time we do not have the financial ability to reward bounties,
-but in extreme cases will at our discretion consider a reward.
diff --git a/api/01-getting-started.md b/api/01-getting-started.md
deleted file mode 100644
index 306cb805..00000000
--- a/api/01-getting-started.md
+++ /dev/null
@@ -1,33 +0,0 @@
----
-title: Getting Started
----
-
-This guide provides an overview on the documentation structure and how to get started with the Phoenix Code API documentation!
-
-## Documentation Structure
-
-The Phoenix Code API documentation is organized into sections for easy navigation. Here’s a quick overview of the key sections:
-
-### [Creating Themes](./creating-themes)
-This page provides guidelines on how to create custom Themes for **Phoenix Code**.
-
-### [Creating Extensions](./creating-extensions)
-This page provides guidelines on how to write Extensions for **Phoenix Code**.
-
-### [Use Node.js from extension](./creating-node-extensions)
-This page explains how to use Node.js inside **Phoenix Code** extensions.
-
-### [Debugging Extensions](./debugging-extensions)
-This page provides a detailed guide on efficiently debugging your **Phoenix Code** extensions.
-
-### [Publishing Themes & Extensions](./publishing-extensions)
-This page provides guidelines on how to publish Themes/Extensions to **Phoenix Code**.
-
-### [Available Standard Libraries](./available-standard-libs)
-This page lists all the standard libraries that are available for use inside **Phoenix Code**.
-
-## API Reference
-
-The API-Reference directory contains detailed reference documentation for each part of the Phoenix Code API. Each page here corresponds to different components, functions, or modules of the API, providing explanations, usage examples, and detailed parameter descriptions.
-
-> This documentation is automatically generated from the source code. To learn more about how these docs are generated, refer to [this link](https://github.com/phcode-dev/phoenix/wiki/02-Writing-Docs).
diff --git a/api/02-creating-themes.md b/api/02-creating-themes.md
deleted file mode 100644
index 41530c23..00000000
--- a/api/02-creating-themes.md
+++ /dev/null
@@ -1,82 +0,0 @@
----
-title: Creating Themes
----
-
-import React from 'react';
-import VideoPlayer from '@site/src/components/Video/player';
-
-This document outlines how to create your own themes for **Phoenix Code**.
-
-## Follow these steps to create a new theme:
-
-### Step 1:
-Open this link [Theme-Template](https://github.com/phcode-dev/theme-template).
-This is the default Phoenix Code theme template repository.
-
-
-
-
-### Step 2:
-Use the template to create your repository.
-
-
-
-
-### Step 3:
-Clone the repository you created in Step 2 to your local machine.
-
-Go to [https://create.phcode.dev](https://create.phcode.dev). This is a development-focused version of phcode.dev which shows non minified JS/CSS files in the browser developer tools.
-
-Now, open the cloned folder in `create.phcode.dev`. Refer to [this guide](https://docs.phcode.dev/docs/quick-start-project#open-folder) to see how to open a folder in Phoenix Code.
-
-
-
-
-### Step 4:
-
-Now, go to `package.json` file and update the values accordingly.
-
-Here is a quick reference :-
-
-| Field | Description |
-| --- | --- |
-| `title` | Replace "Name of the theme" with the actual title of your theme. |
-| `name` | Change `github--` to your specific package name, formatted as `github-yourusername-repositoryname`. |
-| `description` | Update to a brief, relevant description about your theme. |
-| `version` | Start with "0.0.1" or update to reflect your current version following semantic versioning. |
-| `license` | Confirm "MIT" is suitable or specify another license, if necessary. |
-| `author` | Replace with your name and a link to your GitHub profile or another URL. |
-| `homepage` | Set to the URL of your project’s homepage or GitHub repository. |
-| `engines` | Ensure compatibility with the required Brackets version, e.g., ">=3.0.0". |
-| `categories` | Update "demo" with relevant categories that fit your theme. |
-| `keywords` | Update or append additional keywords that describe your theme. Example :- ‘dark-theme’, ‘aesthetic’, ‘blue’. |
-| `theme` | Make sure all necessary theme files and folders are included. Set “Dark” to `true` if its a dark theme, else `false`. |
-
-Save the file after making all the changes.
-
-
-### Step 5:
-
-Now, go to `my-theme.less` file. Click on `Debug` in the Menu bar and select `Load Project As Extension`.
-
-
-
-This should be the default output.
-
-
-
-This file contains all the UI elements as variables. You can modify the colors as per your needs and live preview them.
-
-
-
-> You can also select `Debug > Reload Project As Extension` to test the new code changes.
-
-When you are done developing the theme, select `Debug > Unload Project As Extension` to unload the theme.
-
-Once the theme is complete, you can publish it to [phcode.dev](https://phcode.dev) extension repository.
-
-Refer to [this link](./publishing-extensions) to see how to publish the theme.
diff --git a/api/03-creating-extensions.md b/api/03-creating-extensions.md
deleted file mode 100644
index a68cbab4..00000000
--- a/api/03-creating-extensions.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: Creating Extensions
----
-
-This document outlines how to write your own extensions for **Phoenix Code**.
-
-## How to create a new Extension
-Click on the link below and follow the instructions there to start:
-[Create an Extension](https://github.com/phcode-dev/extension-template)
-
-## API docs
-Please refer to the links below for extension API docs and code references.
-* Phoenix Code APIs - [API Reference](./API-Reference/NodeConnector)
-* Take a look at our default extensions for code reference - [Default Extensions](https://github.com/phcode-dev/phoenix/tree/main/src/extensions/default)
-
-## Running and Debugging your Extension
-Follow the steps below to run and debug your extension:
-
-* Clone your extension repository onto the machine.
-
-* Go to [https://create.phcode.dev](https://create.phcode.dev). This is a development-focused version of phcode.dev which shows non minified JS/CSS files in the browser developer tools.
-
-* Now, open the cloned folder in `create.phcode.dev`.
-> Refer to [this guide](https://docs.phcode.dev/docs/quick-start-project#open-folder) to see how to open a folder in Phoenix Code.
-* Select `Debug > Load Project As Extension`
-
-
-
-
-* The extension will be loaded in Phoenix Code.
-
-* You can now make code changes and live preview them.
-
-> You can also select `Debug > Reload Project As Extension` to test the new code changes.
-
-* When you are done developing the extension, select `Debug > Unload Project As Extension` to unload the extension.
-
-**You can use the browser developer tools to debug the extension.**
-
-
diff --git a/api/04-creating-node-extensions.md b/api/04-creating-node-extensions.md
deleted file mode 100644
index 9351963f..00000000
--- a/api/04-creating-node-extensions.md
+++ /dev/null
@@ -1,70 +0,0 @@
----
-title: Use node.js from your extension
----
-
-This document outlines how to create node extensions for **Phoenix Code**.
-
-## What is a Node Extension?
-
-Node Extensions in Phoenix Code bring the power of Node.js to your desktop development environment, unlocking access to the vast npm ecosystem for building feature-rich extensions. By leveraging Node.js runtime capabilities, these extensions can perform system-level operations like executing commands, accessing local files, or integrating with external applications – functionalities that aren't possible in traditional browser-based extensions.
-
-One of the key advantages of Node Extensions is their ability to handle computationally intensive tasks without impacting the editor's performance. While browser-based extensions run in the main thread and can potentially freeze the UI during heavy processing, Node Extensions can offload these operations to separate processes. This makes them ideal for scenarios involving extensive image processing, code analysis, or other resource-demanding tasks. Whether you're building a system integration tool or implementing complex background processing, Node Extensions provide the perfect foundation for creating powerful, responsive extensions in Phoenix Code's desktop environment.
-For cross-platform compatibility between desktop and browser environments, you can alternatively use Web Workers to handle computation-intensive tasks. This approach requires bundling any npm dependencies using webpack or similar tools before they can run in the browser. Check out our [Web Worker Communication guide](https://docs.phcode.dev/api/API-Reference/worker/WorkerComm) for detailed instructions on implementing and managing Web Workers in your extension.
-
-Important: When using Node Extensions for heavy computational tasks, make sure to fork a separate Node.js process or worker rather than running operations in the main Node.js process. This separation ensures optimal performance and stability of your extension within Phoenix Code.
-
-## How to create a Node Extension
-
-To create a new node extension for Phoenix Code, use [this template](https://github.com/phcode-dev/extension-node-template). This template extension works in the browser as well as desktop builds. In browser, it will not use node, and node.js based functionalities are not available. Desktop builds can use node capabilities.
-
-In desktop builds, there is an additional capability to execute node.js code. This is helpful if you want to extend the functionality of Phoenix Code using the vast npm library.
-
-For creating extensions that do not need node, use: [https://github.com/phcode-dev/extension-template](https://github.com/phcode-dev/extension-template)
-
-
-## Setting up node extensions
-
-In package.json, add the following section
-
-```
-{
- "nodeConfig": {
- "nodeIsRequired": false,
- "main": "node/index.js",
- "npmInstall": "node/"
- }
-}
-```
-
-## nodeConfig Object
-
-The nodeConfig object indicates that this is a Node extension.
-### nodeIsRequired Field
-
-Set this field to `true` if the extension relies on Node and won't function without it.
-If set to `false` or omitted, the extension can still be loaded in browser versions of Phoenix code without Node support, but it will use Node in native builds.
-It will be shown in the extension manager dialog in browser builds as well.
-
-### main Field
-
-Specifies the main entry point for the Node.js component of the extension.
-Should point to the main JavaScript file for the Node part of the extension.
-Example: "main": "node/index.js"
-
-### npmInstall Field (Optional)
-
-Specifies the path to run npm install when the user installs the extension from the extension manager.
-It's advisable not to package node_modules inside the extension. Only the package lock file should be distributed.
-Example: "npmInstall": "node/"
-
-## Communicating between node.js and Phoenix Code
-
-Use the [NodeConnector-API](https://docs.phcode.dev/api/API-Reference/NodeConnector) to call functions and send events between your node.js and Phoenix Code extension components.
-
-This is available as a global object global.createNodeConnector.
-
-[EventDispatcher-API](https://docs.phcode.dev/api/API-Reference/utils/EventDispatcher) is also available in the global context as global.EventDispatcher for event trigger/listen within node.
-
-
-## Using this template
-[Click Here](https://github.com/phcode-dev/extension-node-template/blob/main/README.md#using-this-template) for the instructions on how to use this template.
\ No newline at end of file
diff --git a/api/05-debugging-extensions.md b/api/05-debugging-extensions.md
deleted file mode 100644
index c562fefb..00000000
--- a/api/05-debugging-extensions.md
+++ /dev/null
@@ -1,52 +0,0 @@
----
-title: Debugging Extensions
----
-
-The Debug menu provides several options for extension development.
-
-
-
-## Phoenix Code Developer Tools
-
-The `Phoenix Code Developer Tools` option (shortcut: F12) opens up the DevTools. Use this to inspect the DOM, preview logs and debug scripts.
-
-
-
-## Phoenix Code Diagnostic Tools
-
-To open Phoenix Code Diagnostic tools, click on the `Debug` menu on the menu bar and navigate to the `Phoenix Code Diagnostic Tools` option. This section provides several tools for debugging purposes.
-
-
-
-### Available Diagnostic Tools
-
-1. `Run Phoenix Code Tests`
- Executes built-in tests to verify the functionality of Phoenix Code.
-
-2. `Build Editor Tests`
- Builds and runs tests specifically for the editor environment.
-
-3. `Enable Detailed Logs`
- Activates verbose logging for better insight into extension behavior. Use this to identify errors or unexpected behaviors during development.
-
-4. `Enable PhNode Inspector`
- Launches the PhNode inspector, allowing in-depth inspection of the extension runtime environment.
-
-5. `How to Inspect PhNode`
- Provides a guide to effectively use the PhNode Inspector.
-
-
-6. `Live Preview Logs`
- Displays real-time logs for active live previews, helping debug changes dynamically.
-
-7. `Show Performance Data`
- Generates performance metrics to identify bottlenecks or performance issues within the extension.
-
-8. `Open Virtual File System`
- Opens and inspects the virtual file system used by Phoenix Code.
-
-## FAQs
-
-Q. Why is console.log not displaying?
-
-- By default, console logs are disabled. To enable them, click on Enable Detailed Logs under Phoenix Code Diagnostic Tools.
\ No newline at end of file
diff --git a/api/06-publishing-extensions.md b/api/06-publishing-extensions.md
deleted file mode 100644
index 21e44af9..00000000
--- a/api/06-publishing-extensions.md
+++ /dev/null
@@ -1,70 +0,0 @@
----
-title: Publishing Themes & Extensions
----
-
-This document outlines how to publish your Extensions/Themes to Phoenix Code Extension store.
-
-## Publishing Extensions/Themes.
-Extensions created from the Phoenix Code extension/theme template can be easily published from your GitHub repository to the store.
-
-Follow these steps:
-
-1. Increment the `version` field in `package.json` file before publishing, if needed.
-2. Compress the extension folder into a zip file with name `extension.zip`.
-> **It is important to name the file as exactly `extension.zip`**
-
-
-
-3. Create a new release in GitHub and attach the above `extension.zip` file in the release.
- 1. On GitHub.com, navigate to the main page of the repository.
- 2. To the right of the list of files, click `Releases`.
-
- 
-
- 3. Click on `Draft a new release`.
-
- 
-
- 4. Select `choose a tag` and type in your new extension version and `Create new tag`.
-
- 
-
- 5. Fill out all the remaining fields.
- 6. Drag and drop the `extension.zip` file to the release.
-
- 
-
- 7. Click on `Publish release` button.
- > See Release Example: https://github.com/phcode-dev/extension-template/releases/tag/0.0.1
-4. You will get an issue in your issue tab regarding the publishing status of the extension/theme.
- > See Example: https://github.com/phcode-dev/extension-template/issues/2
-5. If there are any errors in publishing, please visit the link in the issue to see the errors. Fix and `retry` publishing the release.
-
- 
-
-6. Once published, your extension will appear in the Phoenix Code Extension Store at [https://phcode.dev](https://phcode.dev).
-
- 
-
-## Publishing legacy Brackets extensions
-> Follow this section only for old brackets extensions.
-
-To publish Extensions/themes that are not created from the above [theme](https://github.com/phcode-dev/theme-template) and [extension](https://github.com/phcode-dev/extension-template) template
-or old Brackets extensions, please follow the steps below:
-
-1. Create a GitHub repository for your extension if it is not present.
-2. Create a file `.github/workflows/publishToPhcode.yml` in your repo with the following contents: https://github.com/phcode-dev/theme-template/blob/main/.github/workflows/publishToPhcode.yml
-
-That's all, you can now follow the above [Publishing to the extension/theme store](#publishing-to-the-extensiontheme-store) section.
-
-## FAQ
-### Why is my extension not being published?
-Your repository must be **public** to be able to be published to the Phoenix Code Extension store.
-See this link on [understanding how to change repository visibility](https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/setting-repository-visibility#changing-a-repositorys-visibility) to public in GitHub.
-
-### How can I get a Verified Badge for my extension?
-The `verified` extension badge(tick mark) will be automatically granted to verified GitHub Organizations.
-
-### How do I delete my extension from the store
-Please raise an issue here: https://github.com/phcode-dev/phoenix/issues/new/choose, mention your extension repository.
-
diff --git a/api/07-available-standard-libs.md b/api/07-available-standard-libs.md
deleted file mode 100644
index ac656579..00000000
--- a/api/07-available-standard-libs.md
+++ /dev/null
@@ -1,66 +0,0 @@
----
-title: Available Standard Libraries
----
-
-The following standard libraries are available inside Phoenix Code:
-
-## jquery
-jQuery is a JavaScript library designed to simplify HTML DOM tree traversal and manipulation, as well as event handling, CSS animations, and Ajax.
-* credits: https://jquery.com/
-
-## fontawesome
-
-Fontawesome is used for iconography in Phoenix Code.
-* credits: https://fontawesome.com/
-
-### Usage
-
-```html
-
-
-
-
-
-```
-
-Reference: https://fontawesome.com/docs/web/add-icons/how-to
-
-See the following urls for available icons:
-1. https://fontawesome.com/v5/cheatsheet/free/solid
-2. https://fontawesome.com/v5/cheatsheet/free/regular
-3. https://fontawesome.com/v5/cheatsheet/free/brands
-
-## devicon
-
-devicon is used for iconography in Phoenix Code.
-
->usage: similar to fontawesome
-
-* credits: https://devicon.dev/
-
-## file-icons
-
-file-icon is used for iconography in Phoenix Code.
-
-> usage: similar to fontawesome
-
-* credits: https://uiwjs.github.io/file-icons/index.html
-
-## Additional icon sources
-This is not included in Phoenix, but you can get icons from
-1. [Ionicons](http://ionicons.com)
-
-### Usage
-
-```html
-
-
-```
-**NB**: Svg icons are not integrated in source.
-
-Reference: https://www.npmjs.com/package/devicon
-
-See the following urls for available icons:
-https://devicon.dev/
diff --git a/api/08-How-To/Dialogs.md b/api/08-How-To/Dialogs.md
deleted file mode 100644
index ff31a975..00000000
--- a/api/08-How-To/Dialogs.md
+++ /dev/null
@@ -1,281 +0,0 @@
----
-title: Show Dialogs
----
-
-This document outlines the basic features of working with Dialogs, including:
-
-* [How to add a Dialog Box with buttons](#adding-a-dialog-box-and-buttons)
-* [How to create custom Dialog Box](#creating-custom-dialog-boxes)
-* [How to handle the button clicks](#handle-button-clicks)
-
-## Adding a Dialog Box and Buttons
-
-To add a dialog box, follow these steps:
-
-1. **Import the required modules.**
-Import the `Dialogs` and `DefaultDialogs` modules along with other necessary modules:
-
-```jsx
-const DefaultDialogs = brackets.getModule("widgets/DefaultDialogs"),
- Dialogs = brackets.getModule("widgets/Dialogs");
-
- // other modules you may require
-const AppInit = brackets.getModule("utils/AppInit"),
- CommandManager = brackets.getModule("command/CommandManager"),
- Menus = brackets.getModule("command/Menus");
-
-```
-
-2. **Create a function to show the dialog**
-
- To create a dialog you can use the specialized dialog APIs such as `Dialogs.showConfirmDialog`, `Dialogs.showInfoDialog` and `Dialogs.showErrorDialog` provided by the `Dialogs` module:
-
-
-```jsx
-function handleHelloWorld() {
- Dialogs.showInfoDialog(
- "hello", // Title
- "world" // Message
- );
-}
-```
-
-The `Dialogs.showInfoDialog()` method is the preferred way to display information messages.
-
-Similarly, you can use `Dialogs.showErrorDialog()` for error messages:
-
-```jsx
-function handleError() {
- Dialogs.showErrorDialog(
- "Error",
- "Something went wrong!"
- );
-}
-```
-
-You can also close the dialog programmatically using the `Dialog.close()` method.
-
-```jsx
-function handleHelloWorld() {
- const dialog = Dialogs.showInfoDialog(
- "hello",
- "world"
- );
-
- // Close the dialog after 2 seconds
- setTimeout(() => {
- dialog.close();
- }, 2000);
-}
-```
-
-This will automatically close the dialog after 2 seconds.
-
-These specialized dialog methods handle the common use cases.
-
-Click on the functions to read more about them : [showConfirmDialog()](https://docs.phcode.dev/api/API-Reference/widgets/Dialogs#showConfirmDialog), [showInfoDialog](https://docs.phcode.dev/api/API-Reference/widgets/Dialogs#showInfoDialog), [showErrorDialog](https://docs.phcode.dev/api/API-Reference/widgets/Dialogs#showErrorDialog).
-
-If you require custom buttons or advanced functionality, you can use the generic `showModalDialog()` method.
-
-[Click here](#creating-custom-dialog-boxes) to read more about creating custom dialog boxes.
-
-3. **Register the command**
-Register a command that will trigger the dialog:
-
-```jsx
-const MY_COMMAND_ID = "helloworld_sayhello";
-CommandManager.register("Hello World", MY_COMMAND_ID, handleHelloWorld);
-```
-
-4. **Add the menu item**
-Add a menu item that will execute the command:
-
-```jsx
-const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
-menu.addMenuItem(MY_COMMAND_ID);
-```
-
-Full Code Example:
-
-```jsx
-define(function (require, exports, module) {
- "use strict";
-
- // Brackets modules
- const AppInit = brackets.getModule("utils/AppInit"),
- DefaultDialogs = brackets.getModule("widgets/DefaultDialogs"),
- Dialogs = brackets.getModule("widgets/Dialogs"),
- CommandManager = brackets.getModule("command/CommandManager"),
- Menus = brackets.getModule("command/Menus");
-
- // Function to run when the menu item is clicked
- function handleHelloWorld() {
- Dialogs.showInfoDialog(
- "hello",
- "world"
- );
- }
-
- // Register command
- const MY_COMMAND_ID = "helloworld_sayhello";
- CommandManager.register("Hello World", MY_COMMAND_ID, handleHelloWorld);
-
- // Add menu item
- const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
- menu.addMenuItem(MY_COMMAND_ID);
-
- // Initialize extension
- AppInit.appReady(function () {
- console.log("hello world");
- });
-});
-```
-
-Expected Output:
-
-When the menu item is clicked, a dialog box appears:
-
-
-
-
-## Creating Custom Dialog Boxes
-
-While the specialized dialog methods like `showInfoDialog()`, `showConfirmDialog()` and `showErrorDialog()` cover the common use cases, you can also create more complex custom dialog boxes using `showModalDialog()`. Here's how:
-
-```jsx
-const dialog = Dialogs.showModalDialog(
- DefaultDialogs.DIALOG_ID_INFO,
- "Custom Dialog",
- // Custom HTML content with CSS styling
- '
' +
- '
This is a custom message
' +
- '' +
- "
",
- [
- // For buttons
- {
- className: Dialogs.DIALOG_BTN_CLASS_PRIMARY,
- id: Dialogs.DIALOG_BTN_OK,
- text: "OK",
- },
- {
- className: Dialogs.DIALOG_BTN_CLASS_NORMAL,
- id: Dialogs.DIALOG_BTN_CANCEL,
- text: "Cancel",
- },
- ]
-);
-```
-
-The `showModalDialog()` method provides more flexibility, allowing you to create custom dialog boxes with HTML content and buttons. However, it's recommended to use the specialized dialog APIs like `showInfoDialog()`, `showConfirmDialog()` and `showErrorDialog()` whenever possible, as they provide a simpler and more standardized interface for the most common dialog types.
-
-Visual Reference
-
-
-
-[Click Here](https://docs.phcode.dev/api/API-Reference/widgets/Dialogs#showModalDialog) to read more about `showModalDialog()`.
-
-→ Each button object can have:
-
-- `className`: Button styling class
-- `id`: Button identifier
-- `text`: Button label text
-
-→ Available Button Classes:
-
-- `Dialogs.DIALOG_BTN_CLASS_PRIMARY`: Primary action button
-- `Dialogs.DIALOG_BTN_CLASS_NORMAL`: Normal button
-- `Dialogs.DIALOG_BTN_CLASS_LEFT`: Left-aligned button
-
-→ Common Button IDs:
-
-- `Dialogs.DIALOG_BTN_OK`
-- `Dialogs.DIALOG_BTN_CANCEL`
-- `Dialogs.DIALOG_BTN_SAVE_AS`
-- `Dialogs.DIALOG_BTN_DONTSAVE`
-- `Dialogs.DIALOG_BTN_DOWNLOAD`
-
-## Handle Button Clicks
-
-You can handle button clicks using the dialog's promise:
-
-```jsx
-dialog.done(function (buttonId) {
- if (buttonId === Dialogs.DIALOG_BTN_OK) {
- const inputValue = $input.val();
- alert("Input value: " + inputValue);
- }
-});
-```
-
-Complete Code Block with Custom Dialog Box and handling the button clicks.
-
-```jsx
-define(function (require, exports, module) {
- "use strict";
-
- const AppInit = brackets.getModule("utils/AppInit"),
- DefaultDialogs = brackets.getModule("widgets/DefaultDialogs"),
- Dialogs = brackets.getModule("widgets/Dialogs"),
- CommandManager = brackets.getModule("command/CommandManager"),
- Menus = brackets.getModule("command/Menus");
-
- function showCustomDialog() {
- const dialog = Dialogs.showModalDialog(
- DefaultDialogs.DIALOG_ID_INFO,
- "Custom Dialog",
- // Custom HTML content
- '
' +
- '
This is a custom message
' +
- '' +
- "
",
- [
- {
- className: Dialogs.DIALOG_BTN_CLASS_PRIMARY,
- id: Dialogs.DIALOG_BTN_OK,
- text: "OK"
- },
- {
- className: Dialogs.DIALOG_BTN_CLASS_NORMAL,
- id: Dialogs.DIALOG_BTN_CANCEL,
- text: "Cancel"
- }
- ]
- );
-
- // Get dialog element and ensure input is accessible
- const $dlg = dialog.getElement();
- const $input = $dlg.find("#custom-input");
-
- if (!$input.length) {
- console.error("Failed to find input element in dialog");
- return;
- }
-
- // Handle dialog button clicks
- dialog.done(function (buttonId) {
- if (buttonId === Dialogs.DIALOG_BTN_OK) {
- const inputValue = $input.val();
- alert("Input value: " + inputValue);
- }
- });
- }
-
- // Register command
- const MY_COMMAND_ID = "test_customdialog";
- CommandManager.register("Show Custom Dialog", MY_COMMAND_ID, showCustomDialog);
-
- // Add menu item
- const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
- menu.addMenuItem(MY_COMMAND_ID);
-
- // Initialize extension
- AppInit.appReady(function () {
- console.log("Custom dialog extension loaded");
- });
-});
-```
-
-Visual Reference
-
-
\ No newline at end of file
diff --git a/api/08-How-To/Menus.md b/api/08-How-To/Menus.md
deleted file mode 100644
index 4ba1a595..00000000
--- a/api/08-How-To/Menus.md
+++ /dev/null
@@ -1,386 +0,0 @@
----
-title: Add Menus, Menu items and Keyboard Shortcuts
----
-
-This document outlines the basic features of working with Menus, including:
-
-* [How to add a Menu](#adding-a-menu)
-* [How to add a SubMenu](#adding-a-sub-menu)
-* [How to add a Menu item](#adding-a-menu-item)
-* [How to position a Menu item](#position-the-menu-item)
-* [How to add a keyboard shortcut to a Menu item](#attach-a-keyboard-shortcut-to-a-menu-item)
-
-
-## Adding a Menu
-
-To add a custom menu, follow these steps :-
-
-1. **Import the `Menus` module.**
- To use the menu functionality, import the `Menus` module:
-
- ```jsx
- const Menus = brackets.getModule("command/Menus");
- ```
-
-2. **Create the menu.**
-
- Use `Menus.addMenu()` to add a menu to the menu bar. Provide the display name and the identifier. *The identifier must be written in* `snake_case`.
-
- > Providing the identifier is necessary to display the menu on the menu bar. This identifier may later be used to add menu items inside it or even remove the menu if needed.
-
- ```jsx
- // Add a menu to the menu bar
- const menu = Menus.addMenu('Test', 'Test_Extension_Docs');
- ```
-
-
-> For a detailed description, refer to [this link](https://docs.phcode.dev/api/API-Reference/command/Menus#addMenu).
-
-Full Code Example :-
-
-```jsx
-define(function (require, exports, module) {
- "use strict";
-
- // Brackets modules
- const AppInit = brackets.getModule("utils/AppInit"),
- Menus = brackets.getModule("command/Menus");
-
- // Add a menu to the menu bar
- const menu = Menus.addMenu('Test', 'Test_Extension_Docs');
-
- // Initialize extension once shell is finished initializing.
- AppInit.appReady(function () {
- console.log("hello world");
- });
-});
-```
-
-Expected Output :-
-
-
-
-
-## Adding a Menu Item
-
-To add a menu item, follow these steps :-
-
-1. **Import the `Menus` and `CommandManager` module.**
-
- These modules allow you to register commands and add items to menus:
-
- ```jsx
- const CommandManager = brackets.getModule("command/CommandManager");
- const Menus = brackets.getModule("command/Menus");
- ```
-
-
-2. **Register the Command**
-
-Use `CommandManager.register()` to associate an ID with a function:
-
-```jsx
-function handleTestExtension() {
- alert("Test menu item");
-}
-
-// The `CommandID` must be written in snake_case
-const MY_COMMAND_ID = "test_menuitem";
-CommandManager.register("Test", MY_COMMAND_ID, handleTestExtension);
-```
-
-- The first argument is the label for the menu item.
-- The second argument is a unique command ID.
-- The third argument is the handler function to execute when the item is clicked.
-
-3. **Add the Menu Item**
-To add the menu item, use `menu.addMenuItem()`. For instance, if you wish to add an item to the **File menu**, you can write:
-
-
- ```jsx
- const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
- menu.addMenuItem(MY_COMMAND_ID);
- ```
-
-
-> These are some of the menus available by default :-
-
-- FILE_MENU : ‘file-menu’
-- EDIT_MENU : ‘edit-menu’
-- FIND_MENU : ‘find-menu’
-- VIEW_MENU : ‘view-menu’
-- NAVIGATE_MENU : ‘navigate-menu’
-
-You can also add menu items to any custom menus you create.
-
-> For a detailed description, refer to [this link](https://docs.phcode.dev/api/API-Reference/command/Menus#addMenuItem).
-
-Full Code Example :-
-
-```jsx
-define(function (require, exports, module) {
- "use strict";
-
- // Brackets modules
- const AppInit = brackets.getModule("utils/AppInit"),
- CommandManager = brackets.getModule("command/CommandManager"),
- Menus = brackets.getModule("command/Menus");
-
- // Function to run when the menu item is clicked
- function handleTestExtension() {
- alert("Test menu item");
- }
-
- // The `CommandID` must be written in snake_case
- const MY_COMMAND_ID = "test_menuitem";
- CommandManager.register("Test", MY_COMMAND_ID, handleTestExtension);
-
- // Add Menu item
- const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
- menu.addMenuItem(MY_COMMAND_ID);
-
- // Initialize extension once shell is finished initializing.
- AppInit.appReady(function () {
- console.log("hello world");
- });
-});
-```
-
-Expected Output :-
-
-
-
-
-
-The alert box that appears when the `Test` menu item is clicked!
-
-
-## Position the Menu Item
-
-You can position the menu item to make it appear at the first, last or before/after a given item.
-
-To position the menu item at the top, use
-
-```jsx
-// second parameter is for keyboard shortcut. Empty string means no shortcut.
-menu.addMenuItem(MY_COMMAND_ID, "", Menus.FIRST);
-```
-
-
-
-`Menus.FIRST` is used to position it before every other item. *Note: It is recommended to avoid using this and prefer relative menu IDs for better positioning.**
-
-`Menus.LAST` is used to position it at the end. It is the Default value.
-
-To position the menu item before or after any item, use
-
-```jsx
-// second parameter is for keyboard shortcut. Empty string means no shortcut.
-menu.addMenuItem(MY_COMMAND_ID, "", Menus.BEFORE, Commands.FILE_SAVE_AS);
-```
-
-- Third parameter must specify `BEFORE` or `AFTER` the item should be set.
-- Fourth parameter must specify the “relativeID” of the menu item to set the position.
-
-
-
-Here, the menu item is set before the `Save As...` option.
-
-To get the list of all the `RelativeIDs` available by default, refer to [this link](https://docs.phcode.dev/api/API-Reference/command/Commands).
-
-
-## Attach a keyboard shortcut to a Menu Item
-
-You can assign a keyboard shortcut to your menu item.
-
-*Note: Only add shortcuts if they're essential and frequently used, ensuring compatibility across platforms. Users can set custom shortcuts, so default shortcuts should be reserved only for high-use actions.*
-
-To add the keyboard shortcut, use :-
-
-1. Import the `KeyBindingManager` module.
-
- ```jsx
- const KeyBindingManager = brackets.getModule("command/KeyBindingManager");
- ```
-
-
-2. Add the keyboard shortcut to `addMenuItem`. The keyboard shortcut will be displayed next to the menu item in the UI.
-
- > Ensure that the keyboard shortcut you choose doesn't conflict with any existing shortcuts already in use.
-
- ```jsx
- menu.addMenuItem(MY_COMMAND_ID, "Ctrl-Alt-T", Menus.FIRST);
- ```
-
- 
-
-3. Register the keyboard shortcut. To register use `addBinding()`. The first parameter will be the `CommandID` of the menu item and the second parameter will be the keyboard shortcut.
-
- ```jsx
- KeyBindingManager.addBinding(MY_COMMAND_ID, "Ctrl-Alt-T");
- ```
-
-
-That's it! Now, pressing the assigned keyboard shortcut will trigger the corresponding menu item.
-
-> For a detailed description, refer to [this link](https://docs.phcode.dev/api/API-Reference/command/KeyBindingManager).
-
-Full Code Example :-
-
-```jsx
-define(function (require, exports, module) {
- "use strict";
-
- // Brackets modules
- const AppInit = brackets.getModule("utils/AppInit"),
- CommandManager = brackets.getModule("command/CommandManager"),
- Menus = brackets.getModule("command/Menus"),
- KeyBindingManager = brackets.getModule("command/KeyBindingManager");
-
- // Function to run when the menu item is clicked
- function handleTestExtension() {
- alert("Test menu item");
- }
-
- const MY_COMMAND_ID = "test_menuitem";
- CommandManager.register("Test", MY_COMMAND_ID, handleTestExtension);
-
- // Add Menu item
- const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
-
- menu.addMenuItem(MY_COMMAND_ID, "Ctrl-Alt-T", Menus.FIRST);
-
- // Register the keyboard shortcut
- KeyBindingManager.addBinding(MY_COMMAND_ID, "Ctrl-Alt-T");
-
- // Initialize extension once shell is finished initializing.
- AppInit.appReady(function () {
- console.log("hello world");
- });
-});
-```
-
-## Adding a Sub Menu
-
-To add a submenu to an existing menu item, follow these steps:
-
-1. **Import the `Menus` and `CommandManager` modules**
-
-```jsx
-const CommandManager = brackets.getModule("command/CommandManager");
-const Menus = brackets.getModule("command/Menus");
-```
-
-2. **Create and register the main command**
-First, create a command that will serve as the parent menu item:
-
-```jsx
-function handleTestExtension() {
- alert("Test menu item");
-}
-
-const MY_COMMAND_ID = "Test";
-CommandManager.register("Test", MY_COMMAND_ID, handleTestExtension);
-```
-
-3. **Get the parent menu and create the submenu**
-Use `menu.addSubMenu()` to create a submenu under an existing menu:
-
-```jsx
-const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
-const subMenu = menu.addSubMenu(MY_COMMAND_ID, "Test_Sub_Menu");
-```
-
-- First parameter is the command ID of the parent menu item
-- Second parameter is the identifier for the submenu (must be in `snake_case`)
-
-4. **Create and register submenu commands**
-Register commands for each submenu item:
-
-```jsx
-const SUB_COMMAND_1 = "Test_SubCommand1";
-const SUB_COMMAND_2 = "Test_SubCommand2";
-
-CommandManager.register("Sub Item 1", SUB_COMMAND_1, function() {
- alert("Sub Item 1 clicked");
-});
-CommandManager.register("Sub Item 2", SUB_COMMAND_2, function() {
- alert("Sub Item 2 clicked");
-});
-```
-
-5. **Add items to the submenu**
-Use `addMenuItem()` to add the registered commands to your submenu:
-
-```jsx
-subMenu.addMenuItem(SUB_COMMAND_1);
-subMenu.addMenuDivider(); // Add a separator line
-subMenu.addMenuItem(SUB_COMMAND_2);
-```
-
-> For visual separation between menu items, you can add a divider using `addMenuDivider()`.
-
-→ For a detailed description, refer to [this link](https://docs.phcode.dev/api/API-Reference/command/Menus#addSubMenu).
-
-Full Code Example:
-
-```jsx
-define(function (require, exports, module) {
- "use strict";
-
- // Brackets modules
- const AppInit = brackets.getModule("utils/AppInit"),
- CommandManager = brackets.getModule("command/CommandManager"),
- Menus = brackets.getModule("command/Menus");
-
- // Function to run when the menu item is clicked
- function handleTestExtension() {
- alert("Test menu item");
- }
-
- // Main command
- const MY_COMMAND_ID = "Test";
- CommandManager.register("Test", MY_COMMAND_ID, handleTestExtension);
-
- // Add menu item
- const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
-
- // Add sub menu
- const subMenu = menu.addSubMenu(MY_COMMAND_ID, "Test_Sub_Menu");
-
- // Additional submenu commands
- const SUB_COMMAND_1 = "Test_SubCommand1";
- const SUB_COMMAND_2 = "Test_SubCommand2";
-
- // Register new commands
- CommandManager.register("Sub Item 1", SUB_COMMAND_1, function() {
- alert("Sub Item 1 clicked");
- });
- CommandManager.register("Sub Item 2", SUB_COMMAND_2, function() {
- alert("Sub Item 2 clicked");
- });
-
- // Add items inside sub menu
- subMenu.addMenuItem(SUB_COMMAND_1);
- subMenu.addMenuDivider(); // Add separator
- subMenu.addMenuItem(SUB_COMMAND_2);
-
- // Initialize extension once shell is finished initializing.
- AppInit.appReady(function () {
- console.log("hello world");
- });
-});
-
-```
-
-Expected Output:
-
-
-
-When a submenu item is clicked, it will show an alert box with the corresponding message.
-
-> Note: Make sure all command IDs are unique throughout your extension to avoid conflicts.
-
-> You can add as many submenu items as needed by repeating steps 4 and 5 for each new item. You can even create nested submenu items.
-
-> Submenu items can have their own keyboard shortcuts using the same method described in the "Attach a keyboard shortcut to a menu item" section.
\ No newline at end of file
diff --git a/api/08-How-To/Panels.md b/api/08-How-To/Panels.md
deleted file mode 100644
index 7901d706..00000000
--- a/api/08-How-To/Panels.md
+++ /dev/null
@@ -1,288 +0,0 @@
----
-title: How to create Panels
----
-
-In Phoenix Code, Panels are of two types :- `Plugin Panel` and `Bottom Panel`.
-
-**Plugin Panel** appears on the side of the screen, generally the left side. For Example :- *Live Preview* feature uses the `Plugin Panel`.
-
-
-
-
-**Bottom Panel** appears on the bottom of the screen as a tab. Multiple bottom panels share a tabbed interface where each panel gets its own tab with an icon and title. For Example :- *Git*, *Terminal*, *Problems* panel and many more use the `Bottom Panel`.
-
-
-
-
-This document outlines the basic features of working with Panels.
-
-* [How to create a Plugin Panel](#creating-a-plugin-panel)
-* [How to manage Plugin Panel state](#managing-plugin-panel-state)
-* [How to create a Bottom Panel](#creating-a-bottom-panel)
-* [How to manage Bottom Panel state](#managing-bottom-panel-state)
-* [Best Practices for Panels](#best-practices)
-
-## Creating a Plugin Panel
-
-To create a plugin panel, follow these steps:
-
-1. **Import the `WorkSpaceManager` modules**
- ```jsx
- const WorkspaceManager = brackets.getModule("view/WorkspaceManager");
- ```
-
-2. **Create panel content**
- Create a jQuery object containing your panel's HTML content:
- ```jsx
- const $panel = $("
")
- .attr("id", "my-extension-panel")
- .html("
My Plugin Panel
Hello from the panel!
");
- ```
-
-3. **Create toolbar icon**
- Create a toolbar icon to toggle the panel.
- > Creating a toolbar icon is mandatory, else the panel won't show up.
-
-4. **Create the plugin panel**
- Use `WorkspaceManager.createPluginPanel()` to create your panel:
- ```jsx
- const pluginPanel = WorkspaceManager.createPluginPanel(
- "myextension.panel", // Unique ID using package-style naming
- $panel, // jQuery object for panel content
- 200, // minSize in pixels
- $toolbarIcon, // toolbar icon
- 400 // initialSize in pixels (optional)
- );
- ```
-
-> For a detailed description, refer to [this link](https://docs.phcode.dev/api/API-Reference/view/WorkspaceManager#createPluginPanel).
-
-
-Full Code Example:
-
-```jsx
-define(function (require, exports, module) {
- "use strict";
-
- // Brackets modules
- const AppInit = brackets.getModule("utils/AppInit"),
- CommandManager = brackets.getModule("command/CommandManager"),
- Menus = brackets.getModule("command/Menus"),
- WorkspaceManager = brackets.getModule("view/WorkspaceManager");
-
- let pluginPanel; // Store panel reference
-
- // Function to run when the menu item is clicked
- function handleTestExtension() {
- if (!pluginPanel) {
- // Create panel content
- const $panel = $("
")
- .attr("id", "my-extension-panel")
- .html("
My Plugin Panel
Hello from the panel!
");
-
- // Create toolbar icon
- const $toolbarIcon = $("#panel");
-
- // Create the plugin panel
- pluginPanel = WorkspaceManager.createPluginPanel(
- "myextension.panel",
- $panel,
- 200,
- $toolbarIcon,
- 400
- );
- pluginPanel.show();
- }
- }
-
- // Register command
- const MY_COMMAND_ID = "test_menuitem";
- CommandManager.register("Toggle Panel", MY_COMMAND_ID, handleTestExtension);
-
- // Add Menu item
- const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
- menu.addMenuItem(MY_COMMAND_ID);
-
- // Initialize extension
- AppInit.appReady(function () {
- console.log("Panel extension initialized");
- });
-});
-```
-
-Visual Reference
-
-
-
-## Managing Plugin Panel State
-
-You can control the visibility and state of your plugin panel:
-
-1. **Show/Hide Panel**
- ```jsx
- // Show panel
- pluginPanel.show();
-
- // Hide panel
- pluginPanel.hide();
- ```
-
-
-2. **Check Panel Visibility**
- ```jsx
- const isVisible = pluginPanel.isVisible();
- ```
-
-3. **Toggle Panel Visibility**
- ```jsx
- function togglePanel() {
- if (pluginPanel.isVisible()) {
- pluginPanel.hide();
- } else {
- pluginPanel.show();
- }
- }
- ```
-
-
-## Creating a Bottom Panel
-
-Bottom panels are created similarly to plugin panels but use different methods:
-> For `Bottom Panels` creating a toolbar icon is not required. Each bottom panel appears as a tab in the shared tab bar.
-
-1. **Import required modules**
- ```jsx
- const WorkspaceManager = brackets.getModule("view/WorkspaceManager");
- ```
-
-2. **Create the bottom panel**
- ```jsx
- const bottomPanel = WorkspaceManager.createBottomPanel(
- "myextension.panel", // Unique ID using package-style naming
- $panel, // jQuery object for panel content
- undefined, // minSize (deprecated, pass undefined)
- "My Panel", // Title shown on the tab
- {
- iconSvg: "path/to/icon.svg" // SVG icon for the tab
- }
- );
- ```
-
- - **`title`**: The text shown on the panel's tab. If not provided, Phoenix Code uses the text from a `.toolbar .title` element inside your panel, or derives it from the panel ID.
- - **`iconSvg`**: Path to an SVG file used as the tab icon. The icon automatically adapts to light and dark themes. If not provided, a default icon is used.
-
-> The `minSize` parameter (third argument) is deprecated and no longer used. Pass `undefined` for this parameter.
-
-> For a detailed description, refer to [this link](https://docs.phcode.dev/api/API-Reference/view/WorkspaceManager#createBottomPanel).
-
-Full Code Example for Bottom Panel:
-
-```jsx
- define(function (require, exports, module) {
- "use strict";
-
- // Brackets modules
- const AppInit = brackets.getModule("utils/AppInit"),
- CommandManager = brackets.getModule("command/CommandManager"),
- Menus = brackets.getModule("command/Menus"),
- WorkspaceManager = brackets.getModule("view/WorkspaceManager");
-
- let bottomPanel; // Store panel reference
-
- // Function to run when the menu item is clicked
- function handleTestExtension() {
- if (!bottomPanel) {
- // Create panel content
- const $panel = $("
")
- .attr("id", "my-extension-panel")
- .html("
My Bottom Panel
Hello from the panel!
");
-
- // Create the bottom panel
- bottomPanel = WorkspaceManager.createBottomPanel(
- "myextension.panel",
- $panel,
- undefined,
- "My Panel",
- { iconSvg: "styles/images/panel-icon-default.svg" }
- );
- bottomPanel.show();
- }
- }
-
- // Register command
- const MY_COMMAND_ID = "test_menuitem";
- CommandManager.register("Toggle Panel", MY_COMMAND_ID, handleTestExtension);
-
- // Add Menu item
- const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);
- menu.addMenuItem(MY_COMMAND_ID);
-
- // Initialize extension
- AppInit.appReady(function () {
- console.log("Panel extension initialized");
- });
- });
-```
-
-Visual Reference
-
-
-## Managing Bottom Panel State
-
-Bottom panels support similar state management to plugin panels:
-
-1. **Show/Hide Panel**
- ```jsx
- // Show panel
- bottomPanel.show();
-
- // Hide panel
- bottomPanel.hide();
- ```
-
-2. **Check Panel Visibility**
- ```jsx
- const isVisible = bottomPanel.isVisible();
- ```
-
-3. **Toggle Panel Visibility**
- ```jsx
- function togglePanel() {
- if (bottomPanel.isVisible()) {
- bottomPanel.hide();
- } else {
- bottomPanel.show();
- }
- }
- ```
-
-4. **Update Tab Title**
- ```jsx
- bottomPanel.setTitle("New Title");
- ```
-
-5. **Handle Close Confirmation**
-
- If your panel has unsaved state or running processes, you can register a handler that runs before the panel closes. Return `false` to prevent closing.
- ```jsx
- bottomPanel.registerOnCloseRequestedHandler(async function () {
- if (hasUnsavedChanges) {
- const confirmed = await showConfirmDialog("Discard changes?");
- return confirmed; // true to close, false to cancel
- }
- return true;
- });
- ```
-
- To programmatically close a panel while respecting its close handler, use `requestClose()`:
- ```jsx
- const wasClosed = await bottomPanel.requestClose();
- ```
-
-## Best Practices
-
-1. Always use unique, package-style IDs (e.g., "yourextension.panel-name") to avoid conflicts with other extensions.
-
-2. Save panel state (e.g., visibility, size) in preferences if needed, to restore state when the extension is reloaded.
-
-> For more information about the WorkSpace Manager API, refer to the [Phoenix Code API documentation](https://docs.phcode.dev/api/API-Reference/view/WorkspaceManager).
\ No newline at end of file
diff --git a/api/08-How-To/StatusBar.md b/api/08-How-To/StatusBar.md
deleted file mode 100644
index e5440c6a..00000000
--- a/api/08-How-To/StatusBar.md
+++ /dev/null
@@ -1,54 +0,0 @@
----
-title: Add an indicator icon on the status bar
----
-
-This document outlines the basic features of working with Status Bar, including:
-
-* [How to add a button on Status Bar](#adding-a-button-on-status-bar)
-
-## Adding a button on Status Bar
-
-1. Import the `StatusBar` module.
-
- ```jsx
- const StatusBar = brackets.getModule("widgets/StatusBar");
- ```
-
-
-2. Register the command.
-
- Register the command that will trigger the clicking.
-
- ```jsx
- var MY_COMMAND_ID = "helloworld_sayhello";
- CommandManager.register("Hello World", MY_COMMAND_ID, handleHelloWorld);
- ```
-
-
-3. Add the button to the StatusBar.
-
- To add the button to StatusBar, use `addIndicator()` :-
-
-
-```jsx
-StatusBar.addIndicator(
- MY_COMMAND_ID, // unique ID for this indicator
- $("
Test
").click(handleHelloWorld), // Optional DOMNode for the indicator
- true, // show the indicator
- "hello-world-status", // CSS class
- "tooltip", // tooltip text
-);
-```
-
- → The parameters of the `addIndicator()` method :-
-
-| Param | Type | Description |
-| --- | --- | --- |
-| id | `string` | Registration id of the indicator to be updated. |
-| [indicator] | `DOMNode` or `jQueryObject` | Optional DOMNode for the indicator |
-| [visible] | `boolean` | Shows or hides the indicator over the statusbar. |
-| [style] | `string` | Sets the attribute "class" of the indicator. |
-| [tooltip] | `string` | Sets the attribute "title" of the indicator. |
-| [insertBefore] | `string` | An id of an existing status bar indicator. The new indicator will be inserted before (i.e. to the left of) the indicator specified by this parameter. |
-
-> For a detailed description, refer to [this link](https://docs.phcode.dev/api/API-Reference/widgets/StatusBar).
\ No newline at end of file
diff --git a/api/08-How-To/images/add-menu.png b/api/08-How-To/images/add-menu.png
deleted file mode 100644
index 897298e7..00000000
Binary files a/api/08-How-To/images/add-menu.png and /dev/null differ
diff --git a/api/08-How-To/images/dialog.png b/api/08-How-To/images/dialog.png
deleted file mode 100644
index 7cfd9c52..00000000
Binary files a/api/08-How-To/images/dialog.png and /dev/null differ
diff --git a/api/08-How-To/images/menu-item-dialog.png b/api/08-How-To/images/menu-item-dialog.png
deleted file mode 100644
index 247e625a..00000000
Binary files a/api/08-How-To/images/menu-item-dialog.png and /dev/null differ
diff --git a/api/08-How-To/images/menu-item-keyboard-shortcut.png b/api/08-How-To/images/menu-item-keyboard-shortcut.png
deleted file mode 100644
index eaf74303..00000000
Binary files a/api/08-How-To/images/menu-item-keyboard-shortcut.png and /dev/null differ
diff --git a/api/API-Reference/JSUtils/Preferences.html b/api/API-Reference/JSUtils/Preferences.html
new file mode 100644
index 00000000..53c4332f
--- /dev/null
+++ b/api/API-Reference/JSUtils/Preferences.html
@@ -0,0 +1,75 @@
+
+
+
+
+
+Preferences | Phoenix Code Docs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Get the regular expression for excluded directories.
+
Kind: instance method of Preferences
+Returns: RegExp - Regular expression matching the directories that should
+be excluded. Returns null if no directories are excluded.
Kind: instance method of Preferences
+Returns: RegExp - Regular expression matching the files that should
+be excluded. Returns null if no files are excluded.
Get a Promise for the completions from TernJS, for the file & offset passed in.
+
Kind: global function
+Returns: jQuery.Promise - - a promise that will resolve to an array of completions when
+it is done
+
Param
Type
Description
fileInfo
Object
- type of update, name of file, and the text of the update. For "full" updates, the whole text of the file is present. For "part" updates, the changed portion of the text. For "empty" updates, the file has not been modified and the text is empty.
offset
Object
the offset in the file the hints should be calculate at
isProperty
boolean
true if getting a property hint, otherwise getting an identifier hint.
Encapsulate all the logic to talk to the tern module. This will create
+a new instance of a TernModule, which the rest of the hinting code can use to talk
+to the tern node domain, without worrying about initialization, priming the pump, etc.
Note that successive calls to getScope may return the same objects, so
+clients that wish to modify those objects (e.g., by annotating them based
+on some temporary context) should copy them first. See, e.g.,
+Session.getHints().
+
Kind: global function
+Returns: jQuery.Promise - - The promise will not complete until the tern
+hints have completed.
Kind: instance method of Session
+Returns: Object - - the line, col info for where the previous "."
+in a property lookup occurred, or undefined if no previous "." was found.
Determine if the caret is either within a function call or on the function call itself.
+
Kind: instance method of Session
+Returns: Object - inFunctionCall - true if the caret if either within a function call or on the
+function call itself.
+functionCallPos - the offset of the '(' character of the function call if inFunctionCall
+is true, otherwise undefined.
Get the type of the current session, i.e., whether it is a property
+lookup and, if so, what the context of the lookup is.
+
Kind: instance method of Session
+Returns: Object - - an Object consisting
+of a "property" that indicates whether or not the type of
+the session is a property lookup, and a "context" that
+indicates the object context (as described in getContext above) of
+the property lookup, or null if there is none. The context is
+always null for non-property lookups.
Get the function type hint. This will format the hint, showing the
+parameter at the cursor in bold.
+
Kind: instance method of Session
+Returns: Object - An Object where the
+"parameters" property is an array of parameter objects;
+the "currentIndex" property index of the hint the cursor is on, may be
+-1 if the cursor is on the function identifier.
Get the javascript text of the file open in the editor for this Session.
+For a javascript file, this is just the text of the file. For an HTML file,
+this will be only the text in the script tags. This is so that we can pass
+just the javascript text to tern, and avoid confusing it with HTML tags, since it
+only knows how to parse javascript.
+
Kind: instance method of Session
+Returns: String - - the "javascript" text that can be sent to Tern.
Determine if the cursor is located in the name of a function declaration.
+This is so we can suppress hints when in a function name, as we do for variable and
+parameter declarations, but we can tell those from the token itself rather than having
+to look at previous tokens.
+
Kind: instance method of Session
+Returns: Boolean - - true if the current cursor position is in the name of a function
+declaration.
This module simplifies communication between Node.js and Phoenix (phcode). A NodeConnector acts as an intermediary,
+allowing you to execute functions in Node.js from Phoenix and vice versa. You can use the execPeer method to call
+functions on the other side and handle communication seamlessly. Use triggerPeer to trigger events
+on the other side.
constNodeConnector=require('NodeConnector'); constXY_NODE_CONNECTOR_ID='ext_x_y';// Use a unique ID let nodeConnector =NodeConnector.createNodeConnector(XY_NODE_CONNECTOR_ID, exports); exports.modifyImage=asyncfunction(imageName, imageArrayBuffer){ // Perform image operations with the imageArrayBuffer // To return an ArrayBuffer, return an object with a `buffer` key. return{ operationDone:'colored, cropped', buffer: imageArrayBuffer, }; };
constXY_NODE_CONNECTOR_ID='ext_x_y';// Use the same unique ID let nodeConnector = global.createNodeConnector(XY_NODE_CONNECTOR_ID, exports); exports.getPWDRelative=asyncfunction(subPath){ return process.cwd+'/'+ subPath; };
+
With these steps, a NodeConnector is set up, enabling two-way communication.
The NodeConnector object implements all the APIs supported by utils/EventDispatcher. You can trigger and listen
+to events between Node.js and Phoenix using the triggerPeer and (on, one or off) methods.
+Example
+
// In `y.js` (Node.js) nodeConnector.on('phoenixProjectOpened',(_event, projectPath)=>{ console.log(projectPath); }); nodeConnector.one('phoenixProjectOpened',(_event, projectPath)=>{ console.log(projectPath +"will be received only once"); });
+
To raise an event from Phoenix to Node.js:
+Example
+
// In `x.js` (Phoenix) nodeConnector.triggerPeer('phoenixProjectOpened','/x/project/folder');
+
To Switch off events
+Example
+
nodeConnector.off('phoenixProjectOpened');// will switch off all event handlers of that name.
+
By Default, all events handlers with the eventName is removed when you call nodeConnector.off(eventName) fn.
+To selectively switch off event handlers, please see reference for utils/EventDispatcher module.
When executing functions that send or receive binary data, ensure that the functions are asynchronous and accept an
+optional ArrayBuffer as a parameter. To return binary data, use an object with a buffer key.
+
Example of calling a function in Node.js with binary data transfer:
+Example
+
// In `y.js` (Node.js) const{ operationDone, buffer }=await nodeConnector.execPeer('modifyImage',{name:'name.png'}, imageArrayBuffer);
Use the triggerPeer method to send binary data in events. Include the ArrayBuffer as an optional parameter.
+
Example of sending binary data in an event from Phoenix to Node.js:
+Example
+
// In `x.js` (Phoenix) const imageArrayBuffer =getSomeImageArrayBuffer();// Get the ArrayBuffer nodeConnector.triggerPeer('imageEdited','name.png', imageArrayBuffer);
Be cautious when sending large binary data, as it may affect performance and memory usage. Transferring large
+data is fully supported, but be mindful of performance.
+
Functions called with execPeer and triggerPeer must be asynchronous and accept a single argument. An optional
+second argument can be used to transfer large binary data as an ArrayBuffer.
+
+
For more event handling operations and details, refer to the documentation for the utils/EventDispatcher module.
Creates a new node connector with the specified ID and module exports.
+
Returns a NodeConnector Object (which is an EventDispatcher with
+additional execPeer and triggerPeer methods. peer here means, if you are executing execPeer
+in Phoenix, it will execute the named function in node side, and vice versa. You can right away start
+using execPeer, triggerPeer(to send/receive events) APIs without waiting to check if the
+other side nodeConnector is created.
+
Note: If the NodeConnector has not been created on the other end, requests made with execPeer or
+triggerPeer will be temporarily queued for up to 10 seconds to allow time for the connector to be created.
+If the connector is not created within this timeout period, all queued execPeer requests will be rejected,
+and all queued events will be dropped. It is recommended to call the createNodeConnector API on both ends
+within a timeframe of less than 10 seconds(ideally same time) for seamless communication.
+
+
execPeer: A function that executes a peer function with specified parameters.
+
triggerPeer: A function that triggers an event to be sent to a peer.
+
Also contains all the APIs supported by utils/EventDispatcher module.
+
+
Kind: inner method of NodeConnector
+Returns: Object - - A NodeConnector Object. Also contains all the APIs supported by utils/EventDispatcher module.
+Throws:
+
+
Error - If a node connector with the same ID already exists/invalid args passed.
+
+
Param
Type
Description
nodeConnectorID
string
The unique identifier for the new node connector.
moduleExports
Object
The exports of the module that contains the functions to be executed on the other side.
Returns true if the command opted in to running while the workspace is in
+design mode (editor collapsed). KeyBindingManager uses this to decide
+whether a keyboard shortcut should fire; commands that don't opt in are
+swallowed in design mode.
Sets the name of the Command and dispatches "nameChange" so that
+UI that reflects the command name can update.
+
Note, a Command name can appear in either HTML or native UI
+so HTML tags should not be used. To add a Unicode character,
+use \uXXXX instead of an HTML entity.
text that will be displayed in the UI to represent command
id
string
unique identifier for command. Core commands in Brackets use a simple command title as an id, for example "open.file". Extensions should use the following format: "author.myextension.mycommandname". For example, "lschmitt.csswizard.format.css".
commandFn
function
the function to call when the command is executed. Any arguments passed to execute() (after the id) are passed as arguments to the function. If the function is asynchronous, it must return a jQuery promise that is resolved when the command completes. Otherwise, the CommandManager will assume it is synchronous, and return a promise that is already resolved.
[options]
Object
options.eventSource
boolean
If set to true, the commandFn will be called with the first argument event with details about the source(invoker) as event.eventSource(one of the CommandManager.SOURCE_*) and event.sourceType(Eg. Ctrl-K) parameter.
options.htmlName
string
If set, this will be displayed in ui menus instead of the name given. Example: "Phoenix menu<i class='fa fa-car' style='margin-left: 4px;'></i>"
options.supportsDesignMode
boolean
If true, this command's keyboard shortcut will still fire when the workspace is in design mode. Commands that don't opt in are swallowed in design mode because the editor area is collapsed and most shortcuts are nonsensical there. Reserve this flag for commands that remain useful with no editor visible (file open/save/close, Quick Open, Find in Files, etc.).
unique identifier for command. Core commands in Brackets use a simple command title as an id, for example "app.abort_quit". Extensions should use the following format: "author.myextension.mycommandname". For example, "lschmitt.csswizard.format.css".
commandFn
function
the function to call when the command is executed. Any arguments passed to execute() (after the id) are passed as arguments to the function. If the function is asynchronous, it must return a jQuery promise that is resolved when the command completes. Otherwise, the CommandManager will assume it is synchronous, and return a promise that is already resolved.
Use windows-specific bindings if no other are found (e.g. Linux).
+Core Brackets modules that use key bindings should always define at
+least a generic keybinding that is applied for all platforms. This
+setting effectively creates a compatibility mode for third party
+extensions that define explicit key bindings for Windows and Mac, but
+not Linux.
Returns a copy of the current key map. If the optional 'defaults' parameter is true,
+then a copy of the default key map is returned.
+In the default keymap each key is associated with an object containing commandID, key, and displayKey.
+
Kind: global function
+
Param
Type
Description
[defaults]
boolean
true if the caller wants a copy of the default key map. Otherwise, the current active key map is returned.
Add one or more key bindings to a particular Command.
+Returns record(s) for valid key binding(s).
+
Kind: global function
+
Param
Type
Description
command
string | Command
A command ID or command object
keyBindings
Object
A single key binding or an array of keybindings. In an array of keybinding platform property is also available. Example: "Shift-Cmd-F". Mac and Win key equivalents are automatically mapped to each other. Use displayKey property to display a different string (e.g. "CMD+" instead of "CMD="). if browserOnly is true, then the shortcut will only apply in browser if nativeOnly is set, the shortcut will only apply in native apps
platform
string
The target OS of the keyBindings either "mac", "win" or "linux". If undefined, all platforms not explicitly defined will use the key binding. NOTE: If platform is not specified, Ctrl will be replaced by Cmd for "mac" platform
Retrieves the platform-specific string representation of the key bindings for a specified command.
+This function is useful for displaying the keyboard shortcut associated with a given command ID to the user.
+If a key binding is found for the command, it returns the formatted key descriptor. Otherwise, it returns null.
+
Kind: global function
+Returns: string | null - The formatted key binding as a string if available; otherwise, null.
+
Param
Type
Description
commandID
string
The unique identifier of the command for which the key binding is to be retrieved.
Adds a global keydown hook that gets first crack at keydown events
+before standard keybindings do. This is intended for use by modal or
+semi-modal UI elements like dialogs or the code hint list that should
+execute before normal command bindings are run.
+
The hook is passed two parameters, the first param is the original keyboard event.
+The second param is the deduced shortcut string like Ctrl-F if present for
+that event or null if not keyboard shortcut string. If the
+hook handles the event (or wants to block other global hooks from
+handling the event), it should return true. Note that this will only
+stop other global hooks and KeyBindingManager from handling the
+event; to prevent further event propagation, you will need to call
+stopPropagation(), stopImmediatePropagation(), and/or preventDefault()
+as usual.
+
Multiple keydown hooks can be registered, and are executed in order,
+most-recently-added first. A keydown hook will only be added once if the same
+hook is already added before.
+
(We have to have a special API for this because (1) handlers are normally
+called in least-recently-added order, and we want most-recently-added;
+(2) native DOM events don't have a way for us to find out if
+stopImmediatePropagation()/stopPropagation() has been called on the
+event, so we have to have some other way for one of the hooks to
+indicate that it wants to block the other hooks from running.)
This can be used by extensions to register new kepmap packs that can be listed in the keyboard shortcuts panel
+under use preset dropdown. For EG. distribute a netbeans editor shortcuts pack via extension.
+
Kind: global function
+
Param
Type
Description
packID
string
A unique ID for the pack. Use extensionID.name format to avoid collisions.
packName
string
A name for the pack.
keyMap
Object
a keymap of the format {'Ctrl-Alt-L': 'file.liveFilePreview'} depending on the platform. The extension should decide the correct keymap based on the platform before calling this function.
Kind: global function
+Returns: Array.<Object> - an array of all the custom keymap packs,
+each pack is an object with keys: packID, packageName & keyMap
MenuItem represents a single menu item that executes a Command or a menu divider. MenuItems
+may have a sub-menu. A MenuItem may correspond to an HTML-based
+menu item or a native menu item if Brackets is running in a native application shell
+
Since MenuItems may have a native implementation clients should create MenuItems through
+addMenuItem() and should NOT construct a MenuItem object directly.
+Clients should also not access HTML content of a menu directly and instead use
+the MenuItem API to query and modify menus items.
+
MenuItems are views on to Command objects so modify the underlying Command to modify the
+name, enabled, and checked state of a MenuItem. The MenuItem will update automatically
+
Param
Type
Description
id
string
command
string | Command
the Command this MenuItem will reflect. Use DIVIDER to specify a menu divider
[options]
options.hideWhenCommandDisabled
boolean
will not show the menu item if command is disabled.
Menu represents a top-level menu in the menu bar. A Menu may correspond to an HTML-based
+menu or a native menu if Brackets is running in a native application shell.
+
Since menus may have a native implementation clients should create Menus through
+addMenu() and should NOT construct a Menu object directly.
+Clients should also not access HTML content of a menu directly and instead use
+the Menu API to query and modify menus.
Adds a new menu item with the specified id and display text. The insertion position is
+specified via the relativeID and position arguments which describe a position
+relative to another MenuItem or MenuGroup. It is preferred that plug-ins
+insert new MenuItems relative to a menu section rather than a specific
+MenuItem (see Menu Section Constants).
+
TODO: Sub-menus are not yet supported, but when they are implemented this API will
+allow adding new MenuItems to sub-menus as well.
+
Note, keyBindings are bound to Command objects not MenuItems. The provided keyBindings
+will be bound to the supplied Command object rather than the MenuItem.
+
Kind: instance method of Menu
+Returns: MenuItem - the newly created MenuItem
+
Param
Type
Description
command
string | Command
the command the menu will execute. Pass Menus.DIVIDER for a menu divider, or just call addMenuDivider() instead.
[keyBindings]
string | Object
Register one or more key bindings to associate with the supplied command
[position]
string
constant defining the position of new MenuItem relative to other MenuItems. Values: - With no relativeID, use Menus.FIRST or LAST (default is LAST) - Relative to a command id, use BEFORE or AFTER (required) - Relative to a MenuSection, use FIRST_IN_SECTION or LAST_IN_SECTION (required)
[relativeID]
string
command id OR one of the MenuSection.* constants. Required for all position constants except FIRST and LAST.
[options]
options.hideWhenCommandDisabled
boolean
will not show the menu item if command is disabled. Helps to clear the clutter on greyed out menu items if not applicable to context.
Kind: instance method of Menu
+Returns: MenuItem - the newly created divider
+
Param
Type
Description
position
string
constant defining the position of new the divider relative to other MenuItems. Default is LAST. (see Insertion position constants).
relativeID
string
id of menuItem, sub-menu, or menu section that the new divider will be positioned relative to. Required for all position constants except FIRST and LAST
Creates a new submenu and a menuItem and adds the menuItem of the submenu
+to the menu and returns the submenu.
+
A submenu will have the same structure of a menu with a additional field
+parentMenuItem which has the reference of the submenu's parent menuItem.
+A submenu will raise the following events:
+
+
beforeSubMenuOpen
+
beforeSubMenuClose
+
+
Note, This function will create only a context submenu.
+
TODO: Make this function work for Menus
+
Kind: instance method of Menu
+Returns: Menu - the newly created submenu
+
Param
Type
Description
name
string
displayed in menu item of the submenu
id
string
position
string
constant defining the position of new MenuItem of the submenu relative to other MenuItems. Values: - With no relativeID, use Menus.FIRST or LAST (default is LAST) - Relative to a command id, use BEFORE or AFTER (required) - Relative to a MenuSection, use FIRST_IN_SECTION or LAST_IN_SECTION (required)
relativeID
string
command id OR one of the MenuSection.* constants. Required for all position constants except FIRST and LAST.
Represents a context menu that can open at a specific location in the UI.
+
Clients should not create this object directly and should instead use registerContextMenu()
+to create new ContextMenu objects.
+
Context menus in brackets may be HTML-based or native so clients should not reach into
+the HTML and should instead manipulate ContextMenus through the API.
Displays the ContextMenu at the specified location and dispatches the
+"beforeContextMenuOpen" event or "beforeSubMenuOpen" event (for submenus).
+The menu location may be adjusted to prevent clipping by the browser window.
+All other menus and ContextMenus will be closed before a new menu
+will be closed before a new menu is shown (if the new menu is not
+a submenu).
+
In case of submenus, the parentMenu of the submenu will not be closed when the
+sub menu is open.
pass a MouseEvent to display the menu near the mouse or pass in an object with page x/y coordinates for a specific location.This paramter is not used for submenus. Submenus are always displayed at a position relative to the parent menu.
Adds a new menu item with the specified id and display text. The insertion position is
+specified via the relativeID and position arguments which describe a position
+relative to another MenuItem or MenuGroup. It is preferred that plug-ins
+insert new MenuItems relative to a menu section rather than a specific
+MenuItem (see Menu Section Constants).
+
TODO: Sub-menus are not yet supported, but when they are implemented this API will
+allow adding new MenuItems to sub-menus as well.
+
Note, keyBindings are bound to Command objects not MenuItems. The provided keyBindings
+will be bound to the supplied Command object rather than the MenuItem.
+
Kind: instance method of ContextMenu
+Returns: MenuItem - the newly created MenuItem
+
Param
Type
Description
command
string | Command
the command the menu will execute. Pass Menus.DIVIDER for a menu divider, or just call addMenuDivider() instead.
[keyBindings]
string | Object
Register one or more key bindings to associate with the supplied command
[position]
string
constant defining the position of new MenuItem relative to other MenuItems. Values: - With no relativeID, use Menus.FIRST or LAST (default is LAST) - Relative to a command id, use BEFORE or AFTER (required) - Relative to a MenuSection, use FIRST_IN_SECTION or LAST_IN_SECTION (required)
[relativeID]
string
command id OR one of the MenuSection.* constants. Required for all position constants except FIRST and LAST.
[options]
options.hideWhenCommandDisabled
boolean
will not show the menu item if command is disabled. Helps to clear the clutter on greyed out menu items if not applicable to context.
Kind: instance method of ContextMenu
+Returns: MenuItem - the newly created divider
+
Param
Type
Description
position
string
constant defining the position of new the divider relative to other MenuItems. Default is LAST. (see Insertion position constants).
relativeID
string
id of menuItem, sub-menu, or menu section that the new divider will be positioned relative to. Required for all position constants except FIRST and LAST
Creates a new submenu and a menuItem and adds the menuItem of the submenu
+to the menu and returns the submenu.
+
A submenu will have the same structure of a menu with a additional field
+parentMenuItem which has the reference of the submenu's parent menuItem.
+A submenu will raise the following events:
+
+
beforeSubMenuOpen
+
beforeSubMenuClose
+
+
Note, This function will create only a context submenu.
+
TODO: Make this function work for Menus
+
Kind: instance method of ContextMenu
+Returns: Menu - the newly created submenu
+
Param
Type
Description
name
string
displayed in menu item of the submenu
id
string
position
string
constant defining the position of new MenuItem of the submenu relative to other MenuItems. Values: - With no relativeID, use Menus.FIRST or LAST (default is LAST) - Relative to a command id, use BEFORE or AFTER (required) - Relative to a MenuSection, use FIRST_IN_SECTION or LAST_IN_SECTION (required)
relativeID
string
command id OR one of the MenuSection.* constants. Required for all position constants except FIRST and LAST.
Associate a context menu to a DOM element.
+This static function take care of registering event handlers for the click event
+listener and passing the right "position" object to the Context#open method
Brackets Application Menu Section Constants
+It is preferred that plug-ins specify the location of new MenuItems
+in terms of a menu section rather than a specific MenuItem. This provides
+looser coupling to Bracket's internal MenuItems and makes menu organization
+more semantic.
+Use these constants as the "relativeID" parameter when calling addMenuItem() and
+specify a position of FIRST_IN_SECTION or LAST_IN_SECTION.
+
Menu sections are denoted by dividers or the beginning/end of a menu
Adds a top-level menu to the application menu bar which may be native or HTML-based.
+
Kind: global function
+Returns: Menu - the newly created Menu
+
Param
Type
Description
name
string
display text for menu
id
string
unique identifier for a menu. Core Menus in Brackets use a simple title as an id, for example "file-menu". Extensions should use the following format: "author.myextension.mymenuname".
position
string
constant defining the position of new the Menu relative to other Menus. Default is LAST (see Insertion position constants).
relativeID
string
id of Menu the new Menu will be positioned relative to. Required when position is AFTER or BEFORE, ignored when position is FIRST or LAST
Removes a top-level menu from the application menu bar which may be native or HTML-based.
+
Kind: global function
+
Param
Type
Description
id
string
unique identifier for a menu. Core Menus in Brackets use a simple title as an id, for example "file-menu". Extensions should use the following format: "author.myextension.mymenuname".
Registers new context menu with Brackets.
+Extensions should generally use the predefined context menus built into Brackets. Use this
+API to add a new context menu to UI that is specific to an extension.
+
After registering a new context menu clients should:
+
+
use addMenuItem() to add items to the context menu
+
call open() to show the context menu.
+For example:
To make menu items be contextual to things like selection, listen for the "beforeContextMenuOpen"
+to make changes to Command objects before the context menu is shown. MenuItems are views of
+Commands, which control a MenuItem's name, enabled state, and checked state.
+
Kind: global function
+Returns: ContextMenu - the newly created context menu
+
Param
Type
Description
id
string
unique identifier for context menu. Core context menus in Brackets use a simple title as an id. Extensions should use the following format: "author.myextension.mycontextmenu name"
Hamburger menu: when the titlebar is too narrow to fit all menu items on one row,
+overflow items are hidden and a hamburger button appears with a dropdown listing them.
Model for the contents of a single file and its current modification state.
+See DocumentManager documentation for important usage notes.
+
Document dispatches these events:
+
change -- When the text of the editor changes (including due to undo/redo).
+
Passes (Document, ChangeList), where ChangeList is an array
+of change record objects. Each change record looks like:
+
{from: start of change, expressed as{line:<line number>,ch:<character offset>}, to: end of change, expressed as{line:<line number>,ch:<chracter offset>}, text: array of lines of text to replace existing text }
+
The line and ch offsets are both 0-based.
+
The ch offset in "from" is inclusive, but the ch offset in "to" is exclusive. For example,
+an insertion of new content (without replacing existing content) is expressed by a range
+where from and to are the same.
+
If "from" and "to" are undefined, then this is a replacement of the entire text content.
+
IMPORTANT: If you listen for the "change" event, you MUST also addRef() the document
+(and releaseRef() it whenever you stop listening). You should also listen to the "deleted"
+event.
+
deleted -- When the file for this document has been deleted. All views onto the document should
+be closed. The document will no longer be editable or dispatch "change" events.
+
languageChanged -- When the value of getLanguage() has changed. 2nd argument is the old value,
+3rd argument is the new value.
What we expect the file's timestamp to be on disk. If the timestamp differs from this, then
+it means the file was modified by an app other than Brackets.
The timestamp of the document at the point where the user last said to keep changes that conflict
+with the current disk version. Can also be -1, indicating that the file was deleted on disk at the
+last point when the user said to keep changes, or null, indicating that the user has not said to
+keep changes.
+Note that this is a time as returned by Date.getTime(), not a Date object.
If true, line endings in the result depend on the Document's line endings setting (based on OS & the original text loaded from disk). If false, line endings are always \n (like all the other Document text getter methods).
Returns the document's current selected; may not be saved to disk yet. If editor is not open, will return null.
+
Kind: instance method of Document
+Returns: string | null - selected text or null if there is no editor.
+
Param
Type
Description
[useOriginalLineEndings]
boolean
If true, line endings in the result depend on the Document's line endings setting (based on OS & the original text loaded from disk). If false, line endings are always \n (like all the other Document text getter methods).
[allSelections]
boolean
Whether to return the contents of all selections (separated by newlines) instead of just the primary selection. Default false.
Sets the contents of the document. Treated as reloading the document from disk: the document
+will be marked clean with a new timestamp, the undo/redo history is cleared, and we re-check
+the text's line-ending style. CAN be called even if there is no backing editor.
Adds, replaces, or removes text. If a range is given, the text at that range is replaced with the
+given new text; if text == "", then the entire range is effectively deleted. If 'end' is omitted,
+then the new text is inserted at that point and all existing text is preserved. Line endings will
+be rewritten to match the document's current line-ending style.
+
IMPORTANT NOTE: Because of #1688, do not use this in cases where you might be
+operating on a linked document (like the main document for an inline editor)
+during an outer CodeMirror operation (like a key event that's handled by the
+editor itself). A common case of this is code hints in inline editors. In
+such cases, use editor._codeMirror.replaceRange() instead. This should be
+fixed when we migrate to use CodeMirror's native document-linking functionality.
Optional string used to batch consecutive edits for undo. If origin starts with "+", then consecutive edits with the same origin will be batched for undo if they are close enough together in time. If origin starts with "*", then all consecutive edit with the same origin will be batched for undo. Edits with origins starting with other characters will not be batched. (Note that this is a higher level of batching than batchOperation(), which already batches all edits within it for undo. Origin batching works across operations.)
Given a character index within the document text (assuming \n newlines),
+returns the corresponding {line, ch} position. Works whether or not
+a master editor is attached.
Batches a series of related Document changes. Repeated calls to replaceRange() should be wrapped in a
+batch for efficiency. Begins the batch, calls doOperation(), ends the batch, and then returns.
Called when the document is saved (which currently happens in DocumentCommandHandlers). Marks the
+document not dirty and notifies listeners of the save.
Adjusts a given position taking a given replaceRange-type edit into account.
+If the position is within the original edit range (start and end inclusive),
+it gets pushed to the end of the content that replaced the range. Otherwise,
+if it's after the edit, it gets adjusted so it refers to the same character
+it did before the edit.
+
Kind: instance method of Document
+Returns: TextPosition - The adjusted position.
Helper function for edit operations that operate on multiple selections. Takes an "edit list"
+that specifies a list of replaceRanges that should occur, but where all the positions are with
+respect to the document state before all the edits (i.e., you don't have to figure out how to fix
+up the selections after each sub-edit). Edits must be non-overlapping (in original-document terms).
+All the edits are done in a single batch.
+
If your edits are structured in such a way that each individual edit would cause its associated
+selection to be properly updated, then all you need to specify are the edits themselves, and the
+selections will automatically be updated as the edits are performed. However, for some
+kinds of edits, you need to fix up the selection afterwards. In that case, you can specify one
+or more selections to be associated with each edit. Those selections are assumed to be in terms
+of the document state after the edit, as if that edit were the only one being performed (i.e.,
+you don't have to worry about adjusting for the effect of other edits). If you supply these selections,
+then this function will adjust them as necessary for the effects of other edits, and then return a
+flat list of all the selections, suitable for passing to setSelections().
+
Kind: instance method of Document
+Returns: Array.<SelectionRange> - The list of passed selections adjusted for the performed edits, if any.
+
Param
Type
Description
edits
Array.<Object>
Specifies the list of edits to perform in a manner similar to CodeMirror's replaceRange. This array will be mutated. edit is the edit to perform: text will replace the current contents of the range between start and end. If end is unspecified, the text is inserted at start. start and end should be positions relative to the document ignoring all other edit descriptions (i.e., as if you were only performing this one edit on the document). If any of the edits overlap, an error will be thrown. If selection is specified, it should be a selection associated with this edit. If isBeforeEdit is set on the selection, the selection will be fixed up for this edit. If not, it won't be fixed up for this edit, meaning it should be expressed in terms of the document state after this individual edit is performed (ignoring any other edits). Note that if you were planning on just specifying isBeforeEdit for every selection, you can accomplish the same thing by simply not passing any selections and letting the editor update the existing selections automatically. Note that edit and selection can each be either an individual edit/selection, or a group of edits/selections to apply in order. This can be useful if you need to perform multiple edits in a row and then specify a resulting selection that shouldn't be fixed up for any of those edits (but should be fixed up for edits related to other selections). It can also be useful if you have several selections that should ignore the effects of a given edit because you've fixed them up already (this commonly happens with line-oriented edits where multiple cursors on the same line should be ignored, but still tracked). Within an edit group, edit positions must be specified relative to previous edits within that group. Also, the total bounds of edit groups must not overlap (e.g. edits in one group can't surround an edit from another group).
origin
string
An optional edit origin that's passed through to each replaceRange().
DocumentManager maintains a list of currently 'open' Documents. The DocumentManager is responsible
+for coordinating document operations and dispatching certain document events.
+
Document is the model for a file's contents; it dispatches events whenever those contents change.
+To transiently inspect a file's content, simply get a Document and call getText() on it. However,
+to be notified of Document changes or to modify a Document, you MUST call addRef() to ensure the
+Document instance 'stays alive' and is shared by all other who read/modify that file. ('Open'
+Documents are all Documents that are 'kept alive', i.e. have ref count > 0).
+
To get a Document, call getDocumentForPath(); never new up a Document yourself.
+
Secretly, a Document may use an Editor instance to act as the model for its internal state. (This
+is unavoidable because CodeMirror does not separate its model from its UI). Documents are not
+modifiable until they have a backing 'master Editor'. Creation of the backing Editor is owned by
+EditorManager. A Document only gets a backing Editor if it opened in an editor.
+
A non-modifiable Document may still dispatch change notifications, if the Document was changed
+externally on disk.
+
Aside from the text content, Document tracks a few pieces of metadata - notably, whether there are
+any unsaved changes.
+
This module dispatches several events:
+
+
dirtyFlagChange -- When any Document's isDirty flag changes. The 2nd arg to the listener is the
+Document whose flag changed.
+
documentSaved -- When a Document's changes have been saved. The 2nd arg to the listener is the
+Document that has been saved.
+
documentRefreshed -- When a Document's contents have been reloaded from disk. The 2nd arg to the
+listener is the Document that has been refreshed.
+
+
NOTE: WorkingSet APIs have been deprecated and have moved to MainViewManager as WorkingSet APIs
+Some WorkingSet APIs that have been identified as being used by 3rd party extensions will
+emit deprecation warnings and call the WorkingSet APIS to maintain backwards compatibility
+
+
+
currentDocumentChange -- Deprecated: use EditorManager activeEditorChange (which covers all editors,
+not just full-sized editors) or MainViewManager currentFileChange (which covers full-sized views
+only, but is also triggered for non-editor views e.g. image files).
+
+
+
fileNameChange -- When the name of a file or folder has changed. The 2nd arg is the old name.
+The 3rd arg is the new name. Generally, however, file objects have already been changed by the
+time this event is dispatched so code that relies on matching the filename to a file object
+will need to compare the newname.
+
+
+
pathDeleted -- When a file or folder has been deleted. The 2nd arg is the path that was deleted.
+
+
+
To listen for events, do something like this: (see EventDispatcher for details on this pattern)
+DocumentManager.on("eventname", handler);
+
Document objects themselves also dispatch some events - see Document docs for details.
Returns the existing open Document for the given file, or null if the file is not open ('open'
+means referenced by the UI somewhere). If you will hang onto the Document, you must addRef()
+it; see #getDocumentForPath for details.
Returns all Documents that are 'open' in the UI somewhere (for now, this means open in an
+inline editor and/or a full-size editor). Only these Documents can be modified, and only
+these Documents are synced with external changes on disk.
Gets an existing open Document for the given file, or creates a new one if the Document is
+not currently open ('open' means referenced by the UI somewhere). Always use this method to
+get Documents; do not call the Document constructor directly. This method is safe to call
+in parallel.
+
If you are going to hang onto the Document for more than just the duration of a command - e.g.
+if you are going to display its contents in a piece of UI - then you must addRef() the Document
+and listen for changes on it. (Note: opening the Document in an Editor automatically manages
+refs and listeners for that Editor UI).
+
If all you need is the Document's getText() value, use the faster getDocumentText() instead.
+
Kind: global function
+Returns: $.Promise - A promise object that will be resolved with the Document, or rejected
+with a FileSystemError if the file is not yet open and can't be read from disk.
Gets the text of a Document (including any unsaved changes), or would-be Document if the
+file is not actually open. More efficient than getDocumentForPath(). Use when you're reading
+document(s) but don't need to hang onto a Document object.
+
If the file is open this is equivalent to calling getOpenDocumentForPath().getText(). If the
+file is NOT open, this is like calling getDocumentForPath()...getText() but more efficient.
+Differs from plain FileUtils.readAsText() in two ways: (a) line endings are still normalized
+as in Document.getText(); (b) unsaved changes are returned if there are any.
+
Kind: global function
+Returns: $.Promise - A promise that is resolved with three parameters:
+contents - string: the document's text
+timestamp - Date: the last time the document was changed on disk (might not be the same as the last time it was changed in memory)
+lineEndings - string: the original line endings of the file, one of the FileUtils.LINE_ENDINGS_* constants;
+will be null if checkLineEndings was false.
+or rejected with a filesystem error.
+
Param
Type
Description
file
File
The file to get the text for.
[checkLineEndings]
boolean
Whether to return line ending information. Default false (slightly more efficient).
Stores a range of lines that is automatically maintained as the Document changes. The range
+MAY drop out of sync with the Document in certain edge cases; startLine & endLine will become
+null when that happens.
+
Important: you must dispose() a TextRange when you're done with it. Because TextRange addRef()s
+the Document (in order to listen to it), you will leak Documents otherwise.
+
TextRange dispatches these events:
+
+
change -- When the range boundary line numbers change (due to a Document change)
+
contentChange -- When the actual content of the range changes. This might or might not
+be accompanied by a change in the boundary line numbers.
+
lostSync -- When the backing Document changes in such a way that the range can no longer
+accurately be maintained. Generally, occurs whenever an edit spans a range boundary.
+After this, startLine & endLine will be unusable (set to null).
+Also occurs when the document is deleted, though startLine & endLine won't be modified
+These events only ever occur in response to Document changes, so if you are already listening
+to the Document, you could ignore the TextRange events and just read its updated value in your
+own Document change handler.
new Editor(document, makeMasterEditor, container, [range], options)
+
Creates a new CodeMirror editor instance bound to the given Document. The Document need not have
+a "master" Editor realized yet, even if makeMasterEditor is false; in that case, the first time
+an edit occurs we will automatically ask EditorManager to create a "master" editor to render the
+Document modifiable.
+
ALWAYS call destroy() when you are done with an Editor - otherwise it will leak a Document ref.
+
Param
Type
Description
document
Document
makeMasterEditor
boolean
If true, this Editor will set itself as the (secret) "master" Editor for the Document. If false, this Editor will attach to the Document as a "slave"/ secondary editor.
container
jQueryObject | DomNode
Container to add the editor to.
[range]
Object
If specified, range of lines within the document to display in this editor. Inclusive.
options
Object
If specified, contains editor options that can be passed to CodeMirror
Adds an inline widget below the given line. If any inline widget was already open for that
+line, it is closed without warning.
+
Kind: instance property of Editor
+Returns: $.Promise - A promise object that is resolved when the widget has been added (but might
+still be animating open). Never rejected.
+
Param
Type
Description
pos
Object
Position in text to anchor the inline.
inlineWidget
InlineWidget
The widget to add.
[scrollLineIntoView]
boolean
Scrolls the associated line into view. Default true.
Returns a list of all inline widgets currently open in this editor. Each entry contains the
+inline's id, and the data parameter that was passed to addInlineWidget().
Removes this editor from the DOM and detaches from the Document. If this is the "master"
+Editor that is secretly providing the Document's backing state, then the Document reverts to
+a read-only string-backed mode.
If true, return the actual visual column number instead of the character offset in the "ch" property.
[which]
string
Optional string indicating which end of the selection to return. It may be "start", "end", "head" (the side of the selection that moves when you press shift+arrow), or "anchor" (the fixed side of the selection). Omitting the argument is the same as passing "head". A ch object will be returned.)
Returns the display column (zero-based) for a given string-based pos. Differs from pos.ch only
+when the line contains preceding \t chars. Result depends on the current tab size setting.
Returns the string-based pos for a given display column (zero-based) in given line. Differs from column
+only when the line contains preceding \t chars. Result depends on the current tab size setting.
Returns a to object indicating the start (inclusive) and end (exclusive) of the currently rendered
+part of the document. In big documents, when most content is scrolled out of view, Editor will only render
+the visible part, and a margin around it. See also the viewportChange event fired on the editor.
+
This is combination with viewportChange event can be used to selectively redraw visual elements in code
+like syntax analyze only parts of code instead of the full code everytime.
Scrolls the editor viewport to vertically center the line with the cursor,
+but only if the cursor is currently near the edges of the viewport or
+entirely outside the viewport.
+
This does not alter the horizontal scroll position.
Gets the current selection; if there is more than one selection, returns the primary selection
+(generally the last one made). Start is inclusive, end is exclusive. If there is no selection,
+returns the current cursor position as both the start and end of the range (i.e. a selection
+of length zero). If reversed is set, then the head of the selection (the end of the selection
+that would be changed if the user extended the selection) is before the anchor.
Returns an array of current selections, nonoverlapping and sorted in document order.
+Each selection is a start/end pair, with the start guaranteed to come before the end.
+Cursors are represented as a range whose start is equal to the end.
+If reversed is set, then the head of the selection
+(the end of the selection that would be changed if the user extended the selection)
+is before the anchor.
+If primary is set, then that selection is the primary selection.
Takes the given selections, and expands each selection so it encompasses whole lines. Merges
+adjacent line selections together. Keeps track of each original selection associated with a given
+line selection (there might be multiple if individual selections were merged into a single line selection).
+Useful for doing multiple-selection-aware line edits.
+
Kind: instance method of Editor
+Returns: Object - The combined line selections. For each selection, selectionForEdit is the line selection, and selectionsToTrack is
+the set of original selections that combined to make up the given line selection. Note that the selectionsToTrack will
+include the original objects passed in selections, so if it is later mutated the original passed-in selections will be
+mutated as well.
+
Param
Type
Description
selections
Object
The selections to expand.
options
Object
expandEndAtStartOfLine: true if a range selection that ends at the beginning of a line should be expanded to encompass the line. Default false. mergeAdjacent: true if adjacent line ranges should be merged. Default true.
Returns the currently selected text, or "" if no selection. Includes \n if the
+selection spans multiple lines (does NOT reflect the Document's line-endings style). By
+default, returns only the contents of the primary selection, unless allSelections is true.
+
Kind: instance method of Editor
+Returns: string - The selected text.
+
Param
Type
Description
[allSelections]
boolean
Whether to return the contents of all selections (separated by newlines) instead of just the primary selection. Default false.
Given an top object (e.g. coordinates of a mouse event) returns the ch position that
+corresponds to it. The optional mode parameter determines relative to what the coordinates are interpreted.
+
Kind: instance method of Editor
+Returns: Object - for the given coordinates
+
Param
Type
Description
coordinates
Object
can be obtained from Eg. coordinates of a mouse event
[mode]
string
It may be "window", "page" (the default), or "local".
Returns the position and dimensions of an arbitrary character given a cursor (Eg. from getCursorPos()).
+It'll give the size of the whole character, rather than just the position that the cursor would have
+when it would sit at that position.
+
Kind: instance method of Editor
+Returns: Object - coordinates for the given character position
+
Param
Type
Description
pos
Object
A cursor, can be obtained from Eg. getCursorPos()
[mode]
string
It may be "window", "page" (the default), or "local".
Retrieves a single character from the specified position in the editor.
+x|y where | is the cursor, will return y
+
Kind: instance method of Editor
+Returns: string | null - The character at the given position if within bounds,
+otherwise null if the position is out of range.
+
Param
Type
Description
pos
CodeMirror.Position
The position from which to retrieve the character. This should be an object with line and ch properties.
Kind: instance method of Editor
+Returns: string | null - The text at the given position if within bounds,
+otherwise null if the position is out of range.
Retrieves a single character previous to the specified position in the editor in the same line if possible.
+x|y where | is the cursor, will return x
+
Kind: instance method of Editor
+Returns: string | null - The character previous to the given position if within bounds,
+otherwise null if the position is out of range.
+
Param
Type
Description
pos
CodeMirror.Position
The position from which to retrieve the character. This should be an object with line and ch properties.
Use This if you are making large number of editor changes in a single workflow to improve performance.
+The editor internally buffers changes and only updates its DOM structure after it has finished performing
+some operation. If you need to perform a lot of operations on a CodeMirror instance, you can call this method
+with a function argument. It will call the function, buffering up all changes, and only doing the expensive
+update after the function returns. This can be a lot faster. The return value from this method will be the
+return value of your function.
Inserts a bookmark, a handle that follows the text around it as it is being edited, at the given position.
+Similar to mark text, but for just a point instead of range.
+
Kind: instance method of Editor
+Returns: Object - TextMarker- A bookmark has two methods find() and clear(). find returns the current
+position of the bookmark, if it is still in the document, and clear explicitly removes the bookmark.
+
Param
Type
Description
markType
string
A String that can be used to label the mark type.
[cursorPos]
Object
Where to place the mark. Optional, if not specified, will use current pos
[options]
Object
When given, it should be an object that may contain the following configuration options:
[options.widget]
Element
Can be used to display a DOM node at the current location of the bookmark (analogous to the replacedWith option to markText).
[options.insertLeft]
boolean
By default, text typed when the cursor is on top of the bookmark will end up to the right of the bookmark. Set this option to true to make it go to the left instead.
[options.handleMouseEvents]
boolean
As with markText, this determines whether mouse events on the widget inserted for this bookmark are handled by CodeMirror. The default is false.
Clears all marks of the given type. If a lineNumbers array is given, only clears marks on those lines.
+If no markType or lineNumbers are given, clears all marks (use cautiously).
Replace the editor's undo history with the one provided, which must be a value
+as returned by getHistory. Note that this will have entirely undefined results
+if the editor content isn't also the same as it was when getHistory was called.
Sets the current selection. Start is inclusive, end is exclusive. Places the cursor at the
+end of the selection range. Optionally centers around the cursor after
+making the selection
Option value, or 0 for no options; one of the BOUNDARY_* constants above.
[origin]
string
An optional string that describes what other selection or edit operations this should be merged with for the purposes of undo. See Document::Document#replaceRange for more details.
The optional select argument can be used to change selection. Passing "around" will cause the new text to be selected, passing "start" will collapse the selection to the start of the inserted text.
Replaces the content of multiple selections with the strings in the array. The length of the given
+array should be the same as the number of active selections.
the text array to replace the current selections with
[select]
string
The optional select argument can be used to change selection. Passing "around" will cause the new text to be selected, passing "start" will collapse the selection to the start of the inserted text.
the end position to replace. to can be left off to simply insert the string at position from.
origin
string
When origin is given, it will be passed on to "change" events, and its first letter will be used to determine whether this change can be merged with previous history events of the inserted text.
editor.setSelections(selections, center, centerOptions, origin)
+
Sets a multiple selection, with the "primary" selection (the one returned by
+getSelection() and getCursorPos()) defaulting to the last if not specified.
+Overlapping ranges will be automatically merged, and the selection will be sorted.
+Optionally centers around the primary selection after making the selection.
The selection ranges to set. If the start and end of a range are the same, treated as a cursor. If reversed is true, set the anchor of the range to the end instead of the start. If primary is true, this is the primary selection. Behavior is undefined if more than one selection has primary set to true. If none has primary set to true, the last one is primary.
center
boolean
true to center the viewport around the primary selection.
centerOptions
number
Option value, or 0 for no options; one of the BOUNDARY_* constants above.
origin
string
An optional string that describes what other selection or edit operations this should be merged with for the purposes of undo. See Document::Document#replaceRange for more details.
Selects word that the given pos lies within or adjacent to. If pos isn't touching a word
+(e.g. within a token like "//"), moves the cursor to pos without selecting a range.
Gets number string of (upto 10 digits default) at the given pos lies within or adjacent to.
+If pos isn't touching a number, returns null. If the number in string is greater than max digits
+returns null.
Returns the offset of the top of the virtual scroll area relative to the browser window (not the editor
+itself). Mainly useful for calculations related to scrollIntoView(), where you're starting with the
+offset() of a child widget (relative to the browser window) and need to figure out how far down it is from
+the top of the virtual scroll area (excluding the top padding).
Gets the syntax-highlighting mode for the given range.
+Returns null if the mode at the start of the selection differs from the mode at the end -
+an approximation of whether the mode is consistent across the whole range (a pattern like
+A-B-A would return A as the mode, not null).
Gets the syntax-highlighting mode for the current selection or cursor position. (The mode may
+vary within one file due to embedded languages, e.g. JS embedded in an HTML script block). See
+getModeForRange() for how this is determined for a single selection.
+
If there are multiple selections, this will return a mode only if all the selections are individually
+consistent and resolve to the same mode.
Sets the marker for the specified gutter on the specified line number
+
Kind: instance method of Editor
+Returns: Object - lineHandle this can be used to track the gutter line as the line number
+changes as the user edits code.
+
Param
Type
Description
lineNumber
number
The line number for the inserted gutter marker
gutterName
string
The name of the gutter
marker
object
The dom element representing the marker to the inserted in the gutter
Returns true if this editor has the named gutter activated. gutters are considered active if the gutter is
+registered for the language of the file currently shown in the editor.
A number denoting the priority of the gutter. Priorities higher than LINE_NUMBER_GUTTER_PRIORITY appear after the line numbers. Priority less than LINE_NUMBER_GUTTER_PRIORITY appear before.
[languageIds]
Array.<string>
A list of language ids that this gutter is valid for. If no language ids are passed, then the gutter is valid in all languages.
When set, the tabs and spaces to be used will be auto detected from the current file or fall back to defaults.
+Affects any editors that share the same preference location.
+
Kind: static method of Editor
+Returns: boolean - true if value was valid
Editor is a 1-to-1 wrapper for a CodeMirror editor instance. It layers on Brackets-specific
+functionality and provides APIs that cleanly pass through the bits of CodeMirror that the rest
+of our codebase may want to interact with. An Editor is always backed by a Document, and stays
+in sync with its content; because Editor keeps the Document alive, it's important to always
+destroy() an Editor that's going away so it can release its Document ref.
+
For now, there's a distinction between the "master" Editor for a Document - which secretly acts
+as the Document's internal model of the text state - and the multitude of secondary Editors
+which, via Document, sync their changes to and from that master.
+
For now, direct access to the underlying CodeMirror object is still possible via _codeMirror --
+but this is considered deprecated and may go away.
+
The Editor object dispatches the following events: (available as Editor.EVENT_* constants. see below)
+
+
keydown, keypress, keyup -- When any key event happens in the editor (whether it changes the
+text or not). Handlers are passed (BracketsEvent, Editor, KeyboardEvent). The 3nd arg is the
+raw DOM event. Note: most listeners will only want to listen for "keypress".
+
change - Triggered with an array of change objects. Parameters: (editor, changeList)
+
beforeChange - (self, changeObj)
+
beforeSelectionChange - (selectionObj)
+
focus - Fired when an editor is focused
+
blur - Fired when an editor loses focused
+
update - Will be fired whenever Editor updates its DOM display.
+
cursorActivity -- When the user moves the cursor or changes the selection, or an edit occurs.
+Note: do not listen to this in order to be generally informed of edits--listen to the
+"change" event on Document instead.
+
scroll -- When the editor is scrolled, either by user action or programmatically.
+
viewportChange - (from: number, to: number) Fires whenever the view port of the editor changes
+(due to scrolling, editing, or any other factor). The from and to arguments give the new start
+and end of the viewport. This is combination with editorInstance.getViewPort() can be used to
+selectively redraw visual elements in code like syntax analyze only parts of code instead
+of the full code everytime.
+
lostContent -- When the backing Document changes in such a way that this Editor is no longer
+able to display accurate text. This occurs if the Document's file is deleted, or in certain
+Document->editor syncing edge cases that we do not yet support (the latter cause will
+eventually go away).
+
optionChange -- Triggered when an option for the editor is changed. The 2nd arg to the listener
+is a string containing the editor option that is changing. The 3rd arg, which can be any
+data type, is the new value for the editor option.
+
beforeDestroy - Triggered before the object is about to dispose of all its internal state data
+so that listeners can cache things like scroll pos, etc...
+
+
The Editor also dispatches "change" events internally, but you should listen for those on
+Documents, not Editors.
+
To listen for events, do something like this: (see EventDispatcher for details on this pattern)
+editorInstance.on("eventname", handler);
The CodeHintManager mediates the interaction between the editor and a
+collection of hint providers. If hints are requested explicitly by the
+user, then the providers registered for the current language are queried
+for their ability to provide hints in order of descending priority by
+way their hasHints methods. Character insertions may also constitute an
+implicit request for hints; consequently, providers for the current
+language are also queried on character insertion for both their ability to
+provide hints and also for the suitability of providing implicit hints
+in the given editor context.
+
Once a provider responds affirmatively to a request for hints, the
+manager begins a hinting session with that provider, begins to query
+that provider for hints by way of its getHints method, and opens the
+hint list window. The hint list is kept open for the duration of the
+current session. The manager maintains the session until either:
+
+
the provider gives a null response to a request for hints;
+
a deferred response to getHints fails to resolve;
+
the user explicitly dismisses the hint list window;
+
the editor is closed or becomes inactive; or
+
the editor undergoes a "complex" change, e.g., a multi-character
+insertion, deletion or navigation.
+
+
Single-character insertions, deletions or navigations may not
+invalidate the current session; in which case, each such change
+precipitates a successive call to getHints.
+
If the user selects a hint from the rendered hint list then the
+provider is responsible for inserting the hint into the editor context
+for the current session by way of its insertHint method. The provider
+may use the return value of insertHint to request that an additional
+explicit hint request be triggered, potentially beginning a new
+session.
+
CodeHintProvider Overview:
+
A code hint provider should implement the following three functions:
The method by which a provider indicates intent to provide hints for a
+given editor. The manager calls this method both when hints are
+explicitly requested (via, e.g., Ctrl-Space) and when they may be
+implicitly requested as a result of character insertion in the editor.
+If the provider responds negatively then the manager may query other
+providers for hints. Otherwise, a new hinting session begins with this
+provider, during which the manager may repeatedly query the provider
+for hints via the getHints method. Note that no other providers will be
+queried until the hinting session ends.
+
The implicitChar parameter is used to determine whether the hinting
+request is explicit or implicit. If the string is null then hints were
+explicitly requested and the provider should reply based on whether it
+is possible to return hints for the given editor context. Otherwise,
+the string contains just the last character inserted into the editor's
+document and the request for hints is implicit. In this case, the
+provider should determine whether it is both possible and appropriate
+to show hints. Because implicit hints can be triggered by every
+character insertion, hasHints may be called frequently; consequently,
+the provider should endeavor to return a value as quickly as possible.
+
Because calls to hasHints imply that a hinting session is about to
+begin, a provider may wish to clean up cached data from previous
+sessions in this method. Similarly, if the provider returns true, it
+may wish to prepare to cache data suitable for the current session. In
+particular, it should keep a reference to the editor object so that it
+can access the editor in future calls to getHints and insertHints.
+
param {Editor} editor
+
A non-null editor object for the active window.
+
param implicitChar
+Either null, if the hinting request was explicit, or a single character
+that represents the last insertion and that indicates an implicit
+hinting request.
+
return
+Determines whether the current provider is able to provide hints for
+the given editor context and, in case implicitChar is non- null,
+whether it is appropriate to do so.
+
__CodeHintProvider.getHints(implicitChar)__
+
The method by which a provider provides hints for the editor context
+associated with the current session. The getHints method is called only
+if the provider asserted its willingness to provide hints in an earlier
+call to hasHints. The provider may return null or false, which indicates
+that the manager should end the current hinting session and close the hint
+list window; or true, which indicates that the manager should end the
+current hinting session but immediately attempt to begin a new hinting
+session by querying registered providers. Otherwise, the provider should
+return a response object that contains the following properties:
+
+
hints, a sorted array hints that the provider could later insert
+into the editor;
+
match, a string that the manager may use to emphasize substrings of
+hints in the hint list (case-insensitive); and
+
selectInitial, a boolean that indicates whether or not the
+first hint in the list should be selected by default.
+
handleWideResults, a boolean (or undefined) that indicates whether
+to allow result string to stretch width of display.
+
+
If the array of
+hints is empty, then the manager will render an empty list, but the
+hinting session will remain open and the value of the selectInitial
+property is irrelevant.
+
Alternatively, the provider may return a jQuery.Deferred object
+that resolves with an object with the structure described above. In
+this case, the manager will initially render the hint list window with
+a throbber and will render the actual list once the deferred object
+resolves to a response object. If a hint list has already been rendered
+(from an earlier call to getHints), then the old list will continue
+to be displayed until the new deferred has resolved.
+
Both the manager and the provider can reject the deferred object. The
+manager will reject the deferred if the editor changes state (e.g., the
+user types a character) or if the hinting session ends (e.g., the user
+explicitly closes the hints by pressing escape). The provider can use
+this event to, e.g., abort an expensive computation. Consequently, the
+provider may assume that getHints will not be called again until the
+deferred object from the current call has resolved or been rejected. If
+the provider rejects the deferred, the manager will end the hinting
+session.
+
The getHints method may be called by the manager repeatedly during a
+hinting session. Providers may wish to cache information for efficiency
+that may be useful throughout these sessions. The same editor context
+will be used throughout a session, and will only change during the
+session as a result of single-character insertions, deletions and
+cursor navigations. The provider may assume that, throughout the
+lifetime of the session, the getHints method will be called exactly
+once for each such editor change. Consequently, the provider may also
+assume that the document will not be changed outside of the editor
+during a session.
+
param implicitChar
+Either null, if the request to update the hint list was a result of
+navigation, or a single character that represents the last insertion.
Null if the provider wishes to end the hinting session. Otherwise, a
+response object, possibly deferred, that provides 1. a sorted array
+hints that consists either of strings or jQuery objects; 2. a string
+match, possibly null, that is used by the manager to emphasize
+matching substrings when rendering the hint list; and 3. a boolean that
+indicates whether the first result, if one exists, should be selected
+by default in the hint list window. If match is non-null, then the
+hints should be strings.
+
If the match is null, the manager will not
+attempt to emphasize any parts of the hints when rendering the hint
+list; instead the provider may return strings or jQuery objects for
+which emphasis is self-contained. For example, the strings may contain
+substrings that wrapped in bold tags. In this way, the provider can
+choose to let the manager handle emphasis for the simple and common case
+of prefix matching, or can provide its own emphasis if it wishes to use
+a more sophisticated matching algorithm.
+
__CodeHintProvider.insertHint(hint)__
+
The method by which a provider inserts a hint into the editor context
+associated with the current session. The provider may assume that the
+given hint was returned by the provider in some previous call in the
+current session to getHints, but not necessarily the most recent call.
+After the insertion has been performed, the current hinting session is
+closed. The provider should return a boolean value to indicate whether
+or not the end of the session should be immediately followed by a new
+explicit hinting request, which may result in a new hinting session
+being opened with some provider, but not necessarily the current one.
+
param hint
+The hint to be inserted into the editor context for the current session.
+
return
+Indicates whether the manager should follow hint insertion with an
+explicit hint request.
+
CodeHintProvider.insertHintOnTab
+
type insertHintOnTab
+Indicates whether the CodeHintManager should request that the provider of
+the current session insert the currently selected hint on tab key events,
+or if instead a tab character should be inserted into the editor. If omitted,
+the fallback behavior is determined by the CodeHintManager. The default
+behavior is to insert a tab character, but this can be changed with the
+insertHintOnTab Preference.
The hint provider to be registered, described below.
languageIds
Array.<string>
The set of language ids for which the provider is capable of providing hints. If the special language id name "all" is included then the provider may be called for any language.
priority
number
Used to break ties among hint providers for a particular language. Providers with a higher number will be asked for hints before those with a lower priority value. Defaults to zero.
Test whether the provider has an exclusion that is still the same as text after the cursor.
+
Kind: inner method of CodeHintManager
+Returns: boolean - true if the exclusion is not null and is exactly the same as textAfterCursor,
+false otherwise.
+
Param
Type
Description
exclusion
string
Text not to be overwritten when the provider inserts the selected hint.
textAfterCursor
string
Text that is immediately after the cursor position.
A hint provider object with standard methods: - hasHints: function(editor, implicitChar) - returns true if hints are available - getHints: function(editor, implicitChar) - returns hint response object with hints array - insertHint: function(hint) - handles hint insertion, returns true if handled
Removes the given widget UI from the given hostEditor (agnostic of what the widget's content
+is). The widget's onClosed() callback will be run as a result.
+
Kind: global function
+Returns: $.Promise - A promise that's resolved when the widget is fully closed.
Registers a new inline editor provider. When Quick Edit is invoked each registered provider is
+asked if it wants to provide an inline editor given the current editor and cursor location.
+An optional priority parameter is used to give providers with higher priority an opportunity
+to provide an inline editor before providers with lower priority.
+
Kind: global function
+
Param
Type
Description
provider
function
[priority]
number
The provider returns a promise that will be resolved with an InlineWidget, or returns a string indicating why the provider cannot respond to this case (or returns null to indicate no reason).
Registers a new inline docs provider. When Quick Docs is invoked each registered provider is
+asked if it wants to provide inline docs given the current editor and cursor location.
+An optional priority parameter is used to give providers with higher priority an opportunity
+to provide an inline editor before providers with lower priority.
+
Kind: global function
+
Param
Type
Description
provider
function
[priority]
number
The provider returns a promise that will be resolved with an InlineWidget, or returns a string indicating why the provider cannot respond to this case (or returns null to indicate no reason).
Given a host editor, return a list of all Editors in all its open inline widgets. (Ignoring
+any other inline widgets that might be open but don't contain Editors).
Returns focus to the last visible editor that had focus. If no editor visible, does nothing.
+This function should be called to restore editor focus after it has been temporarily
+removed. For example, after a dialog with editable text is closed.
Returns the currently focused editor instance (full-sized OR inline editor).
+This function is similar to getActiveEditor(), with one main difference: this
+function will only return editors that currently have focus, whereas
+getActiveEditor() will return the last visible editor that was given focus (but
+may not currently have focus because, for example, a dialog with editable text
+is open).
Returns the current active editor (full-sized OR inline editor). This editor may not
+have focus at the moment, but it is visible and was the last editor that was given
+focus. Returns null if no editors are active.
Beautification manager interacts with beautify extensions to determine what to do when user issues beautify code
+command. Beautification providers can use this module to register new providers to beautify new languages.
provider: must implement a beautifyEditorProvider and beautifyTextProvider function. See doc below:
+
supportedLanguages: An array of languages that the provider supports. If ["all"] is supplied, then the
+provider will be invoked for all languages. Restrict to specific languages: Eg: ["javascript", "html", "php"]
+
priority: Used to break ties among providers for a particular language. Providers with a higher number
+will be asked for beatified code before those with a lower priority value. Defaults to zero.
+Example
+
+
// to register a provider that will be invoked for all languages. where provider is any object that implements // a `beautifyEditorProvider` and `beautifyTextProvider` function BeautificationManager.registerBeautificationProvider(provider,["all"]); // to register a provider that will be invoked for specific languages BeautificationManager.registerBeautificationProvider(provider,["javascript","html","php"]);
Each provider must implement the beautifyEditorProvider function that returns a promise. The promise either resolves with
+the beautified code details or rejects if there is nothing to beautify for the provider.
+Example
+
// function signature provider.beautifyEditorProvider=function(editor){ returnnewPromise((resolve, reject)=>{ resolve({ originalText:"the original text sent to beautify", changedText:"partial or full text that changed.", // Optional cursor offset if given will set the editor cursor to the position after beautification. // either `cursorOffset` or `ranges` can be specified, but not both. cursorOffset: number, // Optional: If range is specified, only the given range will be replaced. else full text is replaced ranges:{ replaceStart:{line,ch}, replaceEnd:{line,ch} } }); }); };
The resolved promise should either be null(indicating that the extension itself has prettified the code and
+doesn't want any further processing from BeautificationManager.) or contain the following details:
+
+
originalText - string, the original text sent to beautify
+
changedText - string, this should be the fully prettified text of the whole originalText or a fragment of
+pretty text in originalText if a range was selected. If a fragment is returned, then the
+ranges object must be specified.
+
cursorOffset - Optional number, if given will set the editor cursor to the position after beautification.
+either cursorOffset or ranges can be specified, but not both.
+
ranges - Optional object, set of 2 cursors that gives details on what range to replace with given changed text.
+If range is not specified, the full text in the editor will be replaced. range has 2 fields:
+
+
replaceStart{line,ch} - the start of range to replace
Each provider must implement the beautifyTextProvider function that returns a promise.
+The promise either resolves with the beautified code details(same as beautifyEditorProvider) or rejects if
+there is nothing to beautify for the provider.
+Example
+
// function signature. provider.beautifyTextProvider=function(textToBeautify, filePathOrFileName){ returnnewPromise((resolve, reject)=>{ resolve({ originalText:"the original text sent to beautify", changedText:"partial or full text that changed.", // Optional: If range is specified, only the given range is assumed changed. else full text changed. ranges:{ replaceStart:{line,ch}, replaceEnd:{line,ch} } }); }); };
Beautifies text in the given editor with available providers.
+
Kind: inner method of features/BeautificationManager
+Returns: Promise - - A promise that will be resolved to null if the selected text is beautified or rejects
+if beautification failed.
Kind: inner method of features/BeautificationManager
+Returns: Promise - - A promise that will be resolved to null if the selected text is beautified or rejects
+if beautification failed..
The resolved promise object contain the following details:
+
+
originalText - string, the original text sent to beautify
+
changedText - string, the prettified text.
+
ranges - Optional. if range object is returned, it means that only a part of the original text changed in
+the original text textToBeautify. The part that changed is supplied by two cursor positions below:
+
+
replaceStart{line,ch} - the start of range to replace
+
replaceEnd{line,ch} - the end of range to replace
+
+
+
+
Param
Type
Description
textToBeautify
string
filePathOrFileName
string
Note that the file path may not actually exist on disk. It is just used to infer what language beautifier is to be applied.
NewFileContentManager provides support to add default template content when a new/empty file is created.
+Extensions can register to provide content with NewFileContentManager.registerContentProvider API.
Let's say whenever a user creates a new js file, we have to prefill the contents to "sample content"
+
Example
+
constNewFileContentManager= brackets.getModule("features/NewFileContentManager"); // replace `js` with language ID(Eg. javascript) if you want to restrict the preview to js files only. use `all` for // all languages. NewFileContentManager.registerContentProvider(exports,["js"],1); // provide a helpful name for the ContentProvider. This will be useful if you have to debug. exports.CONTENT_PROVIDER_NAME="extension.someName"; // now implement the getContent function that will be invoked when ever user creates a new empty file. exports.getContent=function(fullPath){ returnnewPromise((resolve, reject)=>{ resolve("sample content"); }); };
provider: must implement a getContent function which will be invoked to get the content. See API doc below.
+
supportedLanguages: An array of languages that the provider supports. If ["all"] is supplied, then the
+provider will be invoked for all languages. Restrict to specific languages: Eg: ["javascript", "html", "php"]
+
priority: Contents provided hy providers with higher priority will win if there are more than
+one provider registered for the language. Default is 0.
+Example
+
+
// to register a provider that will be invoked for all languages. where provider is any object that implements // a getContent function NewFileContentManager.registerContentProvider(provider,["all"]); // to register a provider that will be invoked for specific languages NewFileContentManager.registerContentProvider(provider,["javascript","html","php"]);
Each provider must implement the getContent function that returns a promise. The promise either resolves with
+the content text or rejects if there is no content made available by the provider.
+Example
+
exports.CONTENT_PROVIDER_NAME="extension.someName";// for debugging // function signature exports.getContent=function(fullPath){ returnnewPromise((resolve, reject)=>{ resolve("sample content"); }); };
Returns a promise that resolves to the default text content of the given file after querying
+all the content providers. If no text is returned by any providers, it will return an empty string "".
+To get the default content given a path
+NewFileContentManager.getInitialContentForFile("/path/to/file.jsx");
QuickViewManager provides support to add interactive preview popups on hover over the main editors.
+Extensions can register to provide previews with QuickViewManager.registerQuickViewProvider API.
Lets build a "hello world" extension that displays "hello world" on hover over a text in the editor.
+In your extension file, add the following code:
+
Example
+
constQuickViewManager= brackets.getModule("features/QuickViewManager"); // replace `all` with language ID(Eg. javascript) if you want to restrict the preview to js files only. QuickViewManager.registerQuickViewProvider(exports,["all"]); // provide a helpful name for the QuickView. This will be useful if you implement `filterQuickView` function or // have to debug the quick view. exports.QUICK_VIEW_NAME="extension.someName"; // now implement the getQuickView function that will be invoked when ever user hovers over a text in the editor. exports.getQuickView=function(editor, pos, token, line){ returnnewPromise((resolve, reject)=>{ resolve({ start:{line: pos.line,ch:token.start}, end:{line: pos.line,ch:token.end}, content:"<div>hello world</div>" }); }); }; // optional filter quick view function to handle multiple quick views exports.filterQuickView=function(popovers){ // popovers will be an array of all popovers rendered by providers return popovers;// dont filter show everything in this case }
When QuickViewManager determines that the user intents to see QuickView on hover, getQuickView function on all
+registered QuickView providers are invoked to get the quick view popup. getQuickView should return a promise
+that resolves to the popup contents if the provider has a quick view. Else just reject the promise. If multiple
+providers returns QuickView, all of them are displayed stacked one by one. You can alter this behavior by
+providing a filterQuickView function in the provider where you can modify what previews will be shown.
+See detailed API docs for implementation details below:
provider: must implement a getQuickView function which will be invoked to get the preview. See API doc below.
+
supportedLanguages: An array of languages that the QuickView supports. If ["all"] is supplied, then the
+QuickView will be invoked for all languages. Restrict to specific languages: Eg: ["javascript", "html", "php"]
+Example
+
+
// to register a provider that will be invoked for all languages. where provider is any object that implements // a getQuickView function QuickViewManager.registerQuickViewProvider(provider,["all"]); // to register a provider that will be invoked for specific languages QuickViewManager.registerQuickViewProvider(provider,["javascript","html","php"]);
Each provider must implement the getQuickView function that returns a promise. The promise either resolves with
+the quick view details object(described below) or rejects if there is no preview for the position.
+Example
+
// function signature provider.getQuickView=function(editor, pos, token, line){ returnnewPromise((resolve, reject)=>{ resolve({ start:{line: pos.line,ch:token.start}, end:{line: pos.line,ch:token.end}, content:"<div>hello world</div>", editsDoc:false// this is optional if the quick view edits the current doc }); }); };
The promise returned should resolve to an object with the following contents:
+
+
start : Indicates the start cursor position from which the quick view is valid.
+
end : Indicates the end cursor position to which the quick view is valid. These are generally used to highlight
+the hovered section of the text in the editor.
+
content: Either HTML as text, a DOM Node or a Jquery Element.
+
editsDoc: Optional, set to true if the quick view can edit the active document.
+
+
Modifying the QuickView content after resolving getQuickView promise
+
Some advanced/interactive extensions may need to do dom operations on the quick view content.
+In such cases, it is advised to return a domNode/Jquery element as content in getQuickView. Event Handlers
+or further dom manipulations can be done on the returned content element.
+The Quick view may be dismissed at any time, so be sure to check if the DOM Node is visible in the editor before
+performing any operations.
QuickView won't be displayed till all provider promises are settled. To improve performance, if your QuickView
+handler takes time to resolve the QuickView, resolve a dummy quick once you are sure that a QuickView needs
+to be shown to the user. The div contents can be later updated as and when more details are available.
+
Note that the QuickView could be hidden/removed any time by the QuickViewManager.
+
If multiple providers returns a valid popup, all of them are displayed except if the filterQuickView modifies
+the quick view render list. Note that filterQuickView is called only for those providers that
+provided a quick view.
Each provider can optionally implement the filterQuickView function to control what among the available
+quick views should be rendered if multiple providers responded with a QuickView. The function will be called
+once all getQuickView providers provided a valid preview object.
+Example
+
// function signature provider.filterQuickView=function(popovers){ for(let popover of popovers){ // here if we see that a quick view with name `exclusiveQuickView` is present, then we only show that // QuickView. popover.providerInfo object holds details of what provider provided the quick view. if(popover.providerInfo.provider.QUICK_VIEW_NAME==="exclusiveQuickView"){ return[popover] } } // if nothing is returned, then the `popovers` param will be used to show popover };
The function will be called with the popovers parameter which is an array of popover objects that was returned
+by getQuickView function of all succeeded providers. Details of each provider that created a popover
+will be present in popovers[i].providerInfo object.
SelectionViewManager provides support to add interactive preview popups on selection over the main editors.
+This can be used to provide interactive editor controls on a selected element.
+
Extensions can register to provide previews with SelectionViewManager.registerSelectionViewProvider API.
Lets build a "hello world" extension that displays "hello world" above selected text in the editor.
+In your extension file, add the following code:
+
Example
+
constSelectionViewManager= brackets.getModule("features/SelectionViewManager"); // replace `all` with language ID(Eg. javascript) if you want to restrict the preview to js files only. SelectionViewManager.registerSelectionViewProvider(exports,["all"]); // provide a helpful name for the SelectionView. This will be useful if you have to debug the selection view exports.SELECTION_VIEW_NAME="extension.someName"; // now implement the getSelectionView function that will be invoked when ever user selection changes in the editor. exports.getSelectionView=function(editor, selections){ returnnewPromise((resolve, reject)=>{ resolve({ content:"<div>hello world</div>" }); }); };
When SelectionViewManager determines that the user intents to see SelectionViewr, getSelectionView function on all
+registered SelectionView providers are invoked to get the Selection View popup. getSelectionView should return
+a promise that resolves to the popup contents if the provider has a Selection View. Else just reject the promise.
+If multiple providers returns SelectionView, all of them are displayed one by one.
+See detailed API docs for implementation details below:
provider: must implement a getSelectionView function which will be invoked to get the preview. See API doc below.
+
supportedLanguages: An array of languages that the SelectionView supports. If ["all"] is supplied, then the
+SelectionView will be invoked for all languages. Restrict to specific languages: Eg: ["javascript", "html", "php"]
+Example
+
+
// to register a provider that will be invoked for all languages. where provider is any object that implements // a getSelectionView function SelectionViewManager.registerSelectionViewProvider(provider,["all"]); // to register a provider that will be invoked for specific languages SelectionViewManager.registerSelectionViewProvider(provider,["javascript","html","php"]);
Each provider must implement the getSelectionView function that returns a promise. The promise either resolves with
+the Selection View details object(described below) or rejects if there is no preview for the position.
+Example
The promise returned should resolve to an object with the following contents:
+
+
content: Either HTML as text, a DOM Node or a Jquery Element.
+
+
Modifying the SelectionView content after resolving getSelectionView promise
+
Some advanced/interactive extensions may need to do dom operations on the SelectionView content.
+In such cases, it is advised to return a domNode/Jquery element as content in getSelectionView. Event Handlers
+or further dom manipulations can be done on the returned content element.
+The SelectionView may be dismissed at any time, so be sure to check if the DOM Node is visible in the editor before
+performing any operations.
SelectionView won't be displayed till all provider promises are settled. To improve performance, if your SelectionView
+handler takes time to resolve the SelectionView, resolve a dummy quick once you are sure that a SelectionView needs
+to be shown to the user. The div contents can be later updated as and when more details are available.
+
Note that the SelectionView could be hidden/removed any time by the SelectionViewManager.
+
If multiple providers returns a valid popup, all of them are displayed.
TaskManager module deals with managing long running tasks in phcode. It handles the Tasks dropdown in the status
+bar where the user can see all running tasks, monitor its progress and close/pause the execution of the task if
+supported by the task.
The addNewTask is designed for adding new tasks to the task management system. This function is central to
+managing long-running tasks, providing a way to visually represent task progress, status, and control actions
+directly from the UI in the status bar.
+
Kind: inner method of features/TaskManager
+Returns: TaskObject - Returns a task object with methods for updating the task's state and UI representation,
+such as setProgressPercent, setMessage, setSucceeded, setFailed, and control visibility methods
+like showStopIcon, hideStopIcon, etc.
+
Param
Type
Default
Description
taskTitle
string
The title of the task. This is a mandatory parameter and is displayed in the UI.
message
string
A message or status associated with the task. Displayed as additional information in the UI.
[iconHTML]
string
null
Optional HTML string for the task's icon. Used to visually represent the task in the UI.
[options]
Object
Optional settings and callbacks for the task.
[options.onPauseClick]
function
Callback function triggered when the pause button is clicked.
[options.onPlayClick]
function
Callback function triggered when the play button is clicked.
[options.onStopClick]
function
Callback function triggered when the stop button is clicked.
[options.onRetryClick]
function
Callback function triggered when the retry button is clicked.
[options.onSelect]
function
Callback function triggered when the task is selected from the dropdown.
[options.progressPercent]
number
Initial progress percentage of the task.
[options.noSpinnerNotification]
boolean
If set to true, will not show the task spinners for this task. This can be used for silent background tasks where user attention is not needed.
file size (in bytes)
+This must be a hard-coded value since this value
+tells how low-level APIs should behave which cannot
+have a load order dependency on preferences manager
Asynchronously reads a file as UTF-8 encoded text.
+
Kind: global function
+Returns: $.Promise - a jQuery promise that will be resolved with the
+file's text content plus its timestamp, or rejected with a FileSystemError string
+constant if the file can not be read.
+
Param
Type
Description
file
File
File to read
bypassCache
boolean
an optional argument, if specified will read from disc instead of using cache.
[options]
object
[options.ignoreFileSizeLimits]
boolean
Will read larger files than 16MB limit. will bypassCache + won't cache if enabled.
[options.doNotCache]
boolean
will not cache if enabled. Auto-enabled if ignoreFileSizeLimits = true
Asynchronously writes a file as UTF-8 encoded text.
+
Kind: global function
+Returns: $.Promise - a jQuery promise that will be resolved when
+file writing completes, or rejected with a FileSystemError string constant.
+
Param
Type
Description
file
File
File to write
text
string
[allowBlindWrite]
boolean
Indicates whether or not CONTENTS_MODIFIED errors---which can be triggered if the actual file contents differ from the FileSystem's last-known contents---should be ignored.
Convert a URI path to a native path.
+On both platforms, this unescapes the URI
+On windows, URI paths start with a "/", but have a drive letter ("C:"). In this
+case, remove the initial "/".
Convert a Windows-native path to use Unix style slashes.
+On Windows, this converts "C:\foo\bar\baz.txt" to "C:/foo/bar/baz.txt".
+On Mac, this does nothing, since Mac paths are already in Unix syntax.
+(Note that this does not add an initial forward-slash. Internally, our
+APIs generally use the "C:/foo/bar/baz.txt" style for "native" paths.)
+
Kind: global function
+Returns: string - A Unix-style path.
Removes the trailing slash from a path or URL, if it has one.
+Warning: this differs from the format of most paths used in Brackets! Use paths ending in "/"
+normally, as this is the format used by Directory.fullPath.
Returns a native absolute path to the 'brackets' source directory.
+Note that this only works when run in brackets/src/index.html, so it does
+not work for unit tests (which is run from brackets/test/SpecRunner.html)
+
WARNING: unlike most paths in Brackets, this path EXCLUDES the trailing "/".
Given the module object passed to JS module define function,
+convert the path to a native absolute path.
+Returns a native absolute path to the module folder.
+
WARNING: unlike most paths in Brackets, this path EXCLUDES the trailing "/".
Get the file extension (excluding ".") given a path OR a bare filename.
+Returns "" for names with no extension. If the name starts with ".", the
+full remaining text is considered the extension.
+
Kind: global function
+Returns: string - Returns the extension of a filename or empty string if
+the argument is a directory or a filename with no extension
Get the parent folder of the given file/folder path. Differs from getDirectoryPath() when 'fullPath'
+is a directory itself: returns its parent instead of the original path. (Note: if you already have a
+FileSystemEntry, it's faster to use entry.parentPath instead).
+
Kind: global function
+Returns: string - Path of containing folder (including trailing "/"); or "" if path was the root
Compares two paths segment-by-segment, used for sorting. When two files share a path prefix,
+the less deeply nested one is sorted earlier in the list. Sorts files within the same parent
+folder based on compareFilenames().
+
Kind: global function
+Returns: number - -1, 0, or 1 depending on whether path1 is less than, equal to, or greater than
+path2 according to this ordering.
Kind: global function
+Returns: string - URI-encoded version suitable for appending to 'file:///`. It's not safe to use encodeURI()
+directly since it doesn't escape chars like "#".
+
Param
Type
Description
path
string
Native path in the format used by FileSystemEntry.fullPath
FileSystem is a model object representing a complete file system. This object creates
+and manages File and Directory instances, dispatches events when the file system changes,
+and provides methods for showing 'open' and 'save' dialogs.
+
FileSystem automatically initializes when loaded. It depends on a pluggable "impl" layer, which
+it loads itself but must be designated in the require.config() that loads FileSystem. For details
+see: https://github.com/adobe/brackets/wiki/File-System-Implementations
+
There are three ways to get File or Directory instances:
+
+
Use FileSystem.resolve() to convert a path to a File/Directory object. This will only
+succeed if the file/directory already exists.
+
Use FileSystem.getFileForPath()/FileSystem.getDirectoryForPath() if you know the
+file/directory already exists, or if you want to create a new entry.
+
Use Directory.getContents() to return all entries for the specified Directory.
+
+
All paths passed to FileSystem APIs must be in the following format:
+
+
The path separator is "/" regardless of platform
+
Paths begin with "/" on Mac/Linux and "c:/" (or some other drive letter) on Windows
+
+
All paths returned from FileSystem APIs additionally meet the following guarantees:
+
+
No ".." segments
+
No consecutive "/"s
+
Paths to a directory always end with a trailing "/"
+(Because FileSystem normalizes paths automatically, paths passed to FileSystem do not need
+to meet these requirements)
+
+
FileSystem dispatches the following events:
+(NOTE: attach to these events via FileSystem.on() - not $(FileSystem).on())
+
change - Sent whenever there is a change in the file system. The handler
+is passed up to three arguments: the changed entry and, if that changed entry
+is a Directory, a list of entries added to the directory and a list of entries
+removed from the Directory. The entry argument can be:
+
+
a File - the contents of the file have changed, and should be reloaded.
+
a Directory - an immediate child of the directory has been added, removed,
+or renamed/moved. Not triggered for "grandchildren".
+
+
If the added & removed arguments are null, we don't know what was added/removed:
+clients should assume the whole subtree may have changed.
+
If the added & removed arguments are 0-length, there's no net change in the set
+of files but a file may have been replaced: clients should assume the contents
+of any immediate child file may have changed.
+
+
+
null - a 'wholesale' change happened, and you should assume everything may
+have changed.
+For changes made externally, there may be a significant delay before a "change" event
+is dispatched.
+
+
rename - Sent whenever a File or Directory is renamed. All affected File and Directory
+objects have been updated to reflect the new path by the time this event is dispatched.
+This event should be used to trigger any UI updates that may need to occur when a path
+has changed. Note that these events will only be sent for rename operations that happen
+within the filesystem. If a file is renamed externally, a change event on the parent
+directory will be sent instead.
+
FileSystem may perform caching. But it guarantees:
+
+
File contents & metadata - reads are guaranteed to be up to date (cached data is not used
+without first veryifying it is up to date).
+
Directory structure / file listing - reads may return cached data immediately, which may not
+reflect external changes made recently. (However, changes made via FileSystem itself are always
+reflected immediately, as soon as the change operation's callback signals success).
+
+
The FileSystem doesn't directly read or write contents--this work is done by a low-level
+implementation object. This allows client code to use the FileSystem API without having to
+worry about the underlying storage, which could be a local filesystem or a remote server.
This class should not be instantiated directly. Use FileSystem.getDirectoryForPath,
+FileSystem.resolve, or Directory.getContents to create an instance of this class.
+
Note: Directory.fullPath always has a trailing slash.
Recursively deletes all empty subdirectories within the current directory. If all subdirectories are empty,
+the current directory itself will be deleted.
+A directory is considered empty if it doesn't contain any files in its subtree.
+
If a subtree contains a large number of nested subdirectories and no files, the whole tree will be deleted.
+Only branches that contain a file will be retained.
+
Kind: instance method of Directory
+Returns: Promise.<void> - A Promise that resolves when the operation is finished
+Throws:
+
+
FileSystemError If an error occurs while accessing the filesystem
Read the contents of a Directory, returns a promise. It filters out all files
+that are not shown in the file tree by default, unless the filterNothing option is specified.
+
Kind: instance method of Directory
+Returns: Object - An object
+with attributes - entries(an array of file system entries), contentStats and contentsStatsErrors(a map from
+content name to error if there is any).
+
Param
Type
Description
filterNothing
boolean
is specified, will return a true contents of dir as shown in disc, weather it is shown in the file tree or not. Can be used for backup/restore flows.
Read the contents of a Directory. It filters out all files
+that are not shown in the file tree by default, unless the filterNothing option is specified.
Callback that is passed an error code or the stat-able contents of the directory along with the stats for these entries and a fullPath-to-FileSystemError string map of unstat-able entries and their stat errors. If there are no stat errors then the last parameter shall remain undefined.
filterNothing
boolean
is specified, will return a true contents of dir as shown in disc, weather it is shown in the file tree or not. Can be used for backup/restore flows.
This class should not be instantiated directly. Use FileSystem.getFileForPath,
+FileSystem.resolve, or Directory.getContents to create an instance of this class.
Check to see if the entry exists on disk. Note that there will NOT be an
+error returned if the file does not exist on the disk; in that case the
+error parameter will be null and the boolean will be false. The error
+parameter will only be truthy when an unexpected error was encountered
+during the test, in which case the state of the entry should be considered
+unknown.
Visit this entry and its descendents with the supplied visitor function.
+Correctly handles symbolic link cycles and options can be provided to limit
+search depth and total number of entries visited. No particular traversal
+order is guaranteed; instead of relying on such an order, it is preferable
+to use the visit function to build a list of visited entries, sort those
+entries as desired, and then process them. Whenever possible, deep
+filesystem traversals should use this method. Will not visit all files/dirs
+that are not shown in the file tree by default, unless the visitHiddenTree option is specified.
A visitor function (can be async), which is applied to this entry and all descendent FileSystemEntry objects. It can have two args, the first one is the entry being visited, the second is an array of sibling entries that share the same parent dir as the given entry. If the function returns false (or promise that resolved to false)for a particular Directory entry, that directory's descendents will not be visited.
[options]
Object
[callback]
function
Callback with single FileSystemError string parameter.
Represents file or directory structure watched by the FileSystem. If the
+entry is a directory, all children (that pass the supplied filter function)
+are also watched. A WatchedRoot object begins and ends its life in the
+INACTIVE state. While in the process of starting up watchers, the WatchedRoot
+is in the STARTING state. When watchers are ready, the WatchedRoot enters
+the ACTIVE state.
We will use this CM to cook css context in case of style attribute value
+as CM in htmlmixed mode doesn't yet identify this as css context. We provide
+a no-op display function to run CM without a DOM head.
Extracts all CSS selectors from the given text
+Returns an array of SelectorInfo. Each SelectorInfo is an object with the following properties:
+selector: the text of the selector (note: comma separated selector groups like
+"h1, h2" are broken into separate selectors)
+ruleStartLine: line in the text where the rule (including preceding comment) appears
+ruleStartChar: column in the line where the rule (including preceding comment) starts
+selectorStartLine: line in the text where the selector appears
+selectorStartChar: column in the line where the selector starts
+selectorEndLine: line where the selector ends
+selectorEndChar: column where the selector ends
+selectorGroupStartLine: line where the comma-separated selector group (e.g. .foo, .bar, .baz)
+starts that this selector (e.g. .baz) is part of. Particularly relevant for
+groups that are on multiple lines.
+selectorGroupStartChar: column in line where the selector group starts.
+selectorGroup: the entire selector group containing this selector, or undefined if there
+is only one selector in the rule.
+declListStartLine: line where the declaration list for the rule starts
+declListStartChar: column in line where the declaration list for the rule starts
+declListEndLine: line where the declaration list for the rule ends
+declListEndChar: column in the line where the declaration list for the rule ends
+level: the level of the current selector including any containing @media block in the
+nesting level count. Use this property with caution since it is primarily for internal
+parsing use. For example, two sibling selectors may have different levels if one
+of them is nested inside an @media block and it should not be used for sibling info.
+parentSelectors: all ancestor selectors separated with '/' if the current selector is a nested one
+
Kind: global function
+Returns: Array.<SelectorInfo> - Array with objects specifying selectors.
+
Param
Type
Description
text
string
CSS text to extract from
documentMode
string
language mode of the document that text belongs to, default to css if undefined.
Return all rules matching the specified selector.
+For now, we only look at the rightmost simple selector. For example, searching for ".foo" will
+match these rules:
+.foo
+div .foo
+div.foo
+div .foo[bar="42"]
+div .foo:hovered
+div .foo::first-child
+but will not match these rules:
+.foobar
+.foo .bar
+div .foo .bar
+.foo.bar
+
Kind: global function
+Returns: $.Promise - that will be resolved with an Array of objects containing the
+source document, start line, and end line (0-based, inclusive range) for each matching declaration list.
+Does not addRef() the documents returned in the array.
+
Param
Type
Description
selector
string
The selector to match. This can be a tag selector, class selector or id selector
htmlDocument
Document
An HTML file for context (so we can search 'style' blocks)
Returns the selector(s) of the rule at the specified document pos, or "" if the position is
+is not within a style rule.
+
Kind: global function
+Returns: string - Selector(s) for the rule at the specified position, or "" if the position
+is not within a style rule. If the rule has multiple selectors, a comma-separated
+selector string is returned.
Adds a new rule to the end of the given document, and returns the range of the added rule
+and the position of the cursor on the indented blank line within it. Note that the range will
+not include all the inserted text (we insert extra newlines before and after the rule).
+
Kind: global function
+Returns: Object - The range of the inserted rule and the location where the cursor should be placed.
+
Param
Type
Description
doc
Document
The document to insert the rule into.
selector
string
The selector to use for the given rule.
useTabChar
boolean
Whether to indent with a tab.
indentUnit
number
If useTabChar is false, how many spaces to indent with.
In the given rule array (as returned by findMatchingRules()), if multiple rules in a row
+refer to the same rule (because there were multiple matching selectors), eliminate the redundant
+rules. Also, always use the selector group if available instead of the original matching selector.
Given a TextRange, extracts the selector(s) for the rule in the range and returns it.
+Assumes the range only contains one rule; if there's more than one, it will return the
+selector(s) for the first rule.
+
Kind: global function
+Returns: string - The selector(s) for the rule in the range.
Manages linters and other code inspections on a per-language basis. Provides a UI and status indicator for
+the resulting errors/warnings.
+
Currently, inspection providers are only invoked on the current file and only when it is opened, switched to,
+or saved. But in the future, inspectors may be invoked as part of a global scan, at intervals while typing, etc.
+Currently, results are only displayed in a bottom panel list and in a status bar icon. But in the future,
+results may also be displayed inline in the editor (as gutter markers, etc.).
+In the future, support may also be added for error/warning providers that cannot process a single file at a time
+(e.g. a full-project compiler).
Runs a file inspection over passed file. Uses the given list of providers if specified, otherwise uses
+the set of providers that are registered for the file's language.
+This method doesn't update the Brackets UI, just provides inspection results.
+These results will reflect any unsaved changes present in the file if currently open.
+
The Promise yields an array of provider-result pair objects (the result is the return value of the
+provider's scanFile() - see register() for details). The result object may be null if there were no
+errors from that provider.
+If there are no providers registered for this file, the Promise yields null instead.
+
Kind: global function
+Returns: $.Promise - a jQuery promise that will be resolved with ?{provider:Object, result: ?{errors:!Array, aborted:boolean}}
Run inspector applicable to current document. Updates status bar indicator and refreshes error list in
+bottom panel. Does not run if inspection is disabled or if a providerName is given and does not
+match the current doc's provider name.
Registers a provider for a specific language to inspect files and provide linting results.
+
The provider is passed the text of the file and its full path. Providers should not assume that
+the file is open (i.e., DocumentManager.getOpenDocumentForPath() may return null) or that the
+file on disk matches the text given (the file may have unsaved changes).
+
Registering any provider for the "javascript" language automatically unregisters the built-in
+Brackets JSLint provider. This is a temporary convenience until a UI exists for disabling
+registered providers.
+
Providers must implement canInspect(), scanFile(), or scanFileAsync(). If both scanFile()
+and scanFileAsync() are implemented, scanFile() is ignored.
+
+
canInspect(fullPath): A synchronous call to determine if the file can be scanned by this provider.
+
scanFile(text, fullPath): A synchronous function returning linting results or null.
+
scanFileAsync(text, fullPath): An asynchronous function returning a jQuery Promise resolved with
+the same type of value as scanFile(). Rejecting the promise is treated as an internal error in the provider.
+
+
Each error object in the results should have the following structure:
+
{pos:{line,ch}, endPos:?{line,ch}, message:string, htmlMessage:string, type:?Type, fix:{// an optional fix, if present will show the fix button replace:"text to replace the offset given below", rangeOffset:{ start: number, end: number }}}
+
Kind: global typedef
+
Param
Type
Description
languageId
string
The language ID for which the provider is registered.
provider
Object
The provider object.
provider.name
string
The name of the provider.
provider.scanFile
function
Synchronous scan function.
provider.scanFileAsync
function
Asynchronous scan function returning a Promise.
+
Properties
+
Name
Type
Description
pos
Object
The start position of the error.
pos.line
number
The line number (0-based).
pos.ch
number
The character position within the line (0-based).
endPos
Object
The end position of the error.
endPos.line
number
The end line number (0-based).
endPos.ch
number
The end character position within the line (0-based).
The type of the error. Defaults to Type.WARNING if unspecified.
fix
Object
An optional fix object.
fix.replace
string
The text to replace the error with.
fix.rangeOffset
Object
The range within the text to replace.
fix.rangeOffset.start
number
The start offset of the range.
fix.rangeOffset.end
number
The end offset of the range. If no errors are found, return either null(treated as file is problem free) or an object with a zero-length errors array. Always use message to safely display the error as text. If you want to display HTML error message, then explicitly use htmlMessage to display it. Both message and htmlMessage can be used simultaneously. After scanning the file, if you need to omit the lint result, return or resolve with {isIgnored: true}. This prevents the file from being marked with a no errors tick mark in the status bar and excludes the linter from the problems panel.
Adds elements to the queue for generateChildEdits.
+Only elements (and not text nodes) are added. New nodes (ones that aren't in the
+old nodeMap), are not added here because they will be added when generateChildEdits
+creates the elementInsert edit.
A SimpleNode represents one node in a SimpleDOM tree. Each node can have
+any set of properties on it, though there are a couple of assumptions made.
+Elements will have children and attributes properties. Text nodes will have a content
+property. All Elements will have a tagID and text nodes can have one.
+
Param
Type
Description
properties
Object
the properties provided will be set on the new object.
A Builder creates a SimpleDOM tree of SimpleNode objects representing the
+"important" contents of an HTML document. It does not include things like comments.
+The nodes include information about their position in the text provided.
Returns an Array of info about all blocks whose token mode name matches that passed in,
+in the given Editor's HTML document (assumes the Editor contains HTML text).
Return all functions that have the specified name, searching across all the given files.
+
Kind: global function
+Returns: $.Promise - that will be resolved with an Array of objects containing the
+source document, start line, and end line (0-based, inclusive range) for each matching function list.
+Does not addRef() the documents returned in the array.
Resolves a file extension to a Language object.
+Warning: it is almost always better to use getLanguageForPath(), since Language can depend
+on file name and even full path. Use this API only if no relevant file/path exists.
+
Kind: global function
+Returns: Language - The language for the provided extension or null if none exists
Returns a map of all the languages currently defined in the LanguageManager. The key to
+the map is the language id and the value is the language object.
+
Kind: global function
+Returns: Object.<string, Language> - A map containing all of the
+languages currently defined.
Adds a language mapping for the specified fullPath. If language is falsy (null or undefined), the mapping
+is removed. The override is NOT persisted across Brackets sessions.
+
Kind: global function
+
Param
Type
Description
fullPath
fullPath
absolute path of the file
language
object
language to associate the file with or falsy value to remove any existing override
Get the file extension (excluding ".") given a path OR a bare filename.
+Returns "" for names with no extension.
+If the only . in the file is the first character,
+returns "" as this is not considered an extension.
+This method considers known extensions which include . in them.
+
Kind: global function
+Returns: string - Returns the extension of a filename or empty string if
+the argument is a directory or a filename with no extension
Kind: global function
+Returns: $.Promise - A promise object that will be resolved with a Language object
+
Param
Type
Description
id
string
Unique identifier for this language: lowercase letters, digits, and _ separators (e.g. "cpp", "foo_bar", "c99")
definition
Object
An object describing the language
definition.name
string
Human-readable name of the language, as it's commonly referred to (e.g. "C++")
definition.fileExtensions
Array.<string>
List of file extensions used by this language (e.g. ["php", "php3"] or ["coffee.md"] - may contain dots)
definition.fileNames
Array.<string>
List of exact file names (e.g. ["Makefile"] or ["package.json]). Higher precedence than file extension.
definition.blockComment
Array.<string>
Array with two entries defining the block comment prefix and suffix (e.g. ["< !--", "-->"])
definition.lineComment
string | Array.<string>
Line comment prefixes (e.g. "//" or ["//", "#"])
definition.mode
string | Array.<string>
CodeMirror mode (e.g. "htmlmixed"), optionally with a MIME mode defined by that mode ["clike", "text/x-c++src"] Unless the mode is located in thirdparty/CodeMirror/mode/"name"/"name".js, you need to first load it yourself.
Creates an extension-specific preferences manager using the prefix given.
+A . character will be appended to the prefix. So, a preference named foo
+with a prefix of myExtension will be stored as myExtension.foo in the
+preferences files.
Optional additional information about the request, can be: - ScopeManager.PROJECT_CONTEXT if you want to get project specific value or - ScopeManager.GLOBAL_CONTEXT if you want to get it from global context and not the project context. - null/undefined if you want to get from project context first, and then global context if not found in project context.
[context.scope]
string
Eg. user - deprecated, do not use
[context.layer]
string
Eg. project - deprecated, do not use
[context.layerID]
string
Eg. /tauri/path/to/project - deprecated, do not use
Convenience function that sets a view state and then saves the file
+
Kind: global function
+
Param
Type
Description
id
string
preference to set
value
*
new value for the preference
[context]
Object | string
Optional additional information about the request, can be: ScopeManager.PROJECT_CONTEXT if you want to get project specific value or ScopeManager.GLOBAL_CONTEXT or null if you want to set globally.
[context.scope]
string
Eg. user - deprecated, do not use
[context.layer]
string
Eg. project - deprecated, do not use
[context.layerID]
string
Eg. /tauri/path/to/project - deprecated, do not use
returns a preference instance that can be listened .on("change", cbfn(changeType)) . The callback fucntion will be called
+whenever there is a change in the supplied id with a changeType argument. The change type can be one of the two:
+CHANGE_TYPE_INTERNAL - if change is made within the current app window/browser tap
+CHANGE_TYPE_EXTERNAL - if change is made in a different app window/browser tab
Check to see whether any open files have been modified by an external app since the last time
+Brackets synced up with the copy on disk (either by loading or saving the file). For clean
+files, we silently upate the editor automatically. For files with unsaved changes, we prompt
+the user.
+
Kind: global function
+
Param
Type
Description
title
string
Title to use for document. Default is "External Changes".
This is the view layer (template) for the file tree in the sidebar. It takes a FileTreeViewModel
+and renders it to the given element using Preact. User actions are signaled via an ActionCreator
+(in the Flux sense).
Adds an icon provider. The callback is invoked before each working set item is created, and can
+return content to prepend to the item if it supports the icon.
+
Kind: global function
+
Param
Type
Default
Description
callback
function
Return a string representing the HTML, a jQuery object or DOM node, or undefined. If undefined, nothing is prepended to the list item and the default or an available icon will be used.
[priority]
number
0
optional priority. 0 being lowest. The icons with the highest priority wins if there are multiple callback providers attached. icon providers of the same priority first valid response wins.
Adds a CSS class provider, invoked before each working set item is created or updated. When called
+to update an existing item, all previously applied classes have been cleared.
+
Kind: global function
+
Param
Type
Default
Description
callback
function
Return a string containing space-separated CSS class(es) to add, or undefined to leave CSS unchanged.
[priority]
number
0
optional priority. 0 being lowest. The class with the highest priority wins if there are multiple callback classes attached. class providers of the same priority will be appended.
The view model (or a Store in the Flux terminology) used by the file tree.
+
Many of the view model's methods are implemented by pure functions, which can be
+helpful for composability. Many of the methods commit the new treeData and send a
+change event when they're done whereas the functions do not do this.
Modifies the selection focus in the project side bar. A file can either be selected
+in the working set (the open files) or in the file tree, but not both.
Returns the File or Directory corresponding to the item selected in the sidebar panel, whether in
+the file tree OR in the working set; or null if no item is selected anywhere in the sidebar.
+May NOT be identical to the current Document - a folder may be selected in the sidebar, or the sidebar may not
+have the current document visible in the tree & working set.
Returns the encoded Base URL of the currently loaded project, or empty string if no project
+is open (during startup, or running outside of app shell).
Gets a generally displayable path that can be shown to the user in most cases.
+Gets the project relative path if possible. If paths is not in project, then if its a platform path(Eg. in tauri)
+it will return the full platform path. If not, then it will return a mount relative path for fs access mount
+folders opened in the bowser. at last, falling back to vfs path. This should only be used for display purposes
+as this path will be changed by phcode depending on the situation in the future.
Refresh the project's file tree, maintaining the current selection.
+
Note that the original implementation of this returned a promise to be resolved when the refresh is complete.
+That use is deprecated and refreshFileTree is now a "fire and forget" kind of function.
Open a new project. Currently, Brackets must always have a project open, so
+this method handles both closing the current project and opening a new project.
+
Kind: global function
+Returns: $.Promise - A promise object that will be resolved when the
+project is loaded and tree is rendered, or rejected if the project path
+fails to load.
+
Param
Type
Description
[path]
string
Optional absolute path to the root folder of the project. If path is undefined or null, displays a dialog where the user can choose a folder to load. If the user cancels the dialog, nothing more happens.
Kind: global function
+Returns: $.Promise - A promise object that will be resolved with the File
+of the created object, or rejected if the user cancelled or entered an illegal
+filename.
+
Param
Type
Description
baseDir
string | Directory
Full path of the directory where the item should go. Defaults to the project root if the entry is not valid or not within the project.
Sets or unsets project busy spinner with the specified message as reason.
+
For Eg., if you want to mark project as busy with reason compiling project:
+setProjectBusy(true, "compiling project...") . The project spinner will be shown with the specified reason.
+
Once the compilation is complete, call, we need to unset the busy status by calling:
+setProjectBusy(false, "compiling project...") . Make sure to pass in the exact message when
+calling set and unset.
+
Kind: global function
+
Param
Type
Description
isBusy
boolean
true or false to set the project as busy or not
message
string
The reason why the project is busy. Will be displayed as a hover tooltip on busy spinner.
Starts a rename operation, completing the current operation if there is one.
+
The Promise returned is resolved with an object with a newPath property with the renamed path. If the user cancels the operation, the promise is resolved with the value RENAME_CANCELLED.
+
Kind: global function
+Returns: $.Promise - a promise resolved when the rename is done.
+
Param
Type
Description
entry
FileSystemEntry
file or directory filesystem object to rename
[isMoved]
boolean
optional flag which indicates whether the entry is being moved instead of renamed
Returns an Array of all files for this project, optionally including
+files in the working set that are not under the project root. Files are
+filtered first by ProjectModel.shouldShow(), then by the custom filter
+argument (if one was provided).
+
Kind: global function
+Returns: $.Promise - Promise that is resolved with an Array of File objects.
+
Param
Type
Description
filter
function
Optional function to filter the file list (does not filter directory traversal). API matches Array.filter().
[includeWorkingSet]
boolean
If true, include files in the working set that are not under the project root (except for untitled documents).
[sort]
boolean
If true, The files will be sorted by their paths
options
Object
optional path within project to narrow down the search
options.scope
File
optional path within project to narrow down the search
Adds an icon provider. The callback is invoked before each working set item is created, and can
+return content to prepend to the item if it supports the icon.
+
Kind: global function
+
Param
Type
Default
Description
callback
function
Return a string representing the HTML, a jQuery object or DOM node, or undefined. If undefined, nothing is prepended to the list item and the default or an available icon will be used.
[priority]
number
0
optional priority. 0 being lowest. The icons with the highest priority wins if there are multiple callback providers attached. icon providers of the same priority first valid response wins.
Adds a CSS class provider, invoked before each working set item is created or updated. When called
+to update an existing item, all previously applied classes have been cleared.
+
Kind: global function
+
Param
Type
Description
callback
function
Return a string containing space-separated CSS class(es) to add, or undefined to leave CSS unchanged.
[priority]
number
optional priority. 0 being lowest. The class with the highest priority wins if there are multiple callback classes attached. class providers of the same priority will be appended.
Forces the file tree to rerender. Typically, the tree only rerenders the portions of the
+tree that have changed data. If an extension that augments the tree has changes that it
+needs to display, calling rerenderTree will cause the components for the whole tree to
+be rerendered.
Returns false for files and directories that should not be indexed for search or code hints.
+If the entry is a directory, its children should be indexed too.
+
Kind: global function
+Returns: boolean - true if the file should be displayed
Creates a new file or folder at the given path. The returned promise is rejected if the filename
+is invalid, the new path already exists or some other filesystem error comes up.
+
Kind: global function
+Returns: $.Promise - resolved when the file or directory has been created.
The view that controls the showing and hiding of the sidebar.
+
Although the sidebar view doesn't dispatch any events directly, it is a
+resizable element (../utils/Resizer.js), which means it can dispatch Resizer
+events. For example, if you want to listen for the sidebar showing
+or hiding itself, set up listeners for the corresponding Resizer events,
+panelCollapsed and panelExpanded:
Programmatically resize the sidebar to the given width. Persists
+the new size so it is restored on reload, resyncs the drag handle,
+and fires panelResizeEnd.
The function that will be used inside JavaScript's sort function. The return a value should be >0 (sort a to a lower index than b), =0 (leaves a and b unchanged with respect to each other) or < 0 (sort b to a lower index than a) and must always returns the same value when given a specific pair of elements a and b as its two arguments. Documentation at: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/sort
events
string
One or more space-separated event types that DocumentManger uses. Each event passed will trigger the automatic sort. If no events are passed, the automatic sort will be disabled for that sort method.
Adds an icon provider. The callback is invoked before each working set item is created, and can
+return content to prepend to the item if it supports the icon.
+
Kind: global function
+
Param
Type
Default
Description
callback
function
Return a string representing the HTML, a jQuery object or DOM node, or undefined. If undefined, nothing is prepended to the list item and the default or an available icon will be used.
[priority]
number
0
optional priority. 0 being lowest. The icons with the highest priority wins if there are multiple callback providers attached. icon providers of the same priority first valid response wins.
Adds a CSS class provider, invoked before each working set item is created or updated. When called
+to update an existing item, all previously applied classes have been cleared.
+
Kind: global function
+
Param
Type
Default
Description
callback
function
Return a string containing space-separated CSS class(es) to add, or undefined to leave CSS unchanged.
[priority]
number
0
optional priority. 0 being lowest. The class with the highest priority wins if there are multiple callback classes attached. class providers of the same priority will be appended.
Utilities for managing file-set filters, as used in Find in Files.
+Includes both UI for selecting/editing filters, as well as the actual file-filtering implementation.
Sets and save the index of the active filter. Automatically set when editFilter() is completed.
+If no filter is passed in, then clear the last active filter index by setting it to -1.
+
Kind: global function
+
Param
Type
Description
filter
Object | string
a globeFilter filter that can be passed to filterPath()/filterFileList().
Converts a user-specified filter object (as chosen in picker or retrieved from getFilters()) to a 'compiled' form
+that can be used with filterPath()/filterFileList().
+
Kind: global function
+Returns: Object - a globeFilter filter that can be passed to filterPath()/filterFileList().
Returns false if the given path matches any of the exclusion globs in the given filter. Returns true
+if the path does not match any of the globs. If filtering many paths at once, use filterFileList()
+for much better performance.
+
Kind: global function
+
Param
Type
Description
compiledFilter
object
'Compiled' filter object as returned by compile(), or null to no-op
Creates a UI element for selecting a filter. The picker is populated with a list of recently used filters,
+an option to edit the selected filter, and another option to create a new filter. The client should call
+commitDropdown() when the UI containing the filter picker is confirmed, which updates the Most Recently
+Used (MRU) order, and then use the returned filter object as needed.
+
Kind: global function
+Returns: jQueryObject - The Picker UI as a jQuery object.
Find Bar UI component, used for both single- and multi-file find/replace. This doesn't actually
+create and add the FindBar to the DOM - for that, call open().
+
Dispatches these events:
+
+
queryChange - when the user types in the input field or sets a query option. Use getQueryInfo()
+to get the current query state.
+
doFind - when the user chooses to do a Find Previous or Find Next.
+Parameters are:
+shiftKey - boolean, false for Find Next, true for Find Previous
+
doReplace - when the user chooses to do a single replace. Use getReplaceText() to get the current replacement text.
+
doReplaceBatch - when the user chooses to initiate a Replace All. Use getReplaceText() to get the current replacement text.
+
doReplaceAll - when the user chooses to perform a Replace All. Use getReplaceText() to get the current replacement text.
+
close - when the find bar is closed
+
+
Param
Type
Description
[options.multifile]
boolean
true if this is a Find/Replace in Files (changes the behavior of Enter in the fields, hides the navigator controls, shows the scope/filter controls, and if in replace mode, hides the Replace button (so there's only Replace All)
[options.replace]
boolean
true to show the Replace controls - default false
[options.queryPlaceholder]
string
label to show in the Find field - default empty string
[options.initialQuery]
string
query to populate in the Find field on open - default empty string
[scopeLabel]
string
HTML label to show for the scope of the search, expected to be already escaped - default empty string
Enables or disables the controls in the Find bar. Note that if enable is true, all controls will be
+re-enabled, even if some were previously disabled using enableNavigation() or enableReplace(), so you
+will need to refresh their enable state after calling this.
Enable or disable the navigation controls if present. Note that if the Find bar is currently disabled
+(i.e. isEnabled() returns false), this will have no effect.
Enable or disable the replace controls if present. Note that if the Find bar is currently disabled
+(i.e. isEnabled() returns false), this will have no effect.
Does a search in the given scope with the given filter. Used when you want to start a search
+programmatically. Make sure that project indexing is complete by calling isProjectIndexingComplete()
+Else, an empty result will be returned if search is invoked before any files are indexed.
+
Kind: global function
+Returns: $.Promise - A promise that's resolved with the search results or rejected when the find competes.
+
Param
Type
Description
queryInfo
Object
Query info object
scope
Entry
Project file/subfolder to search within; else searches whole project.
filter
string
A "compiled" filter as returned by FileFilters.compile(), or null for no filter
replaceText
string
If this is a replacement, the text to replace matches with. This is just stored in the model for later use - the replacement is not actually performed right now.
candidateFilesPromise
$.Promise
If specified, a promise that should resolve with the same set of files that getCandidateFiles(scope) would return.
Replaces a set of search results with the specified replaceText, either on disk or in memory.
+
Kind: global function
+Returns: $.Promise - A promise that resolves when the replacement is finished or is rejected with an array of errors if any occur.
+Each item in the array will be an object containing:
+
Param
Type
Description
results
Object
- The list of results to replace, as returned from _doSearch.
replaceText
string
The text to replace each result with.
options
Object
An options object:
options.forceFilesOpen
boolean
Whether to open all files in editors and perform replacements there instead of on disk. Note that even if this is false, replacements will still occur in memory for files already open in editors.
options.isRegexp
boolean
Indicates if the original query was a regular expression. If true, $-substitution is applied to the replaceText.
item
string
The full path to the file that could not be updated.
error
string
Either a FileSystem error or one of the FindInFiles.ERROR_* constants.
Given a replace string that contains $-expressions, replace them with data from the given
+regexp match info.
+NOTE: we can't just use the ordinary replace() function here because the string has been
+extracted from the original text and so might be missing some context that the regexp matched.
+
Kind: global function
+Returns: string - The replace text with the $-expressions substituted.
Given a set of search results, replaces them with the given replaceText, either on disk or in memory.
+Checks timestamps to ensure replacements are not performed in files that have changed on disk since
+the original search results were generated. However, does not check whether edits have been performed
+in in-memory documents since the search; it's up to the caller to guarantee this hasn't happened.
+(When called from the standard Find in Files UI, SearchResultsView guarantees this. If called headlessly,
+the caller needs to track changes.)
+
Replacements in documents that are already open in memory at the start of the replacement are guaranteed to
+happen synchronously; replacements in files on disk will return an error if the on-disk file changes between
+the time performReplacements() is called and the time the replacement actually happens.
+
Kind: global function
+Returns: $.Promise - A promise that's resolved when the replacement is finished or rejected with an array of errors
+if there were one or more errors. Each individual item in the array will be a {item: string, error: string} object,
+where item is the full path to the file that could not be updated, and error is either a FileSystem error or one
+of the FindUtils.ERROR_* constants.
+
Param
Type
Description
results
Object
The list of results to replace, as returned from _doSearch.
replaceText
string
The text to replace each result with.
options
Object
An options object:
[options.forceFilesOpen]
boolean
Whether to open all files in editors and do replacements there rather than doing the replacements on disk. Note that even if this is false, files that are already open in editors will have replacements done in memory.
[options.isRegexp]
boolean
Whether the original query was a regexp. If true, $-substitution is performed on the replaceText.
Parses the given query into a regexp, and returns whether it was valid or not.
+
Kind: global function
+Returns: Object - queryExpr - the regexp representing the query
+valid - set to true if query is a nonempty string or a valid regexp.
+empty - set to true if query was empty.
+error - set to an error string if valid is false and query is nonempty.
Plugin definition object containing the following properties: {string} name - Plug-in name, must be unique. {Array(string)} languageIds - Language Ids array. Example: ["javascript", "css", "html"]. To allow any language, pass []. Required. {function()} [done] - Called when quick open is complete. Plug-in should clear its internal state. Optional. {function(string, StringMatch.StringMatcher): (Array(SearchResult
Formats item's label as properly escaped HTML text, highlighting sections that match 'query'.
+If item is a SearchResult generated by stringMatch(), uses its metadata about which string ranges
+matched; else formats the label with no highlighting.
+
Kind: global function
+Returns: string - bolded, HTML-escaped result
Opens the Quick Open bar prepopulated with the given prefix (to select a mode) and optionally
+with the given query text too. Updates text field contents if Quick Open already open.
Given the current search text, returns an array of result objects, an error object, or a Promise that yields one of those. If the Promise is still outstanding when the query next changes, resultProvider() will be called again (without waiting for the earlier Promise), and the Promise's result will be ignored. If the provider yields [], or a non-null error string, input is decorated with ".no-results"; if the provider yields a null error string, input is not decorated.
options.formatter
function
Converts one result object to a string of HTML text. Passed the item and the current query. The outermost element must be "li". The ".highlight" class can be ignored as it is applied automatically.
options.onCommit
function
Called when an item is selected by clicking or pressing Enter. Passed the committed item and the current query and its index. If the current result list is not up to date with the query text at the time Enter is pressed, waits until it is before running this callback. If Enter pressed with no results, passed null. The popup remains open after this event.
options.onHighlight
function
Called when an item is highlighted in the list. Passed the item, the current query, and a flag that is true if the item was highlighted explicitly (arrow keys), not simply due to a results list update. Since the top item in the list is always initially highlighted, every time the list is updated onHighlight() is called with the top item and with the explicit flag set to false.
options.onDelete
function
Called when delete key is pressed on a selected item in the list. Passed the item.
options.onDismiss
function
Called when popup is dismissed with escape key press. Popup is not usable after this point.
options.maxResults
number
Maximum number of items from resultProvider() to display in the popup.
options.verticalAdjust
number
Number of pixels to position the popup below where $input is when constructor is called. Useful if UI is going to animate position after construction, but QuickSearchField may receive input before the animation is done.
options.$positionEl
jQueryObject
If provided, the popup will be positioned based on this.
options.firstHighlightIndex
number
Index of the result that is highlighted by default. null to not highlight any result.
options.focusLastActiveElementOnClose
boolean
If set to true, focuses the last active element on close. By default, the editor is always focused.
Refresh the results dropdown, as if the user had changed the search text. Useful for providers that
+want to show cached data initially, then update the results with fresher data once available.
Text field with attached dropdown list that is updated (based on a provider) whenever the text changes.
+
For styling, the DOM structure of the popup is as follows:
+body
+ol.quick-search-container
+li
+li.highlight
+li
+And the text field is:
+input
+input.no-results
Dispatches these events:
+change - whenever the results have been updated. Note that its up to people who
+edit the model to call fireChange() when necessary - it doesnt automatically fire.
+Kind: global class
Dispatches the following events:
+replaceBatch - when the Replace button is clicked.
+close - when the panel is closed.(model, panelID, panelName, type, [title])
+
Param
Type
Description
model
SearchModel
The model that this view is showing.
panelID
string
The CSS ID to use for the panel.
panelName
string
The name to use for the panel, as passed to WorkspaceManager.createBottomPanel().
type
string
type to identify if it is reference search or string match serach
Defines hooks to assist with module initialization.
+
This module defines 3 methods for client modules to attach callbacks:
+
+
htmlReady - When the main application template is rendered
+
extensionsLoaded - When the extension manager has loaded all extensions
+
appReady - When Brackets completes loading all modules and extensions
+
+
These are not jQuery events. Each method is similar to $(document).ready
+in that it will call the handler immediately if brackets is already done
+loading.
Creates a queue of async operations that will be executed sequentially. Operations can be added to the
+queue at any time. If the queue is empty and nothing is currently executing when an operation is added,
+it will execute immediately. Otherwise, it will execute when the last operation currently in the queue
+has finished.
Adds an operation to the queue. If nothing is currently executing, it will execute immediately (and
+the next operation added to the queue will wait for it to complete). Otherwise, it will wait until
+the last operation in the queue (or the currently executing operation if nothing is in the queue) is
+finished. The operation must return a promise that will be resolved or rejected when it's finished;
+the queue will continue with the next operation regardless of whether the current operation's promise
+is resolved or rejected.
Executes a series of tasks in parallel, returning a "master" Promise that is resolved once
+all the tasks have resolved. If one or more tasks fail, behavior depends on the failFast
+flag:
+
+
If true, the master Promise is rejected as soon as the first task fails. The remaining
+tasks continue to completion in the background.
+
If false, the master Promise is rejected after all tasks have completed.
+
+
If nothing fails: (M = master promise; 1-4 = tasks; d = done; F = fail)
+M ------------d
+1 >---d .
+2 >------d .
+3 >---------d .
+4 >------------d
With failFast = true: -- equivalent to $.when()
+M ---------F
+1 >---d .
+2 >------d .
+3 >---------F
+4 >------------d (#4 continues even though master Promise has failed)
+(Note: if tasks finish synchronously, the behavior is more like failFast=false because you
+won't get a chance to respond to the master Promise until after all items have been processed)
+
To perform task-specific work after an individual task completes, attach handlers to each
+Promise before beginProcessItem() returns it.
+
Note: don't use this if individual tasks (or their done/fail handlers) could ever show a user-
+visible dialog: because they run in parallel, you could show multiple dialogs atop each other.
Executes a series of tasks in serial (task N does not begin until task N-1 has completed).
+Returns a "master" Promise that is resolved once all the tasks have resolved. If one or more
+tasks fail, behavior depends on the failAndStopFast flag:
+
+
If true, the master Promise is rejected as soon as the first task fails. The remaining
+tasks are never started (the serial sequence is stopped).
+
If false, the master Promise is rejected after all tasks have completed.
Executes a series of synchronous tasks sequentially spread over time-slices less than maxBlockingTime.
+Processing yields by idleTime between time-slices.
Executes a series of tasks in serial (task N does not begin until task N-1 has completed).
+Returns a "master" Promise that is resolved when the first task has resolved. If all tasks
+fail, the master Promise is rejected.
Executes a series of tasks in parallel, saving up error info from any that fail along the way.
+Returns a Promise that is only resolved/rejected once all tasks are complete. This is
+essentially a wrapper around doInParallel(..., false).
+
If one or more tasks failed, the entire "master" promise is rejected at the end - with one
+argument: an array objects, one per failed task. Each error object contains:
+
+
item -- the entry in items whose task failed
+
error -- the first argument passed to the fail() handler when the task failed
Adds timeout-driven termination to a Promise: returns a new Promise that is resolved/rejected when
+the given original Promise is resolved/rejected, OR is resolved/rejected after the given delay -
+whichever happens first.
+
If the original Promise is resolved/rejected first, done()/fail() handlers receive arguments
+piped from the original Promise. If the timeout occurs first instead, then resolve() or
+fail() (with Async.ERROR_TIMEOUT) is called based on value of resolveTimeout.
+
Kind: global function
+
Param
Type
Description
promise
$.Promise
timeout
number
[resolveTimeout]
boolean
If true, then resolve deferred on timeout, otherwise reject. Default is false.
Allows waiting for all the promises to be either resolved or rejected.
+Unlike $.when(), it does not call .fail() or .always() handlers on first
+reject. The caller should take all the precaution to make sure all the
+promises passed to this function are completed to avoid blocking.
+
If failOnReject is set to true, promise returned by the function will be
+rejected if at least one of the promises was rejected. The default value
+is false, which will cause the call to this function to be always
+successfully resolved.
+
If timeout is specified, the promise will be rejected on timeout as per
+Async.withTimeout.
+
Kind: global function
+Returns: $.Promise - A Promise which will be resolved once all dependent promises are resolved.
+It is resolved with an array of results from the successfully resolved dependent promises.
+The resulting array may not be in the same order or contain as many items as there were
+promises to wait on and it will contain 'undefined' entries for those promises that resolve
+without a result.
+
Param
Type
Description
promises
Array.<$.Promise>
Array of promises to wait for
[failOnReject]
boolean
Whether to reject or not if one of the promises has been rejected.
[timeout]
number
Number of milliseconds to wait until rejecting the promise
Chains a series of synchronous and asynchronous (jQuery promise-returning) functions
+together, using the result of each successive function as the argument(s) to the next.
+A promise is returned that resolves with the result of the final call if all calls
+resolve or return normally. Otherwise, if any of the functions reject or throw, the
+computation is halted immediately and the promise is rejected with this halting error.
+
Kind: global function
+Returns: jQuery.Promise - A promise that resolves with the result of the final call, or
+rejects with the first error.
Utility for converting a method that takes (error, callback) to one that returns a promise;
+useful for using FileSystem methods (or other Node-style API methods) in a promise-oriented
+workflow. For example, instead of
+
var deferred =new $.Deferred(); file.read(function(err, contents){ if(err){ deferred.reject(err); }else{ // ...process the contents... deferred.resolve(); } } return deferred.promise();
The object/method are passed as an object/string pair so that we can
+properly call the method without the caller having to deal with "bind" all the time.
+
Kind: global function
+Returns: $.Promise - A promise that is resolved with the arguments that were passed to the
+errback (not including the err argument) if err is null, or rejected with the err if
+non-null.
+
Param
Type
Description
obj
Object
The object to call the method on.
method
string
The name of the method. The method should expect the errback as its last parameter.
...varargs
Object
The arguments you would have normally passed to the method (excluding the errback itself).
Sorted array of all the color names in the CSS Color Module Level 3 (http://www.w3.org/TR/css3-color/)
+and "rebeccapurple" from CSS Color Module Level 4
Regular expression that matches reasonably well-formed colors in hex format (3 or 6 digits),
+rgb()/rgba() function format, hsl()/hsla() function format, 0x notation format
+or color name format according to CSS Color Module Level 3 (http://www.w3.org/TR/css3-color/)
+or "rebeccapurple" from CSS Color Module Level 4.
Show deprecation warning with the call stack if it
+has never been displayed before.
+
Kind: global function
+
Param
Type
Description
message
string
The deprecation message to be displayed.
[oncePerCaller]
boolean
If true, displays the message once for each unique call location. If false (the default), only displays the message once no matter where it's called from. Note that setting this to true can cause a slight performance hit (because it has to generate a stack trace), so don't set this for functions that you expect to be called from performance- sensitive code (e.g. tight loops).
[callerStackPos]
number
Only used if oncePerCaller=true. Overrides the Error().stack depth where the client-code caller can be found. Only needed if extra shim layers are involved.
Attaches global drag & drop handlers to this window. This enables dropping files/folders to open them, and also
+protects the Brackets app from being replaced by the browser trying to load the dropped file in its place.
Implements a jQuery-like event dispatch pattern for non-DOM objects (works in web workers and phoenix node as well):
+
+
Listeners are attached via on()/one() & detached via off()
+
Listeners can use namespaces for easy removal
+
Listeners can attach to multiple events at once via a space-separated list
+
Events are fired via trigger()
+
The same listener can be attached twice, and will be called twice; but off() will detach all
+duplicate copies at once ('duplicate' means '===' equality - see http://jsfiddle.net/bf4p29g5/1/)
+
+
But it has some important differences from jQuery's non-DOM event mechanism:
+
+
More robust to listeners that throw exceptions (other listeners will still be called, and
+trigger() will still return control to its caller).
+
Events can be marked deprecated, causing on() to issue warnings
+
Easier to debug, since the dispatch code is much simpler
+
Faster, for the same reason
+
Uses less memory, since $(nonDOMObj).on() leaks memory in jQuery
+
API is simplified:
+
+
Event handlers do not have 'this' set to the event dispatcher object
+
Event object passed to handlers only has 'type' and 'target' fields
+
trigger() uses a simpler argument-list signature (like Promise APIs), rather than requiring
+an Array arg and ignoring additional args
+
trigger() does not support namespaces
+
For simplicity, on() does not accept a map of multiple events -> multiple handlers, nor a
+missing arg standing in for a bare 'return false' handler.
+
+
+
+
For now, Brackets uses a jQuery patch to ensure $(obj).on() and obj.on() (etc.) are identical
+for any obj that has the EventDispatcher pattern. In the future, this may be deprecated.
+
To add EventDispatcher methods to any object, call EventDispatcher.makeEventDispatcher(obj).
The EventDispatcher Object is available within the global context, be it phoenix or phoenix core web workers or node.
+Example
+
window.EventDispatcher.makeEventDispatcher(exports);// within phoenix require module self.EventDispatcher.makeEventDispatcher(object);// within web worker global.EventDispatcher.makeEventDispatcher(exports);// within node module that has an export
+
If you wish to import event dispatcher to your custom web worker, use the following
+Example
+
importScripts('<relative path from your extension>/utils/EventDispatcher'); // this will add the global EventDispatcher to your web-worker. Note that the EventDispatcher in the web worker // and node is a separate domain and cannot raise or listen to events in phoenix/other workers. For triggering events // between different domains like between node and phcode, see `nodeConnector.triggerPeer` or // `WorkerComm.triggerPeer` API for communication between phcode and web workers. self.EventDispatcher.trigger("someEvent");// within web worker
// in your extension js file. define(function(require, exports, module){ constEventDispatcher= brackets.getModule("utils/EventDispatcher"); EventDispatcher.makeEventDispatcher(exports);// This extension triggers some events leteventHandler=function(event, paramObject, paramVal){ console.log(event, paramObject, paramVal); }; exports.on("sampleEvent", eventHandler);// listen to our own event for demo exports.trigger("sampleEvent",{// trigger a sample event. This will activate the above listener 'on' function. param:1, param2:"sample" },"value"); // If needed, the event listener can be removed with `off`. But it is not a requirement at shutdown. exports.off("sampleEvent", eventHandler); }
By default, we consider any events having more than 15 listeners to be leaky. But sometimes there may be
+genuine use cases where an event can have a large number of listeners. For those events, it is recommended
+to increase the leaky warning threshold individually with this API.
Adds the given handler function to 'events': a space-separated list of one or more event names, each
+with an optional ".namespace" (used by off() - see below). If the handler is already listening to this
+event, a duplicate copy is added.
Removes one or more handler functions based on the space-separated 'events' list. Each item in
+'events' can be: bare event name, bare .namespace, or event.namespace pair. This yields a set of
+matching handlers. If 'fn' is omitted, all these handlers are removed. If 'fn' is provided,
+only handlers exactly equal to 'fn' are removed (there may still be >1, if duplicates were added).
Adds the EventDispatcher APIs to the given object: on(), one(), off(), and trigger(). May also be
+called on a prototype object - each instance will still behave independently.
Utility for calling on() with an array of arguments to pass to event handlers (rather than a varargs
+list). makeEventDispatcher() must have previously been called on 'dispatcher'.
Utility for attaching an event handler to an object that has not YET had makeEventDispatcher() called
+on it, but will in the future. Once 'futureDispatcher' becomes a real event dispatcher, any handlers
+attached here will be retained.
+
Useful with core modules that have circular dependencies (one module initially gets an empty copy of the
+other, with no on() API present yet). Unlike other strategies like waiting for htmlReady(), this helper
+guarantees you won't miss any future events, regardless of how soon the other module finishes init and
+starts calling trigger().
Mark a given event name as deprecated, such that on() will emit warnings when called with it.
+May be called before makeEventDispatcher(). May be called on a prototype where makeEventDispatcher()
+is called separately per instance (i.e. in the constructor). Should be called before clients have
+a chance to start calling on().
The global EventManager can be used to register named EventDispatchers so that events
+can be triggered from anywhere without using require context. This should also be used to handle custom
+window.onmessage handlers.
+
A global window.EventManager object is made available in phoenix that can be called anytime after AppStart.
For Eg. Let's say we have an extension drawImage installed that wants to expose custom functionality to phoenix.
+The Extension will first register named EventHandler like this:
+
Example
+
// in drawImage/someExtensionModule.js module within the extension, do the following: constEventDispatcher= brackets.getModule("utils/EventDispatcher"), EventManager= brackets.getModule("utils/EventManager"); EventDispatcher.makeEventDispatcher(exports); EventManager.registerEventHandler("drawImage-Handler", exports);
+
Once the event handler is registered, we can trigger events on the named handler anywhere in phoenix
+(inside or outside the extension) by using:
+Example
Registers a named EventHandler. Event handlers are created using the call:
+EventDispatcher.makeEventDispatcher(Command.prototype);
+
To register a close dialogue event handler in an extension:
+// in close-dialogue.js module winthin the extension, do the following:
+const EventDispatcher = brackets.getModule("utils/EventDispatcher"),
+EventDispatcher.makeEventDispatcher(exports);
+const EventManager = brackets.getModule("utils/EventManager");
+
// Note: for event handler names, please change the extensionName to your extension name
+// to prevent collisions. EventHandlers starting with ph- and br- are reserved as system handlers
+// and not available for use in extensions.
+EventManager.registerEventHandler("extensionName-closeDialogueHandler", exports);
+// Once the event handler is registered, see triggerEvent API on how to raise events
To trigger an event to the closeDialogue event handler registered above
+// anywhere in code, do the following:
+const EventManager = brackets.getModule("utils/EventManager");
+EventManager.triggerEvent("closeDialogueHandler", "someEvent", "param1", "param2", ...);
ExtensionInterface defines utility methods for communicating between extensions safely.
+A global window.ExtensionInterface object is made available in phoenix that can be called anytime after AppStart.
For Eg. You may have two extensions installed say angular extension which has to call functions made available by
+angular-cli Extension.
+
For Making this possible, the angular-cli extension makes a named interface available with the ExtensionInterface
+module and angular extension can get hold of the interface as and when the extension gets loaded.
+
Example
+
// in angular-cli extension, make a file say cli-interface.js module within the extension, do the following: constExtensionInterface= brackets.getModule("utils/ExtensionInterface"), // You can replace exports with any object you want to expose outside the extension really. ExtensionInterface.registerExtensionInterface("angularCli", exports);
+
Once the interface is registered, the angular extension can get hold of the interface with the following code
+(inside or outside the extension) by using:
+Example
+
let angularCli; ExtensionInterface.waitAndGetExtensionInterface("angularCli").then(interfaceObj=> angularCli = interfaceObj); if(angularCli){// check if angular cli is avilable angularCli.callSomeFunction(); }
+
Note that the angularCli interface is async populated as and when the cli extension is loaded and the
+interface made available.
+
NBB: Do Not use await waitAndGetExtensionInterface on tol level require as the module loading might fail.
Returns a promise that gets resolved only when an ExtensionInterface of the given name is registered. Use this
+getter to get hold of extensions interface predictably.
+
To get a registered interface angularCli
+
let angularCli; ExtensionInterface.waitAndGetExtensionInterface("angularCli").then(interfaceObj=> angularCli = interfaceObj); if(angularCli){// check if angular cli is avilable angularCli.callSomeFunction(); }
Returns the full path of the default user extensions directory. This is in the users
+application support directory, which is typically
+/Users/"user"/Application Support/Brackets/extensions/user on the mac, and
+C:\Users"user"\AppData\Roaming\Brackets\extensions\user on windows.
Returns the require.js require context used to load an extension
+
Kind: global function
+Returns: Object - A require.js require object used to load the extension, or undefined if
+there is no require object with that name
Loads the extension that lives at baseUrl into its own Require.js context
+
Kind: global function
+Returns: $.Promise - A promise object that is resolved when the extension is loaded, or rejected
+if the extension fails to load or throws an exception immediately when loaded.
+(Note: if extension contains a JS syntax error, promise is resolved not rejected).
+
Param
Type
Description
name
string
used to identify the extension
config
Object
object with baseUrl property containing absolute path of extension
Kind: global function
+Returns: $.Promise - A promise object that is resolved when all extensions complete loading.
+
Param
Type
Description
A
Array.<string>
list containing references to extension source location. A source location may be either (a) a folder name inside src/extensions or (b) an absolute path.
Parses LESS code and returns a promise that resolves with plain CSS code.
+
Pass the link url argument to resolve relative URLs contained in the code.
+Make sure URLs in the code are wrapped in quotes, like so:
+background-image: url("image.png");
+
Kind: global function
+Returns: $.Promise - A promise object that is resolved with CSS code if the LESS code can be parsed
Loads the package.json file in the given extension folder as well as any additional
+metadata for default extensions in the source directory.
+
If there's a .disabled file in the extension directory, then the content of package.json
+will be augmented with disabled property set to true. It will override whatever value of
+disabled might be set.
+
Kind: global function
+Returns: $.Promise - A promise object that is resolved with the parsed contents of the package.json file,
+or rejected if there is no package.json with the boolean indicating whether .disabled file exists.
+
Param
Type
Description
metadataURL
string
The extension folder/base url for default extensions.
FeatureGate defines util methods for enabling or disabling features in development based on a flag in local storage.
+A global window.FeatureGate object is made available in phoenix that can be called anytime after AppStart.
For Eg. You may have an extensions in development that colors phoenix in red. But you are working on a new feature
+that makes other colors available, but not yet ready for use. So put the extension behind a named feature gate
+so that only people who want to test the extension will be able to use it.
// within extensions constFeatureGate= brackets.getModule("utils/FeatureGate");// replace with `require` for core modules. constFEATURE_NEW_COLORS='myExtension.newColors'; FeatureGate.registerFeatureGate(FEATURE_NEW_COLORS,false);// false is the default value
Once the feature is registered, use the below code to check if the feature can be safely enabled. For Eg., if
+you want to enable fancy colors based on the example above:
+Example
+
if(FeatureGate.isFeatureEnabled(FEATURE_NEW_COLORS)){ // do fancy colors here }
Registers a named feature with the default enabled state.
+To register a feature gate with name myExtension.newColors
+const FEATURE_NEW_COLORS = 'myExtension.newColors';
+FeatureGate.registerFeatureGate(FEATURE_NEW_COLORS, false); // false is the default value here
Returns true is an featureGate is enabled either by default or overridden by the user using local storage.
+To check if the feature myExtension.newColors is enabled
+const FEATURE_NEW_COLORS = 'myExtension.newColors';
+if(FeatureGate.isFeatureEnabled(FEATURE_NEW_COLORS))
Checks if the current machine is configured to check for system-wide device license for all users at app start.
+This validates that the system-wide license file exists, contains valid JSON, and has licensedDevice: true.
+
Kind: global function
+Returns: Promise.<boolean> - - Resolves with true if the device is licensed, false otherwise.
Start a new named timer. The name should be as descriptive as possible, since
+this name will appear as an entry in the performance report.
+For example: "Open file: /Users/brackets/src/ProjectManager.js"
+
Multiple timers can be opened simultaneously.
+
Returns an opaque set of timer ids which can be stored and used for calling
+addMeasurement(). Since name is often creating via concatenating strings this
+return value allows clients to construct the name once.
+
Kind: global function
+Returns: Object | Array.<Object> - Opaque timer id or array of timer ids.
This function is similar to addMeasurement(), but it allows timing the
+last event, when you don't know which event will be the last one.
+
Tests that are in the activeTests list, have not yet been added, so add
+measurements to the performance data, and move test to updatableTests list.
+A test is moved to the updatable list so that it no longer passes isActive().
+
Tests that are already in the updatableTests list are updated.
+
Caller must explicitly remove test from the updatableTests list using
+finalizeMeasurement().
+
If markStart() was not called for the specified timer, there is no way to
+determine if this is the first or subsequent call, so the measurement is
+not updatable, and it is handled in addMeasurement().
Returns whether a timer is active or not, where "active" means that
+timer has been started with addMark(), but has not been added to perfdata
+with addMeasurement().
+
Kind: global function
+Returns: boolean - Whether a timer is active or not.
Adds resizing and (optionally) expand/collapse capabilities to a given html element. The element's size
+& visibility are automatically saved & restored as a view-state preference.
+
Resizing can be configured in two directions:
+
+
Vertical ("vert"): Resizes the height of the element
+
Horizontal ("horz"): Resizes the width of the element
+
+
Resizer handlers can be positioned on the element at:
+
+
Top ("top") or bottom ("bottom") for vertical resizing
+
Left ("left") or right ("right") for horizontal resizing
+
+
A resizable element triggers the following events while resizing:
+
+
panelResizeStart: When the resize starts. Passed the new size.
+
panelResizeUpdate: When the resize gets updated. Passed the new size.
+
panelResizeEnd: When the resize ends. Passed the final size.
+
panelCollapsed: When the panel gets collapsed (or hidden). Passed the last size
+before collapse. May occur without any resize events.
+
panelExpanded: When the panel gets expanded (or shown). Passed the initial size.
+May occur without any resize events.
+
+
Kind: global function
+
Param
Type
Description
element
DOMNode
DOM element which should be made resizable. Must have an id attribute, for use as a preferences key.
direction
string
Direction of the resize action: one of the DIRECTION_* constants.
position
string
Which side of the element can be dragged: one of the POSITION_* constants (TOP/BOTTOM for vertical resizing or LEFT/RIGHT for horizontal).
minSize
number
Minimum size (width or height) of the element's outer dimensions, including border & padding. Defaults to DEFAULT_MIN_SIZE.
collapsible
boolean
Indicates the panel is collapsible on double click on the resizer. Defaults to false.
forceLeft
string
CSS selector indicating element whose 'left' should be locked to the the resizable element's size (useful for siblings laid out to the right of the element). Must lie in element's parent's subtree.
createdByWorkspaceManager
boolean
For internal use only
usePercentages
boolean
Maintain the size of the element as a percentage of its parent the default is to maintain the size of the element in pixels
forceRight
string
CSS selector indicating element whose 'right' should be locked to the the resizable element's size (useful for siblings laid out to the left of the element). Must lie in element's parent's subtree.
_attachToParent
boolean
Attaches the resizer element to parent of the element rather than to element itself. Attach the resizer to the parent ONLY if element has the same offset as parent otherwise the resizer will be incorrectly positioned. FOR INTERNAL USE ONLY
[initialSize]
number
Optional Initial size of panel in px. If not given, panel will use minsize or current size.
Match str against the query using the QuickOpen algorithm provided by
+the functions above. The general idea is to prefer matches of "special" characters and,
+optionally, matches that occur in the "last segment" (generally, the filename). stringMatch
+will try to provide the best match and produces a "matchGoodness" score
+to allow for relative ranking.
+
The result object returned includes "stringRanges" which can be used to highlight
+the matched portions of the string, in addition to the "matchGoodness"
+mentioned above. If DEBUG_SCORES is true, scoreDebug is set on the result
+to provide insight into the score.
+
The matching is done in a case-insensitive manner.
+
Kind: global function
+Returns: Object - matched ranges and score
+
Param
Type
Description
str
string
The string to search
query
string
The query string to find in string
options
Object
to control search behavior. preferPrefixMatches puts an exact case-insensitive prefix match ahead of all other matches, even short-circuiting the match logic. This option implies segmentedSearch=false. When segmentedSearch is true, the string is broken into segments by "/" characters and the last segment is searched first and matches there are scored higher.
special
Object
(optional) the specials data from findSpecialCharacters, if already known This is generally just used by StringMatcher for optimization.
Sorts an array of SearchResult objects on a primary field, followed by secondary fields
+in case of ties. 'fieldSpec' provides the priority order for fields, where the first entry is the primary field, for example:
+multiFieldSort(bugList, [ "milestone", "severity" ]);
+Would sort a bug list by milestone, and within each milestone sort bugs by severity.
+
fieldSpec can also include comparator functions of the form normally used by the sort()
+function.
+
Any fields that have a string value are compared case-insensitively. Fields used should be
+present on all SearchResult objects (no optional/undefined fields).
Sorts search results generated by stringMatch(): results are sorted into several
+tiers based on how well they matched the search query, then sorted alphabetically
+within each tier.
Retrieves the matching code hints based on the given query and choices array.
+
Kind: global function
+Returns: Array.<string> - - An array of matching code hints.
+
Param
Type
Description
query
string
The search query to match against choices.
choices
Array.<string>
The list of possible code hints.
[options]
object
An optional object to specify additional search options.
options.limit
number
Maximum number of results to return
options.boostPrefixList
Array.<string>
Optional, Will rank matching items in the choices to top if query starts with the array. EG: on typing b, we have to show background-color to top. So we pass in ["background-color"] as boost prefix option along with other css properties that we want to boost.
A StringMatcher provides an interface to the stringMatch function with built-in
+caching. You should use a StringMatcher for the lifetime of queries over a
+single data set.
+
You are free to store other data on this object to assist in higher-level caching.
+(This object's caches are all stored in "_" prefixed properties.)
+
Kind: global function
+
Param
Type
Description
options
Object
to control search behavior. preferPrefixMatches puts an exact case-insensitive prefix match ahead of all other matches, even short-circuiting the match logic. This option implies segmentedSearch=false. segmentedSearch treats segments of the string specially.
Returns a line number corresponding to an offset in some text. The text can
+be specified as a single string or as an array of strings that correspond to
+the lines of the string.
+
Specify the text in lines when repeatedly calling the function on the same
+text in a loop. Use getLines() to divide the text into lines, then repeatedly call
+this function to compute a line number from the offset.
+
Kind: inner method of utils/StringUtils
+Returns: number - line number
+
Param
Type
Description
textOrLines
string | Array.<string>
string or array of lines from which to compute the line number from the offset
Functions for iterating through tokens in the current editor buffer. Useful for doing
+light parsing that can rely purely on information gathered by the code coloring mechanism.
Extracts a given binary zip data array to a specified location.
+
Kind: global function
+Returns: Promise - - A promise that resolves when extraction is complete.
+
Param
Type
Default
Description
zipData
UInt8Array
Binary zip data.
projectDir
string
Directory to extract to.
flattenFirstLevel
boolean
false
If set to true, then if zip contents are nested inside a directory, the nested directory will be removed in the path structure in the destination. For example, some zip may contain a contents folder inside the zip which has all the files. If we blindly extract the zip, all the contents will be placed inside a contents folder in the root instead of the root directory itself. See a sample zip file here: https://api.github.com/repos/StartBootstrap/startbootstrap-grayscales/zipball
[progressControlCallback]
function
A function that can be used to view the progress and stop further extraction. The function will be invoked with (doneCount, totalCount). The function should return false if further extraction needs to be stopped. If nothing or true is returned, it will continue extraction.
if set to true, then if zip contents are nested inside a directory, the nexted dir will be removed in the path structure in destination. For Eg. some Zip may contain a contents folder inside the zip which has all the contents. If we blindly extract the zio, all the contents will be placed inside a contents folder in root and not the root dir itself. See a sample zip file here: https://api.github.com/repos/StartBootstrap/startbootstrap-grayscales/zipball
The openFile method is used to open the file and construct
+a view of it. Implementation should add the view to the pane
+
functioncreateIconView(file, pane){ // IconView will construct its DOM and append // it to pane.$el var view =newIconView(file, pane.$el); // Then tell the pane to add it to // its view map and show it pane.addView(view,true); returnnew $.Deferred().resolve().promise(); }
+
Factories should only create 1 view of a file per pane. Brackets currently only supports 1 view of
+a file open at a given time but that may change to allow the same file open in more than 1 pane. Therefore
+Factories can do a simple check to see if a view already exists and show it before creating a new one:
+
var view = pane.getViewForPath(file.fullPath); if(view){ pane.showView(view); }else{ returncreateIconView(file, pane); }
MainViewManager manages the arrangement of all open panes as well as provides the controller
+logic behind all views in the MainView (e.g. ensuring that a file doesn't appear in 2 lists)
+
Each pane contains one or more views wich are created by a view factory and inserted into a pane list.
+There may be several panes managed by the MainViewManager with each pane containing a list of views.
+The panes are always visible and the layout is determined by the MainViewManager and the user.
+
Currently we support only 2 panes.
+
All of the WorkingSet APIs take a paneId Argument. This can be an actual pane Id, ALL_PANES (in most cases)
+or ACTIVE_PANE. ALL_PANES may not be supported for some APIs. See the API for details.
+
This module dispatches several events:
+
+
activePaneChange - When the active pane changes. There will always be an active pane.
+(e, newPaneId:string, oldPaneId:string)
+
currentFileChange -- When the user has switched to another pane, file, document. When the user closes a view
+and there are no other views to show the current file will be null.
+(e, newFile:File, newPaneId:string, oldFile:File, oldPaneId:string)
+
paneLayoutChange -- When Orientation changes.
+(e, orientation:string)
+
paneCreate -- When a pane is created
+(e, paneId:string)
+
paneDestroy -- When a pane is destroyed
+(e, paneId:string)
+
+
To listen for working set changes, you must listen to all of these events:
+
+
workingSetAdd -- When a file is added to the working set
+(e, fileAdded:File, index:number, paneId:string)
+
workingSetAddList -- When multiple files are added to the working set
+(e, fileAdded:Array."File", paneId:string)
+
workingSetMove - When a File has moved to a different working set
+(e, File:FILE, sourcePaneId:string, destinationPaneId:string)
+
workingSetRemove -- When a file is removed from the working set
+(e, fileRemoved:File, suppressRedraw:boolean, paneId:string)
+
workingSetRemoveList -- When multiple files are removed from the working set
+(e, filesRemoved:Array."File", paneId:string)
+
workingSetSort -- When a pane's view array is reordered without additions or removals.
+(e, paneId:string)
+
workingSetUpdate -- When changes happen due to system events such as a file being deleted.
+listeners should discard all working set info and rebuilt it from the pane
+by calling getWorkingSet()
+(e, paneId:string)
+
_workingSetDisableAutoSort -- When the working set is reordered by manually dragging a file.
+(e, paneId:string) For Internal Use Only.
+
+
To listen for events, do something like this: (see EventDispatcher for details on this pattern)
+MainViewManager.on("eventname", handler);
Special paneId shortcut that can be used to specify that
+all panes should be targeted by the API.
+Not all APIs support this constnant.
+Check the API documentation before use.
Retrieves the currently viewed file of the specified paneId
+
Kind: inner method of view/MainViewManager
+Returns: File - File object of the currently viewed file, or null if there isn't one or there's no such pane
+
Param
Type
Description
paneId
string
the id of the pane in which to retrieve the currently viewed file
Restores the scroll state from cache and applies the heightDelta
+The view implementation is responsible for applying or ignoring the heightDelta.
+This is used primarily when a modal bar opens to keep the editor from scrolling the current
+page out of view in order to maintain the appearance.
+The state is removed from the cache after calling this function.
Returns the pane IDs and editors (if present) of the given file in any open and viewable pane.
+If the same file is open in multiple panes, all matching panes will be returned.
+If not found in any panes, an empty array will be returned.
+
Kind: inner method of view/MainViewManager
+Returns: Object - An array of objects, each containing the pane ID and the corresponding editor, if present.
Adds the given file to the end of the workingset, if it is not already there.
+This API does not create a view of the file, it just adds it to the working set
+Views of files in the working set are persisted and are not destroyed until the user
+closes the file using FILE_CLOSE; Views are created using FILE_OPEN and, when opened, are
+made the current view. If a File is already opened then the file is just made current
+and its view is shown.
Kind: inner method of view/MainViewManager
+Returns: Object - The File object of the next item in the traversal order or null if there aren't any files to traverse.
+May return current file if there are no other files to traverse.
Kind: inner method of view/MainViewManager
+Returns: Object - The File object of the next item in the traversal order or null if there aren't any files to traverse.
+May return current file if there are no other files to traverse.
Pane objects host views of files, editors, etc... Clients cannot access
+Pane objects directly. Instead the implementation is protected by the
+MainViewManager -- however View Factories are given a Pane object which
+they can use to add views. References to Pane objects should not be kept
+as they may be destroyed and removed from the DOM.
+
To get a custom view, there are two components:
+
+
A View Factory
+
A View Object
+
+
View objects are anonymous object that have a particular interface.
+
Views can be added to a pane but do not have to exist in the Pane object's view list.
+Such views are "temporary views". Temporary views are not serialized with the Pane state
+or reconstituted when the pane is serialized from disk. They are destroyed at the earliest
+opportunity.
+
Temporary views are added by calling Pane.showView() and passing it the view object. The view
+will be destroyed when the next view is shown, the pane is mereged with another pane or the "Close All"
+command is exectuted on the Pane. Temporary Editor Views do not contain any modifications and are
+added to the workingset (and are no longer tempoary views) once the document has been modified. They
+will remain in the working set until closed from that point on.
+
Views that have a longer life span are added by calling addView to associate the view with a
+filename in the _views object. These views are not destroyed until they are removed from the pane
+by calling one of the following: removeView, removeViews, or _reset
+
Pane Object Events:
+
+
+
viewListChange - Whenever there is a file change to a file in the working set. These 2 events: DocumentManager.pathRemove
+and DocumentManager.fileNameChange will cause a viewListChange event so the WorkingSetView can update.
+
+
+
currentViewChange - Whenever the current view changes.
+(e, newView:View, oldView:View)
+
+
+
viewDestroy - Whenever a view has been destroyed
+(e, view:View)
+
+
+
View Interface:
+
The view is an anonymous object which has the following method signatures. see ImageViewer for an example or the sample
+provided with Brackets src/extensions/samples/BracketsConfigCentral
When views are created they can be added to the pane by calling pane.addView().
+Views can be created and parented by attaching directly to pane.$el
+
this._codeMirror = new CodeMirror(pane.$el, ...)
+
Factories can create a view that's initially hidden by calling pane.addView(view) and passing false for the show parameter.
+Hidden views can be later shown by calling pane.showView(view)
+
$el:jQuery!
+
property that stores the jQuery wrapped DOM element of the view. All views must have one so pane objects can manipulate the DOM
+element when necessary (e.g. showView, _reparent, etc...)
+
getFile():File!
+
Called throughout the life of a View when the current file is queried by the system.
+
updateLayout(forceRefresh:boolean)
+
Called to notify the view that it should be resized to fit its parent container. This may be called several times
+or only once. Views can ignore the forceRefresh flag. It is used for editor views to force a relayout of the editor
+which probably isn't necessary for most views. Views should implement their html to be dynamic and not rely on this
+function to be called whenever possible.
+
destroy()
+
Views must implement a destroy method to remove their DOM element at the very least. There is no default
+implementation and views are hidden before this method is called. The Pane object doesn't make assumptions
+about when it is safe to remove a node. In some instances other cleanup must take place before a the DOM
+node is destroyed so the implementation details are left to the view.
+
Views can implement a simple destroy by calling
+
this.$el.remove()
+
These members are optional and need not be implemented by Views
+
getScrollPos()
+adjustScrollPos()
+
The system at various times will want to save and restore a view's scroll position. The data returned by getScrollPos()
+is specific to the view and will be passed back to adjustScrollPos() when the scroll position needs to be restored.
+
When Modal Bars are invoked, the system calls getScrollPos() so that the current scroll psotion of all visible Views can be cached.
+That cached scroll position is later passed to adjustScrollPos() along with a height delta. The height delta is used to
+scroll the view so that it doesn't appear to have "jumped" when invoking the Modal Bar.
+
Height delta will be a positive when the Modal Bar is being shown and negative number when the Modal Bar is being hidden.
+
getViewState() is another optional member that is used to cache a view's state when hiding or destroying a view or closing the project.
+The data returned by this member is stored in ViewStateManager and is saved with the project.
+
Views or View Factories are responsible for restoring the view state when the view of that file is created by recalling the cached state
+
var view = createIconView(file, pane);
+view.restoreViewState(ViewStateManager.getViewState(file.fullPath));
+
Notifications
+The following optional methods receive notifications from the Pane object when certain events take place which affect the view:
+
notifyContainerChange()
+
Optional Notification callback called when the container changes. The view can perform any synchronization or state update
+it needs to do when its parent container changes.
+
notifyVisiblityChange()
+
Optional Notification callback called when the view's vsibility changes. The view can perform any synchronization or
+state update it needs to do when its visiblity state changes.
reorders the specified file in the view list to the desired position
+
Kind: instance method of Pane
+Returns: number - this function returns one of the following manifest constants:
+ITEM_NOT_FOUND : The request file object was not found
+ITEM_FOUND_NO_SORT : The request file object was found but it was already at the requested index
+ITEM_FOUND_NEEDS_SORT : The request file object was found and moved to a new index and the list should be resorted
+
Param
Type
Description
file
File
the file object of the item to reorder
[index]
number
the new position of the item
[force]
boolean
true to force the item into that position, false otherwise. (Requires an index be requested)
Adds the given file to the end of the workingset, if it is not already in the list
+Does not change which document is currently open in the editor. Completes synchronously.
+
Kind: instance method of Pane
+Returns: number - index of where the item was added
Traverses the list and returns the File object of the next item in the MRU order
+
Kind: instance method of Pane
+Returns: File - The File object of the next item in the travesal order or null if there isn't one.
+
Param
Type
Description
direction
number
Must be 1 or -1 to traverse forward or backward
[current]
string
the fullPath of the item where traversal is to start. If this parameter is omitted then the path of the current view is used. If the current view is a temporary view then the first item in the MRU list is returned
Swaps the current view with the requested view.
+If the interstitial page is shown, it is hidden.
+If the currentView is a temporary view, it is destroyed.
true to force a resize and refresh of the current view, false if just to resize forceRefresh is only used by Editor views to force a relayout of all editor DOM elements. Custom View implementations should just ignore this flag.
Kind: instance method of Pane
+Returns: boolean - true if the file was removed from the working set
+This function will remove a temporary view of a file but will return false in that case
+
Param
Type
Description
file
File
the file to close
suppressOpenNextFile
boolean
suppresses opening the next file in MRU order
preventViewChange
boolean
if suppressOpenNextFile is truthy, this flag can be used to prevent the current view from being destroyed. Ignored if suppressOpenNextFile is falsy
Removes the specifed file from all internal lists, destroys the view of the file (if there is one)
+and shows the interstitial page if the current view is destroyed.
+
Kind: instance method of Pane
+Returns: Array.<File> - Array of File objects removed from the working set.
+This function will remove temporary views but the file objects for those views will not be found
+in the result set. Only the file objects removed from the working set are returned.
Kind: instance method of Pane
+Returns: jQuery.Promise - A promise which resolves to {fullPath:string, paneId:string} which can be passed as command data to FILE_OPEN
Pixel threshold for detecting near-maximize state during resize.
+If the editor holder height is within this many pixels of zero, the
+panel is treated as maximized. Keeps the maximize icon responsive
+during drag without being overly sensitive.
Registers a call back function that will be called just before panel is shown. The handler should return true
+if the panel can be shown, else return false and the panel will not be shown.
+
Kind: instance method of Panel
+Returns: boolean - true if visible, false if not
+
Param
Type
Description
canShowHandlerFn
function | null
function that should return true of false if the panel can be shown/not. or null to clear the handler.
Registers an async handler that is called before the panel is closed via user interaction (e.g. clicking the
+tab close button). The handler should return true to allow the close, or false to prevent it.
Requests this panel's tab to close, invoking the registered
+onCloseRequested handler first (if any). If the handler returns false,
+the tab stays open. Otherwise, closeTab() is called.
+
Kind: instance method of Panel
+Returns: Promise.<boolean> - Resolves to true if the tab was closed, false if prevented.
Adds the panel to the tab bar and open set without showing the container.
+Use this during startup to restore a panel's tab when the container
+was collapsed by the user — avoids forcing the bottom panel open.
Hides this panel: removes its tab from the tab bar, and if this was
+the active tab, collapses the bottom panel container. The panel stays
+registered — call show() to bring it back.
+
For tab-bar UX where closing the active tab should switch to the next
+sibling tab (like clicking the X on a tab), use closeTab() instead.
+For permanent removal, use destroy().
Closes this tab: removes its tab from the tab bar. If this was the
+active tab, switches to the next sibling tab; if no other tab is open,
+collapses the bottom panel container instead. The panel stays
+registered — call show() to bring it back.
+
For a programmatic hide that always collapses (no auto-switch to a
+sibling tab), use hide(). For permanent removal, use destroy().
Enter maximize state during a drag-resize that reaches the maximum
+height. No pre-maximize height is stored because the user arrived
+here via continuous dragging; a sensible default will be computed if
+they later click the Restore button.
Restore the container's CSS height to the pre-maximize value and clear maximize state.
+Must be called BEFORE Resizer.hide() so the Resizer reads the correct height.
+If not maximized, this is a no-op.
+When the saved height is near-max or unknown, a sensible default is used.
Collapse the bottom panel container (transient hide) without touching
+which panel is logically active. Fires EVENT_PANEL_HIDDEN with the
+default panel id as a "container collapsed" signal so toolbar icons
+and menu items that mirror container visibility deselect.
+No-op if the container is already hidden.
Re-show the bottom panel container after a previous collapse, with the
+previously active panel still mounted. Fires EVENT_PANEL_SHOWN for the
+active panel id so toolbar icons / menu items that mirror visibility
+re-select. No-op if the container is already visible or there's no
+active panel to restore.
new Panel($panel, id, $toolbarIcon, [minWidth], [initialSize])
+
Represents a panel below the editor area (a child of ".content").
+
Param
Type
Description
$panel
jQueryObject
The entire panel, including any chrome, already in the DOM.
id
string
Unique id for this panel. Use package-style naming, e.g. "myextension.panelname". will overwrite an existing panel id if present.
$toolbarIcon
jQueryObject
An icon that should be present in main-toolbar to associate this panel to. The panel will be shown only if the icon is visible on the toolbar and the user clicks on the icon.
[minWidth]
number
Minimum width of panel in px.
[initialSize]
number
Optional Initial size of panel in px. If not given, panel will use minsize or current size.
Registers a call back function that will be called just before panel is shown. The handler should return true
+if the panel can be shown, else return false and the panel will not be shown.
+
Kind: instance method of Panel
+Returns: boolean - true if visible, false if not
+
Param
Type
Description
canShowHandlerFn
function | null
function that should return true of false if the panel can be shown/not. or null to clear the handler.
Registers an async handler that is called before the panel is closed via user interaction.
+The handler should return true to allow the close, or false to prevent it.
Requests the panel to hide, invoking the registered onCloseRequested handler first (if any).
+If the handler returns false, the panel stays open. If it returns true or no handler is
+registered, hide() is called.
+
Kind: instance method of Panel
+Returns: Promise.<boolean> - Resolves to true if the panel was hidden, false if prevented.
SidebarTabs manages multiple tab panes within the sidebar. It inserts a
+#navTabBar element after #mainNavBar and provides an API for registering
+tabs, associating DOM content with tabs, and switching between them.
+
Existing sidebar children that are not explicitly associated with a tab via
+addToTab are treated as belonging to the default "Files" tab. This means
+extensions that add DOM nodes to the sidebar will continue to work without
+any code changes.
+
Tab switching works purely by toggling the .sidebar-tab-hidden CSS class
+(display: none !important). No DOM reparenting or detaching occurs, so
+cached jQuery/DOM references held by extensions remain valid.
Associate a DOM node (or jQuery element) with a tab. If the node is not
+already a child of #sidebar, it is appended. If the tab is not the
+currently active tab, the node is immediately hidden.
Remove a DOM node's association with a tab. If the node was appended by
+addToTab (was not originally in the sidebar) and is no longer
+associated with any tab, it is also removed from the DOM.
Tiny shared HTML5 <video> widget. Two entry points:
+
createPlayer(options) — returns a configured <video> wrapper the
+caller can drop anywhere in their UI.
+
renderFullScreenPlayer(srcElement, options) — opens a viewport-
+covering overlay with a large auto-playing player that
+expands out of srcElement (genie-style) and contracts back
+on close. Useful when an inline thumbnail should expand into
+a focused fullscreen view on click.
Open a viewport-covering overlay with a large autoplaying video that
+expands out of srcElement (Mac-dock-genie style) and contracts
+back to it on close. Click on the dimmed backdrop, the close (×)
+button, or pressing Escape closes the overlay.
+
Defaults: muted, autoplay, controls, preload="auto" (so the bytes
+stream while the open animation runs and the user can hit play
+straight away). Override via options.
+
Kind: global function
+Returns: Object - Handle exposing a programmatic close.
+
Param
Type
Description
srcElement
HTMLElement | jQuery
Element the lightbox should expand from / contract back to. Used only for the source rect; not modified.
options
Object
See createPlayer's options; additionally honours all the same player flags. src required.
The ViewCommandHandlers object dispatches the following event(s):
+
+
fontSizeChange -- Triggered when the font size is changed via the
+Increase Font Size, Decrease Font Size, or Restore Font Size commands.
+The 2nd arg to the listener is the amount of the change. The 3rd arg
+is a string containing the new font size after applying the change.
ViewStateManager is a singleton for views to park their global viwe state. The state is saved
+with project data but the View or View Factory is responsible for restoring the view state
+when the view is created.
+
Views should implement getViewState() so that the view state can be saved and that data is cached
+for later use.
+
Views or View Factories are responsible for restoring the view state when the view of that file is created
+by recalling the cached state. Views determine what data is store in the view state and how to restore it.
Manages layout of panels surrounding the editor area, and size of the editor area (but not its contents).
+
Updates panel sizes when the window is resized. Maintains the max resizing limits for panels, based on
+currently available window size.
+
Events:
+workspaceUpdateLayout When workspace size changes for any reason (including panel show/hide panel resize, or the window resize).
+The 2nd arg is the available workspace height.
+The 3rd arg is a refreshHint flag for internal use (passed in to recomputeLayout)
Creates a new resizable panel beneath the editor area and above the status bar footer. Panel is initially invisible.
+The panel's size & visibility are automatically saved & restored as a view-state preference.
Unique id for this panel. Use package-style naming, e.g. "myextension.feature.panelname"
$panel
jQueryObject
DOM content to use as the panel. Need not be in the document yet. Must have an id attribute, for use as a preferences key.
[minSize]
number
@deprecated No longer used. Pass undefined.
[title]
string
Display title shown in the bottom panel tab bar.
[options]
Object
Optional settings: - iconSvg (string): Path to an SVG icon for the panel tab (e.g. "styles/images/icon.svg"). If omitted, a generic default icon is used.
Destroys a bottom panel, removing it from internal registries, the tab bar, and the DOM.
+After calling this, the panel ID is no longer valid and the Panel instance should not be reused.
Creates a new resizable plugin panel associated with the given toolbar icon. Panel is initially invisible.
+The panel's size & visibility are automatically saved & restored. Only one panel can be associated with a
+toolbar icon.
Unique id for this panel. Use package-style naming, e.g. "myextension.panelname". will overwrite an existing panel id if present.
$panel
jQueryObject
DOM content to use as the panel. Need not be in the document yet. Must have an id attribute, for use as a preferences key.
[minSize]
number
Minimum height of panel in px.
$toolbarIcon
jQueryObject
An icon that should be present in main-toolbar to associate this panel to. The panel will be shown only if the icon is visible on the toolbar and the user clicks on the icon.
[initialSize]
number
Optional Initial size of panel in px. If not given, panel will use minsize or current size.
Programmatically sets the plugin panel content width to the given value in pixels.
+The total toolbar width is adjusted to account for the plugin icons bar.
+If the requested width doesn't fit, the sidebar is progressively shrunk
+(and collapsed if necessary) before clamping.
+No-op if no panel is currently visible.
Sets the design-mode flag and fires EVENT_WORKSPACE_DESIGN_MODE_CHANGE when
+the value actually changes. Intended to be called by the control bar; other
+callers should use the dedicated toggle command instead.
If any widgets related to the editor needs to handle the escape key event, add it here. returning true from the
+registered handler will prevent primary escape key toggle panel behavior of phoenix. Note that returning true
+will no stop the event bubbling, that has to be controlled with the event parameter forwarded to the handler.
Creates a new modal dialog from a given template.
+The template can either be a string or a jQuery object representing a DOM node that is not in the current DOM.
+
Kind: global function
+
Param
Type
Description
template
string
A string template or jQuery object to use as the dialog HTML.
[autoDismiss]
boolean
Whether to automatically dismiss the dialog when one of the buttons is clicked. Default true. If false, you'll need to manually handle button clicks and the Esc key, and dismiss the dialog yourself when ready by calling close() on the returned dialog.
[closeToElement]
string
A CSS selector for a target element. If specified, the dialog will animate open from and close toward the target element (a "woosh" effect). If the target is not found or not visible, the dialog opens/closes normally.
Creates a new general purpose modal dialog using the default template and the template variables given
+as parameters as described.
+
Kind: global function
+
Param
Type
Description
dlgClass
string
A class name identifier for the dialog. Typically one of DefaultDialogs.*
[title]
string
The title of the dialog. Can contain HTML markup. Defaults to "".
[message]
string
The message to display in the dialog. Can contain HTML markup. Defaults to "".
buttons
Array.<Object>
An array of buttons where each button has a class, id tooltip, and text property. The id is used in "data-button-id". Defaults to a single Ok button. Typically className is one of DIALOG_BTN_CLASS_, id is one of DIALOG_BTN_
[autoDismiss]
boolean
Whether to automatically dismiss the dialog when one of the buttons is clicked. Default true. If false, you'll need to manually handle button clicks and the Esc key, and dismiss the dialog yourself when ready by calling close() on the returned dialog.
Immediately closes any dialog instances with the given class. The dialog callback for each instance will
+be called with the special buttonId DIALOG_CANCELED (note: callback is run asynchronously).
+
Kind: global function
+
Param
Type
Description
dlgClass
string
The class name identifier for the dialog.
[buttonId]
string
The button id to use when closing the dialog. Defaults to DIALOG_CANCELED
Creates a single dropdown-button instance. The DOM node is created but not attached to
+the document anywhere - clients should append this.$button to the appropriate location.
+
DropdownButton dispatches the following events:
+
+
"select" - triggered when an option in the dropdown is clicked. Passed item object and index.
+
+
Kind: global function
+
Param
Type
Default
Description
label
string
The label to display on the button.
items
Array.<*>
Items in the dropdown list. Items can have any type/value. An item with the value "---" will be treated as a divider, which is not clickable, and itemRenderer() will not be called for it.
[itemRenderer]
function
Optional function to convert a single item to HTML. If not provided, items are assumed to be plain text strings. The function receives the item and its index.
[options]
Object
Additional options for the dropdown.
[options.enableFilter]
boolean
false
Set to true to enable filtering by typing.
[options.cssClasses]
string
A space-separated list of CSS classes to apply to the button.
[options.customFilter]
function
Optional. When enableFilter is enabled, this function is used as a custom filtering callback. It receives the user's search text, the text of the element being filtered, and the element's index. Return true to display the list item, or false to hide it.
This is filter text corresponding to each items. it will be used to filter the items based on
+the keyboard key presses the user does to enter search filter in popup.
Kind: instance method of DropdownButton
+Returns: string | Object - Formatted & escaped HTML, either as a simple string
+or as the 'html' field in an object that also conveys enabled state. Disabled items inherit gray
+text color and cannot be selected.
Creates a modal bar whose contents are the given template.
+
Dispatches one event:
+
+
close - When the bar is closed, either via close() or via autoClose. After this event, the
+bar may remain visible and in the DOM while its closing animation is playing. However,
+by the time "close" is fired, the bar has been "popped out" of the layout and the
+editor scroll position has already been restored.
+Second argument is the reason for closing (one of ModalBar.CLOSE_*).
+Third argument is the Promise that close() will be returning.
+
+
Param
Type
Description
template
string
The HTML contents of the modal bar.
autoClose
boolean
If true, then close the dialog if the user hits Esc or if the bar loses focus.
animate
boolean
If true (the default), animate the dialog closed, otherwise close it immediately.
Allows client code to block autoClose from closing the ModalBar: if set, this function is called whenever
+autoClose would normally close the ModalBar. Returning true prevents the close from occurring. Programmatically
+calling close() will still close the bar, however.
Prepares the ModalBar for closing by popping it out of the main flow and resizing/
+rescrolling the Editor to maintain its current apparent code position. Useful if
+you want to do that as a separate operation from actually animating the ModalBar
+closed and removing it (for example, if you need to switch full editors in between).
+If you don't call this explicitly, it will get called at the beginning of close().
If true (the default), adjust the scroll position of the editor to account for the ModalBar disappearing. If not set, the caller should do it immediately on return of this function (before the animation completes), because the editor will already have been resized.
Closes the modal bar and returns focus to the active editor. Returns a promise that is
+resolved when the bar is fully closed and the container is removed from the DOM.
+
Kind: instance method of ModalBar
+Returns: $.Promise - promise resolved when close is finished
+
Param
Type
Description
[restoreScrollPos]
boolean
If true (the default), adjust the scroll position of the editor to account for the ModalBar disappearing. If not set, the caller should do it immediately on return of this function (before the animation completes), because the editor will already have been resized. Note that this is ignored if prepareClose() was already called (you need to pass the parameter to that function if you call it first).
[animate]
boolean
If true (the default), animate the closing of the ModalBar, otherwise close it immediately.
A "modal bar" component. This is a lightweight replacement for modal dialogs that
+appears at the top of the editor area for operations like Find and Quick Open.
The global NotificationUI can be used to create popup notifications over dom elements or generics app notifications.
+
A global window.EventManager object is made available in phoenix that can be called anytime after AppStart.
+This global can be triggered from anywhere without using require context.
For Eg. Let's say we have to create a popup notification over the HTML element with ID showInfileTree.
+We can do this with the following
+
Example
+
constNotificationUI= brackets.getModule("widgets/NotificationUI"); // or use window.NotificationUI global object has the same effect. let notification =NotificationUI.createFromTemplate("Click me to locate the file in file tree","showInfileTree",{}); notification.done(()=>{ console.log("notification is closed in ui."); })
Another advanced example where you can specify html and interactive components in the notification
+Example
+
// note that you can even provide an HTML Element node with // custom event handlers directly here instead of HTML text. let notification1 =NotificationUI.createFromTemplate( "<div>Click me to locate the file in file tree</div>","showInfileTree",{ allowedPlacements:['top','bottom'], dismissOnClick:false, autoCloseTimeS:300// auto close the popup after 5 minutes }); // do stuff notification1.done((closeReason)=>{ console.log("notification is closed in ui reason:", closeReason); })
+
The createFromTemplate API can be configured with numerous options. See API options below.
Creates a new notification popup from given template.
+The template can either be a string or a jQuery object representing a DOM node that is not in the current DOM.
+
Creating a notification popup
+
// note that you can even provide an HTML Element node with // custom event handlers directly here instead of HTML text. let notification1 =NotificationUI.createFromTemplate( "<div>Click me to locate the file in file tree</div>","showInfileTree",{ allowedPlacements:['top','bottom'], dismissOnClick:false, autoCloseTimeS:300// auto close the popup after 5 minutes });
+
Kind: inner method of widgets/NotificationUI
+Returns: Notification - Object with a done handler that resolves when the notification closes.
+
Param
Type
Description
title
string
The title for the notification.
template
string | Element
A string template or HTML Element to use as the dialog HTML.
[elementID]
String
optional id string if provided will show the notification pointing to the element. If no element is specified, it will be managed as a generic notification.
[options]
Object
optional, supported * options are: * allowedPlacements - Optional String array with values restricting where the notification will be shown. Values can be a mix of ['top', 'bottom', 'left', 'right'] * autoCloseTimeS - Time in seconds after which the notification should be auto closed. Default is never. * dismissOnClick - when clicked, the notification is closed. Default is true(dismiss). * toastStyle - To style the toast notification for error, warning, info etc. Can be one of NotificationUI.NOTIFICATION_STYLES_CSS_CLASS.* or your own css class name.
Creates a new toast notification popup from given title and html message.
+The message can either be a string or a jQuery object representing a DOM node that is not in the current DOM.
+
Creating a toast notification popup
+
// note that you can even provide an HTML Element node with // custom event handlers directly here instead of HTML text. let notification1 =NotificationUI.createToastFromTemplate("Title here", "<div>Click me to locate the file in file tree</div>",{ dismissOnClick:false, autoCloseTimeS:300// auto close the popup after 5 minutes });
+
Kind: inner method of widgets/NotificationUI
+Returns: Notification - Object with a done handler that resolves when the notification closes.
+
Param
Type
Description
title
string
The title for the notification.
template
string | Element
A string template or HTML Element to use as the dialog HTML.
[options]
Object
optional, supported * options are: * autoCloseTimeS - Time in seconds after which the notification should be auto closed. Default is never. * dismissOnClick - when clicked, the notification is closed. Default is true(dismiss). * toastStyle - To style the toast notification for error, warning, info etc. Can be one of NotificationUI.NOTIFICATION_STYLES_CSS_CLASS.* or your own css class name. * instantOpen - To instantly open the popup without any open animation delays
Shows a small, transient inline toast notification inside a given DOM container.
+The toast is centered at the bottom of the container and auto-dismisses.
Kind: inner method of widgets/NotificationUI
+Returns: Notification - Object with a done handler that resolves when the toast closes.
+
Param
Type
Description
containerOrSelector
Element | string
A DOM element or CSS selector for the parent container. The container should have position: relative or absolute so the toast is positioned correctly.
template
string | Element
HTML string or DOM Element for the toast content.
[options]
Object
optional, supported options: * autoCloseTimeS - Time in seconds after which the toast auto-closes. Default is 5. * dismissOnClick - If true, clicking the toast dismisses it. Default is true.
Shows a large, centered HUD overlay (like macOS volume/brightness indicator) with an icon and label.
+The HUD fades in/out and auto-dismisses. Only one HUD is shown at a time — calling this while a
+previous HUD is visible replaces it instantly.
Pop-up specific remove (e.g. display:none or DOM removal)
autoRemove
Boolean
Specify true to indicate the PopUpManager should remove the popup from the _popUps array when the popup is closed. Specify false when the popup is always persistant in the _popUps array.
options
object
[options.popupManagesFocus]
boolean
set to true if the popup manages focus restore on close
[options.closeCurrentPopups]
boolean
set to true if you want to dismiss all exiting popups before adding this. Useful when this should be the only popup visible.
Context menus are also created in AppInit.htmlReady(), so they may not
+yet have been created when we get our AppInit.htmlReady() callback, so
+we provide this method to tell us when to start listening for their events
A status bar with support for file information and busy and status indicators. This is a semi-generic
+container; for the code that decides what content appears in the status bar, see client modules like
+EditorStatusBar. (Although in practice StatusBar's HTML structure and initialization
+assume it's only used for this one purpose, and all the APIs are on a singleton).
Phoenix houses a file indexing worker which caches all cacheable files of a project in memory.
+This module can be used to communicate with the Index and extend it by attaching new js worker scripts to the
+indexing worker as discussed below. Any extension that works on a large number of files should use the indexing
+worker cache to free up the main thread of heavy file access.
+
+
Extensions performing large compute tasks should create their own worker and may use easy util methods in
+worker/WorkerComm to communicate with the web worker.
You can add your own custom scripts to the indexing worker by following the below example. Suppose you have an
+extension folder with the following structure:
+
myExtensionFolder │ my_worker.js // the script that you need to attach to the web worker │ main.js
+
In main.js extension module, we can import my_worker.js script into IndexingWorker by:
+
Example
+
letExtensionUtils= brackets.getModule("utils/ExtensionUtils"); let workerPath =ExtensionUtils.getModulePath(module,"my_worker.js") IndexingWorker.loadScriptInWorker(workerPath);
+
Once the worker script is loaded with the above step:
+
+
Phoenix can communicate with worker using the IndexingWorker reference in Phoenix.
+
Worker can communicate with Phoenix with the global WorkerComm reference within the Indexing worker.
+All utility methods in module worker/WorkerComm can be used for worker communication.
+
+
A global constant Phoenix.baseURL is available in the worker context to get the base url from which phoenix was
+launched.
+
NB: You can use all util methods available in worker/WorkerComm as IndexingWorker internally uses WorkerComm
+to communicate with the underlying worker thread.
To communicate between the IndexingWorker and Phoenix, the following methods are available:
+loadScriptInWorker, execPeer, setExecHandler, triggerPeer and other APIs described
+in module worker/WorkerComm.
+The above methods can be used with either IndexingWorker reference within Phoenix
+or the global WorkerComm reference within the Indexing worker. (See example below.)
// To Execute a named function `extensionName.sayHello` in the worker from phoenix // in my_worker.js. It is a good practice to prefix your `[extensionName]` // to exec handler to prevent name collisions with other extensions. WorkerComm.setExecHandler("extensionName.sayHello",(arg)=>{ console.log("hello from worker ", arg);// prints "hello from worker phoenix" return"Hello Phoenix"; }); // In Phoenix/extension let workerMessage =awaitIndexingWorker.execPeer("extensionName.sayHello","phoenix"); console.log(workerMessage);// prints "Hello Phoenix"
WorkerComm provides util methods to communicate between web workers and Phoenix.
+This module can be loaded from within web-workers and a phoenix extension that loads the web-worker.
+
Creating a WebWorker from your extension and attaching WorkerComm to it.
+
See an example extension code below that creates its own web worker and uses WorkerComm for communication.
+
Example
+
// from within an extension constWorkerComm= brackets.getModule("worker/WorkerComm"), EventDispatcher= brackets.getModule("utils/EventDispatcher"), ExtensionUtils= brackets.getModule("utils/ExtensionUtils"); // figure out the path of the web worker relative to your extension let workerPath =ExtensionUtils.getModulePath(module,"my_worker_path_within_extension.js") // we need to pass in the `workerCommUrl` so that the web-worker can // load`WorkerComm` within the worker context as described below. let workerCommUrl =`${Phoenix.baseURL}worker/WorkerComm.js`; let eventDispatcherURL =`${Phoenix.baseURL}utils/EventDispatcher.js`; // load the worker const _myWorker =newWorker( `${workerPath}?workerCommUrl=${workerCommUrl}&eventDispatcherURL=${eventDispatcherURL}`); // Not create a `WorkerComm` object and attach to your extension module exports. EventDispatcher.makeEventDispatcher(exports); // all WorkerComm objects needs to be an EventDispatcher. WorkerComm.createWorkerComm(_myWorker, exports); // Now `exports` can be used to communicate with the web-worker // using `WorkerComm` APIs listed below.
The Web Worker we created above also needs to load WorkerComm to be able to communicate with the WorkerComm
+instance in Phoenix. For this, we need to load WorkerComm from the URL parameters.
+(WorkerComm.js lib url needs to passed in while creating the web worker from Phoenix).
+Example
+
const urlParams =newURLSearchParams(location.search); importScripts(urlParams.get('workerCommUrl')); importScripts(urlParams.get('eventDispatcherURL')); // After this, a global `WorkerComm` object will be available within the // web-worker that can be used to communicate with Phoenix.
Adds support for WorkerComm APIs to the provided web-Worker instance. Only available in the main thread.
+This API should be called immediately after creating the worker in main thread.
+Create a web-worker with WorkerComm in an extension.
+// load the worker [See API docs for full sample]
+const _myWorker = new Worker(
+${workerPath}?workerCommUrl=${workerCommUrl}&eventDispatcherURL=${eventDispatcherURL});
+
// Now create a WorkerComm object and attach to your extension module exports.
+EventDispatcher.makeEventDispatcher(exports);
+// all WorkerComm objects needs to be an EventDispatcher.
+WorkerComm.createWorkerComm(_myWorker, exports);
Import the required modules.
+Import the Dialogs and DefaultDialogs modules along with other necessary modules:
+
+
constDefaultDialogs= brackets.getModule("widgets/DefaultDialogs"), Dialogs= brackets.getModule("widgets/Dialogs"); // other modules you may require constAppInit= brackets.getModule("utils/AppInit"), CommandManager= brackets.getModule("command/CommandManager"), Menus= brackets.getModule("command/Menus");
+
+
+
Create a function to show the dialog
+
To create a dialog you can use the specialized dialog APIs such as Dialogs.showConfirmDialog, Dialogs.showInfoDialog and Dialogs.showErrorDialog provided by the Dialogs module:
+
+
+
functionhandleHelloWorld(){ Dialogs.showInfoDialog( "hello",// Title "world"// Message ); }
+
The Dialogs.showInfoDialog() method is the preferred way to display information messages.
+
Similarly, you can use Dialogs.showErrorDialog() for error messages:
+
functionhandleError(){ Dialogs.showErrorDialog( "Error", "Something went wrong!" ); }
+
You can also close the dialog programmatically using the Dialog.close() method.
+
functionhandleHelloWorld(){ const dialog =Dialogs.showInfoDialog( "hello", "world" ); // Close the dialog after 2 seconds setTimeout(()=>{ dialog.close(); },2000); }
+
This will automatically close the dialog after 2 seconds.
+
These specialized dialog methods handle the common use cases.
While the specialized dialog methods like showInfoDialog(), showConfirmDialog() and showErrorDialog() cover the common use cases, you can also create more complex custom dialog boxes using showModalDialog(). Here's how:
+
const dialog =Dialogs.showModalDialog( DefaultDialogs.DIALOG_ID_INFO, "Custom Dialog", // Custom HTML content with CSS styling '<div class="custom-dialog">'+ '<p style="text-align: center">This is a custom message</p>'+ '<input style="width: 97%" type="text" id="custom-input" placeholder="Enter some text...">'+ "</div>", [ // For buttons { className:Dialogs.DIALOG_BTN_CLASS_PRIMARY, id:Dialogs.DIALOG_BTN_OK, text:"OK", }, { className:Dialogs.DIALOG_BTN_CLASS_NORMAL, id:Dialogs.DIALOG_BTN_CANCEL, text:"Cancel", }, ] );
+
The showModalDialog() method provides more flexibility, allowing you to create custom dialog boxes with HTML content and buttons. However, it's recommended to use the specialized dialog APIs like showInfoDialog(), showConfirmDialog() and showErrorDialog() whenever possible, as they provide a simpler and more standardized interface for the most common dialog types.
Import the Menus module.
+To use the menu functionality, import the Menus module:
+
constMenus= brackets.getModule("command/Menus");
+
+
+
Create the menu.
+
Use Menus.addMenu() to add a menu to the menu bar. Provide the display name and the identifier. The identifier must be written insnake_case.
+
+
+
Providing the identifier is necessary to display the menu on the menu bar. This identifier may later be used to add menu items inside it or even remove the menu if needed.
+
+
// Add a menu to the menu bar const menu =Menus.addMenu('Test','Test_Extension_Docs');
define(function(require, exports, module){ "use strict"; // Brackets modules constAppInit= brackets.getModule("utils/AppInit"), Menus= brackets.getModule("command/Menus"); // Add a menu to the menu bar const menu =Menus.addMenu('Test','Test_Extension_Docs'); // Initialize extension once shell is finished initializing. AppInit.appReady(function(){ console.log("hello world"); }); });
Use CommandManager.register() to associate an ID with a function:
+
functionhandleTestExtension(){ alert("Test menu item"); } // The `CommandID` must be written in snake_case constMY_COMMAND_ID="test_menuitem"; CommandManager.register("Test",MY_COMMAND_ID, handleTestExtension);
+
+
The first argument is the label for the menu item.
+
The second argument is a unique command ID.
+
The third argument is the handler function to execute when the item is clicked.
+
+
+
+
Add the Menu Item
+To add the menu item, use menu.addMenuItem(). For instance, if you wish to add an item to the File menu, you can write:
+
const menu =Menus.getMenu(Menus.AppMenuBar.FILE_MENU); menu.addMenuItem(MY_COMMAND_ID);
+
+
+
+
These are some of the menus available by default :-
+
+
+
FILE_MENU : ‘file-menu’
+
EDIT_MENU : ‘edit-menu’
+
FIND_MENU : ‘find-menu’
+
VIEW_MENU : ‘view-menu’
+
NAVIGATE_MENU : ‘navigate-menu’
+
+
You can also add menu items to any custom menus you create.
define(function(require, exports, module){ "use strict"; // Brackets modules constAppInit= brackets.getModule("utils/AppInit"), CommandManager= brackets.getModule("command/CommandManager"), Menus= brackets.getModule("command/Menus"); // Function to run when the menu item is clicked functionhandleTestExtension(){ alert("Test menu item"); } // The `CommandID` must be written in snake_case constMY_COMMAND_ID="test_menuitem"; CommandManager.register("Test",MY_COMMAND_ID, handleTestExtension); // Add Menu item const menu =Menus.getMenu(Menus.AppMenuBar.FILE_MENU); menu.addMenuItem(MY_COMMAND_ID); // Initialize extension once shell is finished initializing. AppInit.appReady(function(){ console.log("hello world"); }); });
+
Expected Output :-
+
+
+
The alert box that appears when the Test menu item is clicked!
You can position the menu item to make it appear at the first, last or before/after a given item.
+
To position the menu item at the top, use
+
// second parameter is for keyboard shortcut. Empty string means no shortcut. menu.addMenuItem(MY_COMMAND_ID,"",Menus.FIRST);
+
+
Menus.FIRST is used to position it before every other item. Note: It is recommended to avoid using this and prefer relative menu IDs for better positioning.*
+
Menus.LAST is used to position it at the end. It is the Default value.
+
To position the menu item before or after any item, use
+
// second parameter is for keyboard shortcut. Empty string means no shortcut. menu.addMenuItem(MY_COMMAND_ID,"",Menus.BEFORE,Commands.FILE_SAVE_AS);
+
+
Third parameter must specify BEFORE or AFTER the item should be set.
+
Fourth parameter must specify the “relativeID” of the menu item to set the position.
+
+
+
Here, the menu item is set before the Save As... option.
+
To get the list of all the RelativeIDs available by default, refer to this link.
You can assign a keyboard shortcut to your menu item.
+
Note: Only add shortcuts if they're essential and frequently used, ensuring compatibility across platforms. Users can set custom shortcuts, so default shortcuts should be reserved only for high-use actions.
Register the keyboard shortcut. To register use addBinding(). The first parameter will be the CommandID of the menu item and the second parameter will be the keyboard shortcut.
define(function(require, exports, module){ "use strict"; // Brackets modules constAppInit= brackets.getModule("utils/AppInit"), CommandManager= brackets.getModule("command/CommandManager"), Menus= brackets.getModule("command/Menus"), KeyBindingManager= brackets.getModule("command/KeyBindingManager"); // Function to run when the menu item is clicked functionhandleTestExtension(){ alert("Test menu item"); } constMY_COMMAND_ID="test_menuitem"; CommandManager.register("Test",MY_COMMAND_ID, handleTestExtension); // Add Menu item const menu =Menus.getMenu(Menus.AppMenuBar.FILE_MENU); menu.addMenuItem(MY_COMMAND_ID,"Ctrl-Alt-T",Menus.FIRST); // Register the keyboard shortcut KeyBindingManager.addBinding(MY_COMMAND_ID,"Ctrl-Alt-T"); // Initialize extension once shell is finished initializing. AppInit.appReady(function(){ console.log("hello world"); }); });
In Phoenix Code, Panels are of two types :- Plugin Panel and Bottom Panel.
+
Plugin Panel appears on the side of the screen, generally the left side. For Example :- Live Preview feature uses the Plugin Panel.
+
+
Bottom Panel appears on the bottom of the screen as a tab. Multiple bottom panels share a tabbed interface where each panel gets its own tab with an icon and title. For Example :- Git, Terminal, Problems panel and many more use the Bottom Panel.
+
+
This document outlines the basic features of working with Panels.
const bottomPanel =WorkspaceManager.createBottomPanel( "myextension.panel",// Unique ID using package-style naming $panel,// jQuery object for panel content undefined,// minSize (deprecated, pass undefined) "My Panel",// Title shown on the tab { iconSvg:"path/to/icon.svg"// SVG icon for the tab } );
+
+
title: The text shown on the panel's tab. If not provided, Phoenix Code uses the text from a .toolbar .title element inside your panel, or derives it from the panel ID.
+
iconSvg: Path to an SVG file used as the tab icon. The icon automatically adapts to light and dark themes. If not provided, a default icon is used.
+
+
+
+
+
The minSize parameter (third argument) is deprecated and no longer used. Pass undefined for this parameter.
To add the button to StatusBar, use addIndicator() :-
+
+
+
StatusBar.addIndicator( MY_COMMAND_ID,// unique ID for this indicator $("<div>Test</div>").click(handleHelloWorld),// Optional DOMNode for the indicator true,// show the indicator "hello-world-status",// CSS class "tooltip",// tooltip text );
+
→ The parameters of the addIndicator() method :-
+
Param
Type
Description
id
string
Registration id of the indicator to be updated.
[indicator]
DOMNode or jQueryObject
Optional DOMNode for the indicator
[visible]
boolean
Shows or hides the indicator over the statusbar.
[style]
string
Sets the attribute "class" of the indicator.
[tooltip]
string
Sets the attribute "title" of the indicator.
[insertBefore]
string
An id of an existing status bar indicator. The new indicator will be inserted before (i.e. to the left of) the indicator specified by this parameter.
<!-- This example uses <i> element with: 1. the `fa-solid` style class for solid style 2. the `user` icon with the `fa-` prefix --> <iclass="fa-solid fa-user"></i> <!-- Or you can use a <span> element, with classes applied in the same way --> <spanclass="fa-solid fa-user"></span>
Follow the steps below to run and debug your extension:
+
+
+
Clone your extension repository onto the machine.
+
+
+
Go to https://create.phcode.dev. This is a development-focused version of phcode.dev which shows non minified JS/CSS files in the browser developer tools.
+
+
+
Now, open the cloned folder in create.phcode.dev.
+
+
+
+
Refer to this guide to see how to open a folder in Phoenix Code.
+
+
+
Select Debug > Load Project As Extension
+
+
+
+
+
The extension will be loaded in Phoenix Code.
+
+
+
You can now make code changes and live preview them.
+
+
+
+
You can also select Debug > Reload Project As Extension to test the new code changes.
+
+
+
When you are done developing the extension, select Debug > Unload Project As Extension to unload the extension.
+
+
You can use the browser developer tools to debug the extension.
Node Extensions in Phoenix Code bring the power of Node.js to your desktop development environment, unlocking access to the vast npm ecosystem for building feature-rich extensions. By leveraging Node.js runtime capabilities, these extensions can perform system-level operations like executing commands, accessing local files, or integrating with external applications – functionalities that aren't possible in traditional browser-based extensions.
+
One of the key advantages of Node Extensions is their ability to handle computationally intensive tasks without impacting the editor's performance. While browser-based extensions run in the main thread and can potentially freeze the UI during heavy processing, Node Extensions can offload these operations to separate processes. This makes them ideal for scenarios involving extensive image processing, code analysis, or other resource-demanding tasks. Whether you're building a system integration tool or implementing complex background processing, Node Extensions provide the perfect foundation for creating powerful, responsive extensions in Phoenix Code's desktop environment.
+For cross-platform compatibility between desktop and browser environments, you can alternatively use Web Workers to handle computation-intensive tasks. This approach requires bundling any npm dependencies using webpack or similar tools before they can run in the browser. Check out our Web Worker Communication guide for detailed instructions on implementing and managing Web Workers in your extension.
+
Important: When using Node Extensions for heavy computational tasks, make sure to fork a separate Node.js process or worker rather than running operations in the main Node.js process. This separation ensures optimal performance and stability of your extension within Phoenix Code.
To create a new node extension for Phoenix Code, use this template. This template extension works in the browser as well as desktop builds. In browser, it will not use node, and node.js based functionalities are not available. Desktop builds can use node capabilities.
+
In desktop builds, there is an additional capability to execute node.js code. This is helpful if you want to extend the functionality of Phoenix Code using the vast npm library.
Set this field to true if the extension relies on Node and won't function without it.
+If set to false or omitted, the extension can still be loaded in browser versions of Phoenix code without Node support, but it will use Node in native builds.
+It will be shown in the extension manager dialog in browser builds as well.
Specifies the main entry point for the Node.js component of the extension.
+Should point to the main JavaScript file for the Node part of the extension.
+Example: "main": "node/index.js"
Specifies the path to run npm install when the user installs the extension from the extension manager.
+It's advisable not to package node_modules inside the extension. Only the package lock file should be distributed.
+Example: "npmInstall": "node/"
Clone the repository you created in Step 2 to your local machine.
+
Go to https://create.phcode.dev. This is a development-focused version of phcode.dev which shows non minified JS/CSS files in the browser developer tools.
+
Now, open the cloned folder in create.phcode.dev. Refer to this guide to see how to open a folder in Phoenix Code.
To open Phoenix Code Diagnostic tools, click on the Debug menu on the menu bar and navigate to the Phoenix Code Diagnostic Tools option. This section provides several tools for debugging purposes.
Run Phoenix Code Tests
+Executes built-in tests to verify the functionality of Phoenix Code.
+
+
+
Build Editor Tests
+Builds and runs tests specifically for the editor environment.
+
+
+
Enable Detailed Logs
+Activates verbose logging for better insight into extension behavior. Use this to identify errors or unexpected behaviors during development.
+
+
+
Enable PhNode Inspector
+Launches the PhNode inspector, allowing in-depth inspection of the extension runtime environment.
+
+
+
How to Inspect PhNode
+Provides a guide to effectively use the PhNode Inspector.
+
+
+
+
Live Preview Logs
+Displays real-time logs for active live previews, helping debug changes dynamically.
+
+
+
Show Performance Data
+Generates performance metrics to identify bottlenecks or performance issues within the extension.
+
+
+
Open Virtual File System
+Opens and inspects the virtual file system used by Phoenix Code.
The API-Reference directory contains detailed reference documentation for each part of the Phoenix Code API. Each page here corresponds to different components, functions, or modules of the API, providing explanations, usage examples, and detailed parameter descriptions.
+
+
This documentation is automatically generated from the source code. To learn more about how these docs are generated, refer to this link.
Follow this section only for old brackets extensions.
+
+
To publish Extensions/themes that are not created from the above theme and extension template
+or old Brackets extensions, please follow the steps below:
+
+
Create a GitHub repository for your extension if it is not present.
+
+
\ No newline at end of file
diff --git a/api/publishing-extensions/index.html b/api/publishing-extensions/index.html
new file mode 100644
index 00000000..411ce15a
--- /dev/null
+++ b/api/publishing-extensions/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links.js b/app-links.js
deleted file mode 100644
index ccb8c59e..00000000
--- a/app-links.js
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * @file Phoenix “App Links” redirect map for Docusaurus.
- *
- * Integrates with: @docusaurus/plugin-client-redirects (>= 3.7.0)
- *
- * WHAT THIS IS
- * ------------
- * A central, stable index of URLs the Phoenix app (desktop/browser) and docs
- * can safely link to as: https://docs.phcode.dev/app-links/*
- *
- * You can also use these entries to **predefine placeholder URLs**
- * before the corresponding documentation exists — this allows wiring
- * links into the Phoenix app early, while keeping URLs stable for when
- * docs are added later.
- *
- * The idea: the `from` side never changes; you’re free to restructure docs and
- * simply update the `to` target here—no broken links in the app or shared docs.
- *
- * DEV VS BUILD
- * ------------
- * - `npm run start` (Docusaurus dev server): redirect pages are NOT generated.
- * You will NOT see /app-links/* work here.
- * - To verify redirects end-to-end:
- * 1) `npm run build` → generates static pages for each redirect
- * 2) `npm run serve` → serves the built site with working redirects
- *
- * SCHEMA
- * ------
- * Each entry: { from: string, to: string }
- * - `from` MUST be an absolute path starting with `/app-links/...`
- * - `to` can be:
- * • an internal path (e.g. `/docs/editing-text#line-height`)
- * • a full external URL (e.g. `https://google.com`)
- *
- * CONVENTIONS & TIPS
- * ------------------
- * - Keep all stable links under `/app-links/*` to make deprecations easy.
- * - Use leading slashes for internal `to` values; include hash anchors if needed.
- * - External URLs are supported; the plugin will create a client page that
- * performs a redirect (meta refresh + JS).
- *
- * EXTERNAL REDIRECT EXAMPLE
- * -------------------------
- * {
- * from: '/app-links/google-search',
- * to: 'https://google.com',
- * }
- *
- * TEST CHECKLIST
- * --------------
- * - After updating this file:
- * - Run `npm run build` then `npm run serve`
- * - Open a few /app-links/* routes and confirm they land on the right pages
- */
-
-
-/** @type {Array<{from: string, to: string}>} */
-export const appLinks = [
- {
- from: '/app-links/extn-line-height', // https://docs.phcode.dev/app-links/extn-line-height
- to: '/docs/customizing-editor#line-height', // https://docs.phcode.dev/docs/customizing-editor#line-height
- },
- {
- from: '/app-links/live-preview',
- to: '/docs/Features/Live Preview',
- },
- {
- from: '/app-links/keyboard-shortcuts',
- to: '/docs/Features/keyboard-shortcuts',
- },
- {
- from: '/app-links/auto-rename-tag',
- to: '/docs/editing-text#auto-rename-tag',
- },
- {
- from: '/app-links/indent-guide-lines',
- to: '/docs/customizing-editor#indent-guide-lines',
- },
- {
- from: '/app-links/emmet',
- to: '/docs/Features/emmet',
- },
- {
- from: '/app-links/git',
- to: '/docs/Features/git',
- },
- {
- from: '/app-links/color-preview',
- to: '/docs/editing-colors#color-preview',
- },
- {
- from: '/app-links/auto-space-detection',
- to: '/docs/editing-text#auto-space-detection',
- },
- {
- from: '/app-links/html-lint',
- to: '/docs/Features/Problems Panel/html-lint',
- },
- {
- from: '/app-links/ESLint',
- to: '/docs/Features/Problems Panel/ESLint',
- },
- {
- from: '/app-links/live-preview-settings',
- to: '/docs/Features/Live Preview/live-preview-settings',
- },
- {
- from: '/app-links/editor-rulers',
- to: '/docs/customizing-editor#editor-rulers',
- },
- {
- from: '/app-links/find-in-files',
- to: '/docs/Features/find-in-files',
- },
- {
- from: '/app-links/custom-snippets',
- to: '/docs/Features/custom-snippets',
- },
- {
- from: '/app-links/edu-pro',
- to: '/docs/phoenix-pro-school',
- },
- {
- from: '/app-links/live-preview-edit',
- to: '/docs/Pro Features/live-preview-edit',
- },
- {
- from: '/app-links/tab-bar',
- to: '/docs/file-management#tab-bar',
- },
- {
- from: '/app-links/claude-code-integration',
- to: '/docs/Pro Features/ai-chat',
- },
- {
- from: '/app-links/claude-code-config',
- to: '/docs/Pro Features/ai-chat',
- },
- {
- from: '/app-links/design-mode',
- to: '/docs/design-mode',
- },
- {
- from: '/app-links/ai-chat',
- to: '/docs/Pro Features/ai-chat',
- },
- {
- from: '/app-links/markdown-editor',
- to: '/docs/Pro Features/markdown-editor',
- },
- {
- from: '/app-links/resize-ruler',
- to: '/docs/Pro Features/device-preview',
- },
- {
- from: '/app-links/terminal',
- to: '/docs/Features/terminal',
- },
- {
- from: '/app-links/themes',
- to: '/docs/customizing-editor#themes',
- }
-];
diff --git a/app-links/ESLint/index.html b/app-links/ESLint/index.html
new file mode 100644
index 00000000..65db2b7a
--- /dev/null
+++ b/app-links/ESLint/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/ai-chat/index.html b/app-links/ai-chat/index.html
new file mode 100644
index 00000000..e7d71e32
--- /dev/null
+++ b/app-links/ai-chat/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/auto-rename-tag/index.html b/app-links/auto-rename-tag/index.html
new file mode 100644
index 00000000..d1a83ef1
--- /dev/null
+++ b/app-links/auto-rename-tag/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/auto-space-detection/index.html b/app-links/auto-space-detection/index.html
new file mode 100644
index 00000000..d6ddc4c0
--- /dev/null
+++ b/app-links/auto-space-detection/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/claude-code-config/index.html b/app-links/claude-code-config/index.html
new file mode 100644
index 00000000..e7d71e32
--- /dev/null
+++ b/app-links/claude-code-config/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/claude-code-integration/index.html b/app-links/claude-code-integration/index.html
new file mode 100644
index 00000000..e7d71e32
--- /dev/null
+++ b/app-links/claude-code-integration/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/color-preview/index.html b/app-links/color-preview/index.html
new file mode 100644
index 00000000..cc37d09d
--- /dev/null
+++ b/app-links/color-preview/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/custom-snippets/index.html b/app-links/custom-snippets/index.html
new file mode 100644
index 00000000..ba8c747c
--- /dev/null
+++ b/app-links/custom-snippets/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/design-mode/index.html b/app-links/design-mode/index.html
new file mode 100644
index 00000000..2f27f055
--- /dev/null
+++ b/app-links/design-mode/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/editor-rulers/index.html b/app-links/editor-rulers/index.html
new file mode 100644
index 00000000..2834b188
--- /dev/null
+++ b/app-links/editor-rulers/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/edu-pro/index.html b/app-links/edu-pro/index.html
new file mode 100644
index 00000000..be5eed85
--- /dev/null
+++ b/app-links/edu-pro/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/emmet/index.html b/app-links/emmet/index.html
new file mode 100644
index 00000000..51bdc823
--- /dev/null
+++ b/app-links/emmet/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/extn-line-height/index.html b/app-links/extn-line-height/index.html
new file mode 100644
index 00000000..ad731983
--- /dev/null
+++ b/app-links/extn-line-height/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/find-in-files/index.html b/app-links/find-in-files/index.html
new file mode 100644
index 00000000..9e810b52
--- /dev/null
+++ b/app-links/find-in-files/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/git/index.html b/app-links/git/index.html
new file mode 100644
index 00000000..72d05f80
--- /dev/null
+++ b/app-links/git/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/html-lint/index.html b/app-links/html-lint/index.html
new file mode 100644
index 00000000..1614c61e
--- /dev/null
+++ b/app-links/html-lint/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/indent-guide-lines/index.html b/app-links/indent-guide-lines/index.html
new file mode 100644
index 00000000..bd1795d9
--- /dev/null
+++ b/app-links/indent-guide-lines/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/keyboard-shortcuts/index.html b/app-links/keyboard-shortcuts/index.html
new file mode 100644
index 00000000..0e0b272a
--- /dev/null
+++ b/app-links/keyboard-shortcuts/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/live-preview-edit/index.html b/app-links/live-preview-edit/index.html
new file mode 100644
index 00000000..b58f6e30
--- /dev/null
+++ b/app-links/live-preview-edit/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/live-preview-settings/index.html b/app-links/live-preview-settings/index.html
new file mode 100644
index 00000000..d318b6df
--- /dev/null
+++ b/app-links/live-preview-settings/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/live-preview/index.html b/app-links/live-preview/index.html
new file mode 100644
index 00000000..761c43c5
--- /dev/null
+++ b/app-links/live-preview/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/markdown-editor/index.html b/app-links/markdown-editor/index.html
new file mode 100644
index 00000000..c8eaf550
--- /dev/null
+++ b/app-links/markdown-editor/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/resize-ruler/index.html b/app-links/resize-ruler/index.html
new file mode 100644
index 00000000..2b3f2e48
--- /dev/null
+++ b/app-links/resize-ruler/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/tab-bar/index.html b/app-links/tab-bar/index.html
new file mode 100644
index 00000000..07194db0
--- /dev/null
+++ b/app-links/tab-bar/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/terminal/index.html b/app-links/terminal/index.html
new file mode 100644
index 00000000..a83d609b
--- /dev/null
+++ b/app-links/terminal/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app-links/themes/index.html b/app-links/themes/index.html
new file mode 100644
index 00000000..141e38bb
--- /dev/null
+++ b/app-links/themes/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/assets/css/styles.3c4d133b.css b/assets/css/styles.3c4d133b.css
new file mode 100644
index 00000000..c5d8dc59
--- /dev/null
+++ b/assets/css/styles.3c4d133b.css
@@ -0,0 +1 @@
+.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.avatar__photo,.card,.text--truncate{overflow:hidden}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500);--docsearch-error-color:#ef5350;--shimmer-bg:linear-gradient(90deg,#e0e3e8 0%,var(--docsearch-muted-color) 20%,var(--docsearch-muted-color) 60%,#e0e3e8 95%);--docsearch-dropdown-menu-background:var(--docsearch-hit-background);--docsearch-dropdown-menu-item-hover-background:var(--docsearch-modal-background)}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Hit-AskAIButton-title,.DocSearch-Hit-AskAIButton-title-query,.DocSearch-Hit-content-wrapper,.text--truncate{text-overflow:ellipsis;white-space:nowrap}.DocSearch-Footer,.DocSearch-Markdown-Content hr{border-block-start:1px solid var(--docsearch-subtle-color)}.toggleButton_gllP,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary)}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_LNqP{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_NmtK,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}.container_lyt7,.container_lyt7>svg,img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList__CuJ{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){-webkit-text-decoration:none;text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_uzNF .wordWrapButtonIcon_b1P5{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.DocSearch-Escape-Key,.admonitionHeading_Gvgb,.alert__heading,.playgroundHeader_EIHj,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.DocSearch-Container a,.DocSearch-Hit-AskAIButton-title mark,.dropdown__link--active,.dropdown__link:hover,.menu__link:hover,.navbar__brand:hover,.navbar__link--active,.navbar__link:hover,.pagination-nav__link:hover,.pagination__link:hover,.sidebarItemLink_mo7H:hover{-webkit-text-decoration:none;text-decoration:none}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]),.shimmer{pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color)}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_Djhp article>:first-child,.docItemContainer_Djhp header+*,.footer__item{margin-top:0}.admonitionContent_BuS1>:last-child,.collapsibleContent_i85q p:last-child,.details_lb9f>summary>p:last-child,.footer__items,.tabItem_Ymn6>:last-child{margin-bottom:0}[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title,.title_f1Hy{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_lb9f[data-collapsed=false].isBrowser_bmU9>summary:before,.details_lb9f[open]:not(.isBrowser_bmU9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;left:0;top:0;visibility:hidden}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color)}.menu__caret:before,.menu__link--sublist-caret:after{content:"";height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color)}.announcementBarContent_xLdY,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color)}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover)}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_mC6p>li)>.containsTaskList_mC6p{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--docsearch-text-color:#c4c7dc;--docsearch-secondary-text-color:#b6b7d5;--docsearch-subtle-color:#212139;--docsearch-success-color:#43a04733;--docsearch-highlight-color:#457aff;--docsearch-focus-color:#9ac8ff;--docsearch-background-color:#36395a;--docsearch-icon-color:#b6b7d5;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#000000a6;--docsearch-searchbox-focus-background:#000000a6;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-background:#36395a;--docsearch-key-color:#b6b7d5;--docsearch-key-pressed-shadow:inset 0 2px 4px #0c0d1466;--docsearch-footer-background:#000000a6;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497;--docsearch-search-button-background:var(--docsearch-modal-background);--docsearch-search-button-text-color:var(--docsearch-text-color)}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}[data-theme=dark]{--ifm-color-primary:#f8a949;--ifm-color-primary-dark:#c96f2a;--ifm-color-primary-darker:#b26425;--ifm-color-primary-darkest:#a2571e;--ifm-color-primary-light:#4d3c30;--ifm-color-primary-lighter:#3a2e24;--ifm-color-primary-lightest:#2c221b;--docusaurus-highlighted-code-line-bg:#e76f0033}.askai-suggestions{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px;padding:12px 0}.askai-suggestion-btn{appearance:none;background:var(--docsearch-hit-background,#fff);border:1px solid var(--docsearch-muted-color,#969faf);border-radius:16px;color:var(--docsearch-text-color,#1c1e21);cursor:pointer;font-family:inherit;font-size:13px;line-height:1.4;min-height:36px;padding:6px 14px;transition:background .15s,border-color .15s}.askai-suggestion-btn:hover{background:var(--docsearch-hit-highlight-color,#003dff1a);border-color:var(--docsearch-primary-color,#003dff)}.askai-suggestion-btn:focus-visible{outline:2px solid var(--docsearch-primary-color,#003dff);outline-offset:2px}.askai-suggestion-btn:active{background:var(--docsearch-hit-highlight-color,#003dff26)}.askai-sr-only{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0}nav[class*=sidebar_].thin-scrollbar{scrollbar-width:none;-ms-overflow-style:none}nav[class*=sidebar_].thin-scrollbar::-webkit-scrollbar{display:none}.backToTopButton_sjWU{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_sjWU:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xfvO{opacity:1;transform:scale(1);visibility:visible}:root{--ifm-color-primary:#e76f00;--ifm-color-primary-dark:#cc6400;--ifm-color-primary-darker:#b35900;--ifm-color-primary-darkest:#994c00;--ifm-color-primary-light:#fce4d6;--ifm-color-primary-lighter:#fdfaf5;--ifm-color-primary-lightest:#fff;--ifm-code-font-size:95%;--docusaurus-highlighted-code-line-bg:#e76f001a;--docsearch-primary-color:#003dff;--docsearch-soft-primary-color:#003dff1a;--docsearch-subtle-color:#d6d6e7;--docsearch-text-color:#36395a;--docsearch-success-color:#e8f5e9;--docsearch-secondary-text-color:#5a5e9a;--docsearch-background-color:#f5f5fa;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-focus-color:#005fcc;--docsearch-highlight-color:#003dff;--docsearch-muted-color:#9698c3;--docsearch-muted-color-darker:#787aa540;--docsearch-icon-color:#5a5e9a;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#003dff;--docsearch-border-radius:4px;--docsearch-search-button-background:#fff;--docsearch-search-button-text-color:var(--docsearch-secondary-text-color);--docsearch-modal-width:800px;--docsearch-modal-height:600px;--docsearch-modal-variable-height:60dvh;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:#0003 0px 12px 28px 0px,#0000001a 0px 2px 4px 0px,#ffffff0d 0px 0px 0px 1px inset;--docsearch-searchbox-height:56px;--docsearch-searchbox-initial-height:56px;--docsearch-searchbox-background:#ffffffa6;--docsearch-searchbox-focus-background:#ffffffa6;--docsearch-actions-width:99px;--docsearch-actions-height:44px;--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-highlight-color:#003dff1a;--docsearch-hit-background:#fff;--docsearch-key-background:#f5f5fa;--docsearch-key-color:#5a5e9a;--docsearch-key-pressed-shadow:inset 0 2px 4px #787aa540;--docsearch-footer-height:52px;--docsearch-footer-background:#ffffffa6;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--fav-out-dur:160ms;--del-dur:150ms;--ease-smooth:cubic-bezier(0.25,0.8,0.4,1);--ease-fast:cubic-bezier(0.45,0.15,0.6,0.9);--shadow-pop:0 4px 12px #0000000f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px;--docusaurus-blog-social-icon-size:1rem;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300)}.DocSearch-Button{all:unset;align-items:center;background-color:var(--docsearch-search-button-background);border:1px solid var(--docsearch-subtle-color);border-radius:.5rem;color:var(--docsearch-search-button-text-color);cursor:pointer;display:flex;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button-Container{align-items:center;display:flex;height:100%}.DocSearch-Button-Container svg{color:currentColor}.DocSearch-Back-Icon,.DocSearch-Search-Icon{color:var(--docsearch-highlight-color);stroke-width:1.6}.DocSearch-Action,.DocSearch-AskAi-Return,.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button-Placeholder{color:currentColor;display:inline-block;font-size:1rem;line-height:normal;padding-block:0;padding-inline:8px 12px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-background);border:0;border-radius:4px;box-shadow:none!important;color:var(--docsearch-key-color);display:flex;font-family:system-ui,-apple-system,sans-serif;font-size:14px;height:24px;justify-content:center;position:relative;transition-duration:.1s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:24px}.DocSearch-Link,.DocSearch-SearchBar-Magnifier{color:var(--docsearch-highlight-color)}@supports (color:color-mix(in lch,red,blue)){.DocSearch-Button-Key{border:1px solid color-mix(in srgb,var(--docsearch-subtle-color) 20%,#0000)}}.DocSearch-Button-Key--ctrl{width:33px}.DocSearch-Button-Key:first-child{margin-inline-end:.4em}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow)!important;transform:translateY(1px)}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{backdrop-filter:blur(4px);background-color:var(--docsearch-container-background);height:100vh;inset-block-start:0;inset-inline-start:0;position:fixed;width:100vw;z-index:400}.DocSearch-Form,.DocSearch-Hit,.DocSearch-Modal{display:flex;position:relative}.DocSearch-Hit mark,.DocSearch-Prefill:focus,.DocSearch-Prefill:hover,.DocSearch-ThreadDepthError-Link{-webkit-text-decoration:underline;text-decoration:underline}.DocSearch-Link{appearance:none;background:none;border:0;cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:4px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width)}.DocSearch-Logo a,.DocSearch-Menu-content.open,.DocSearch-SearchBar,.searchLogoColumn_rJIA a{display:flex}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-block-end:1px solid var(--docsearch-subtle-color);border-radius:4px 4px 0 0;height:var(--docsearch-searchbox-height,var(--docsearch-searchbox-initial-height));margin:0;min-height:var(--docsearch-searchbox-initial-height);padding-block:var(--docsearch-spacing);padding-inline:16px;width:100%}.DocSearch-Input,.DocSearch-Modal-heading{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;font-weight:300;height:100%;line-height:1.4;outline:0;overflow-y:hidden;padding-block-start:0;padding-inline-start:8px;resize:none;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-Actions{align-items:center;display:flex;gap:8px;height:var(--docsearch-actions-height);justify-content:flex-end;padding:0 2px;width:var(--docsearch-actions-width)}.DocSearch-Divider{border-inline-start:1px solid var(--docsearch-subtle-color);height:16px}.DocSearch-Action{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center;min-height:24px;min-width:24px}.DocSearch-Action,.DocSearch-AskAi-Return,.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel{margin:0;padding:0}.DocSearch-AskAi-Return,.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Action,.DocSearch-AskAi-Return{animation:.1s ease-in forwards a;appearance:none;background:none;border:none;border-radius:var(--docsearch-border-radius);color:var(--docsearch-icon-color);cursor:pointer;inset-inline-end:0;padding:2px}.DocSearch-AskAi-Return[hidden],.DocSearch-Close[hidden],.DocSearch-Input[hidden],.DocSearch-StreamingIndicator[hidden],svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Action:hover,.DocSearch-AskAi-Return:hover{background:var(--docsearch-soft-primary-color);color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{color:var(--docsearch-icon-color);height:24px;width:24px}.DocSearch-Clear,.DocSearch-Form:focus-within .DocSearch-MagnifierLabel svg{color:var(--docsearch-highlight-color)}.DocSearch-Clear{appearance:none;background:none;border:0;cursor:pointer;flex:none;font:inherit;font-size:.9em;font-weight:300;height:28px;margin-inline-start:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Clear:focus-visible,.DocSearch-Close:focus-visible{border-radius:4px;outline:2px solid var(--docsearch-focus-color);outline-offset:1px}.DocSearch-Dropdown{height:var(--docsearch-modal-variable-height);max-height:calc(var(--docsearch-modal-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown-Container ul{list-style:none;margin:0;padding:0}.DocSearch-Label{color:var(--docsearch-secondary-text-color);font-size:.875em;font-weight:400;line-height:1.6em}.DocSearch-Help,.DocSearch-NoResults-Help{color:var(--docsearch-secondary-text-color);font-size:.8em;font-weight:300;line-height:1.5em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{color:var(--docsearch-text-color);font-size:1.1em;font-weight:300;line-height:.5em;vertical-align:middle}.DocSearch-Title strong{font-weight:500}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-inline-start:8px}.DocSearch-Hits:last-of-type{margin-block-end:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-block-end:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-block-end:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;padding-block-end:4px;scroll-margin-block-start:40px}.DocSearch-Hit:first-of-type{margin-block-start:4px}.DocSearch-Hit a,.DocSearch-Hit--AskAI{background:var(--docsearch-hit-background);border-radius:4px;cursor:pointer;display:block;padding-inline-start:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-text-color);font-size:.9em;font-weight:600;inset-block-start:0;line-height:32px;margin:0 -4px;padding:8px 4px 4px;position:sticky;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit-Container,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title{color:var(--docsearch-text-color)}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit--AskAI,.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-hit-highlight-color)}.DocSearch-Conversation-History .DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-hit-background)}.DocSearch-Hit mark{color:var(--docsearch-highlight-color);text-underline-offset:.3em}.DocSearch-Hit-Container{align-items:center;display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{color:var(--docsearch-secondary-text-color);height:20px;width:20px}.DocSearch-Hit-action{align-items:center;color:var(--docsearch-muted-color);display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-inline-start:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon,.tocCollapsibleContent_vkbj a{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:400;gap:4px;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-secondary-text-color);font-size:.75em}.DocSearch-AskAiScreen-MessageContent-Tool-Query:hover svg,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-highlight-color)}.DocSearch-AskAiScreen,.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{align-items:center;color:var(--docsearch-secondary-text-color);display:flex;flex-direction:column;font-size:1.25em;font-weight:400;justify-content:center;margin:0 auto;text-align:center;width:80%}.DocSearch-AskAiScreen,.DocSearch-ErrorScreen,.DocSearch-NoResults{max-height:80%}.sidebar_re4s,.tableOfContents_bqdL{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem)}.DocSearch-StartScreen,body,html{height:100%}.DocSearch-NoResults{gap:.8em;margin-block-start:2em}.DocSearch-NoResults--withAskAi{justify-content:flex-start;margin-block-start:0}.DocSearch-AskAiScreen,.DocSearch-ErrorScreen,.DocSearch-StartScreen{gap:24px}.DocSearch-StartScreen-Icon{height:64px;stroke:var(--docsearch-icon-color);width:64px}.DocSearch-AskAiScreen-MessageContent-Reasoning svg,.DocSearch-Screen-Icon{color:var(--docsearch-icon-color)}.DocSearch-NoResults-Prefill-List{display:flex;flex-direction:column;gap:12px;text-align:center}.DocSearch-NoResults-Prefill-List-Items{display:flex;flex-direction:column;gap:2px}.DocSearch-NoResults-Prefill-List-Items p{align-items:center;display:flex;margin:0;text-align:start}.DocSearch-Prefill{align-items:center;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-flex;font-size:.8em;font-weight:300;gap:4px;height:40px;padding:0 4px}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 4px 4px;display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;gap:16px;list-style:none;margin:0;padding:0}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands-Key{background-color:var(--docsearch-background-color);border:0;border-radius:2px;box-shadow:none!important;color:var(--docsearch-icon-color);height:24px;justify-content:center;margin-inline-end:4px;width:24px}.DocSearch-Commands-Key:last-of-type{margin-inline-end:8px}.DocSearch-Escape-Key{font-size:10px;font-weight:300;letter-spacing:normal;line-height:16px;text-align:center}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}.DocSearch-AskAi-Section{display:flex;flex-direction:column;gap:8px;padding:12px 0}.DocSearch-Hit-AskAIButton{align-items:center;color:var(--docsearch-text-color);display:flex;flex-direction:row}.DocSearch-Hit-AskAIButton-icon{color:var(--docsearch-icon-color);flex-shrink:0;margin-inline-end:12px}.DocSearch-Hit-AskAIButton-title{color:var(--docsearch-hit-color);display:flex;flex:1 1 auto;font-weight:400;gap:4px;overflow-x:hidden;position:relative;width:80%}.DocSearch-Hit-AskAIButton-title-query{background:none;margin-inline-start:4px;overflow:hidden}@keyframes a{0%{opacity:0}to{opacity:1}}.DocSearch-AskAiScreen-Container{display:flex;flex-direction:column;gap:0;height:100%;justify-content:flex-start;padding:0;text-align:start;width:100%}.DocSearch-AskAiScreen-Disclaimer{align-self:flex-start;display:flex;font-size:.6em;font-weight:300;margin:0;padding-block:1.5em .5em;padding-inline:0;text-align:start}.DocSearch-AskAiScreen-Body{gap:24px;width:100%}.DocSearch-AskAiScreen-Body,.DocSearch-AskAiScreen-Response,.DocSearch-AskAiScreen-Response-Container{display:flex;flex-direction:column}.DocSearch-AskAiScreen-Response{align-self:flex-start;background:var(--docsearch-hit-background);border-radius:4px;color:var(--docsearch-text-color);font-size:.8em;gap:1em;margin-block-end:8px;padding:24px;width:100%}.DocSearch-AskAiScreen-Query{font-size:1.25em;font-weight:600;line-break:loose;line-height:1.4;margin:0}.DocSearch-AskAiScreen-Answer{line-height:1.5}.DocSearch-AskAiScreen-Answer,.DocSearch-AskAiScreen-ThinkingDots{color:var(--docsearch-secondary-text-color);font-weight:400;margin:0}.DocSearch-AskAiScreen-Error,.DocSearch-AskAiScreen-Error .DocSearch-Markdown-Content{color:var(--docsearch-error-color)}.DocSearch-AskAiScreen-ThinkingDots{font-size:.8em}.DocSearch-AskAiScreen-Answer-Footer{align-items:center;display:flex;flex-direction:row;gap:8px;justify-content:space-between}.DocSearch-AskAiScreen-Actions{align-items:center;display:flex;flex-direction:row;gap:12px;margin-inline-start:auto}.DocSearch-AskAiScreen-ActionButton{align-items:center;background:none;border:none;border-radius:4px;cursor:pointer;display:flex;justify-content:center;margin:0;padding:4px;transition:background-color .2s;width:24px}.DocSearch-AskAiScreen-ActionButton:hover,.DocSearch-AskAiScreen-RelatedSources-Item-Link:hover{background:var(--docsearch-hit-highlight-color)}.DocSearch-AskAiScreen-ActionButton svg{color:var(--docsearch-icon-color);height:20px;stroke-width:1.5;width:20px}.DocSearch-AskAiScreen-CopyButton--copied{background-color:var(--docsearch-success-color);cursor:default}.DocSearch-AskAiScreen-MessageContent{display:flex;flex-direction:column;row-gap:1em}.DocSearch-AskAiScreen-Error{background-color:#ef53501a;border-radius:4px;flex-direction:row;font-size:1em;font-weight:400;gap:8px;padding:1em}.DocSearch-AskAiScreen-Error svg{margin-top:.25rem}.DocSearch-AskAiScreen-Error svg,.DocSearch-AskAiScreen-MessageContent-Tool svg{flex-shrink:0;height:16px;width:16px}.DocSearch-AskAiScreen-Error p{margin:0}.DocSearch-AskAiScreen-Error-Content{display:flex;flex:1 1 0%;flex-direction:column}.DocSearch-AskAiScreen-Error-Title{font-weight:700;margin-bottom:4px}.DocSearch-AskAiScreen-Error--ThreadDepth{animation:.3s ease-out b;border:1px solid #febdc5;color:var(--docsearch-text-color);font-size:12px;margin:12px 0 8px;width:100%}@keyframes b{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.DocSearch-ThreadDepthError-Link{background:none;border:none;color:var(--docsearch-highlight-color);cursor:pointer;font-family:inherit;font-size:inherit;padding:0}.DocSearch-AskAiScreen-RelatedSources-Item-Link,.DocSearch-Markdown-Content a,.tag_zVej:hover{-webkit-text-decoration:none;text-decoration:none}.DocSearch-CodeSnippet-CopyButton:hover,.DocSearch-ThreadDepthError-Link:hover,.theme-code-block-highlighted-line .codeLineNumber_Tfdd:before{opacity:.8}.DocSearch-ThreadDepthError-Link:active{color:#991b1b}.DocSearch-AskAiScreen-FeedbackText{color:var(--docsearch-muted-color);font-size:.7em;font-weight:400;margin:0}.DocSearch-AskAiScreen-FeedbackText--visible{animation:.3s ease-in forwards a}.DocSearch-AskAiScreen-RelatedSources{display:flex;flex-direction:column;gap:4px;width:100%}.DocSearch-AskAiScreen-RelatedSources-List{display:flex;flex-direction:row;flex-wrap:wrap;gap:12px;width:100%}.DocSearch-AskAiScreen-RelatedSources-Title{color:var(--docsearch-secondary-text-color);font-size:.7em;font-weight:400;margin:0;padding:6px 0}.DocSearch-AskAiScreen-RelatedSources-NoResults{color:var(--docsearch-text-color);font-size:.8rem;font-weight:400;margin:0}.DocSearch-AskAiScreen-RelatedSources-Error{color:var(--docsearch-error-color);font-size:.8rem;font-weight:400;margin:0}.DocSearch-AskAiScreen-RelatedSources-Item-Link{align-items:center;background:var(--docsearch-hit-background);border-radius:4px;color:var(--docsearch-text-color);display:flex;font-size:.75em;gap:6px;max-width:70%;padding:12px 8px;transition:background-color .2s}.DocSearch-AskAiScreen-RelatedSources-Item-Link svg{color:var(--docsearch-icon-color);flex-shrink:0;stroke-width:1.2}.DocSearch-AskAiScreen-RelatedSources-Item-Link span{flex:1 1 0;font-weight:500;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DocSearch-AskAiScreen-ExchangesList{display:flex;flex-direction:column;gap:24px;margin:8px 0}.DocSearch-Markdown-Content{color:var(--docsearch-text-color);font-size:.9355em;line-height:1.6;word-wrap:break-word}.DocSearch-Markdown-Content--streaming{animation:.3s ease-in-out both a}.DocSearch-Markdown-Content p{margin:1em 0}.DocSearch-Markdown-Content p:last-child{margin-block-end:0}.DocSearch-Markdown-Content p:first-child{margin-block-start:0}.DocSearch-Markdown-Content code{border-radius:3px;font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:.9em;letter-spacing:normal;margin:0;padding:.2em 0}.DocSearch-Markdown-Content code,.DocSearch-Markdown-Content pre{background-color:var(--docsearch-key-background);color:var(--docsearch-text-color)}.DocSearch-Markdown-Content pre{border-radius:6px;margin:1.5em 0;overflow-x:auto;padding:1.2em}.DocSearch-Markdown-Content pre code{background-color:initial;border-radius:0;color:inherit;font-size:.8em;margin:0;padding:0;white-space:pre-wrap;word-wrap:break-word;line-height:1.5}.DocSearch-Markdown-Content h1,.DocSearch-Markdown-Content h2,.DocSearch-Markdown-Content h3,.DocSearch-Markdown-Content h4,.DocSearch-Markdown-Content h5,.DocSearch-Markdown-Content h6{color:var(--docsearch-text-color);font-weight:600;letter-spacing:-.02em;line-height:1.3;margin:1em 0}.DocSearch-Markdown-Content h1{font-size:1.5em}.DocSearch-Markdown-Content h2{font-size:1.2em}.DocSearch-Markdown-Content h3{font-size:1em}.DocSearch-Markdown-Content h4{font-size:.9em}.DocSearch-Markdown-Content h5,.DocSearch-Markdown-Content h6{font-size:.8em}.DocSearch-Markdown-Content ol,.DocSearch-Markdown-Content ul{color:var(--docsearch-text-color);margin:1.2em 0;padding-inline-start:1.5em}.DocSearch-Markdown-Content ul{list-style-type:disc}.DocSearch-Markdown-Content ol{list-style-type:decimal}.DocSearch-Markdown-Content li{color:var(--docsearch-text-color);line-height:1.6;margin:.8em 0;padding-inline-start:.3em}.DocSearch-Markdown-Content li>ol,.DocSearch-Markdown-Content li>ul{margin:.5em}.DocSearch-Markdown-Content li::marker{color:var(--docsearch-muted-color)}.DocSearch-Markdown-Content a{color:var(--docsearch-highlight-color);transition:.2s}.DocSearch-Markdown-Content a:hover,.content_knG7 a{-webkit-text-decoration:underline;text-decoration:underline}.DocSearch-Markdown-Content a:hover{opacity:.9}.DocSearch-Markdown-Content blockquote{border-inline-start:4px solid var(--docsearch-hit-highlight-color);color:var(--docsearch-secondary-text-color);font-style:italic;margin:1.5em 0;padding-block:.5em;padding-inline:1em 0}.DocSearch-Markdown-Content hr{border:none;margin:1em 0}.DocSearch-Markdown-Content table{border-collapse:collapse;margin:1.5em 0;width:100%}.DocSearch-Markdown-Content td,.DocSearch-Markdown-Content th{border:1px solid var(--docsearch-subtle-color);padding:.75em;text-align:start}.DocSearch-Markdown-Content th{background-color:var(--docsearch-hit-background);font-weight:600}.DocSearch-AskAiScreen-MessageContent-Reasoning{align-items:center;color:var(--docsearch-muted-color);display:flex;font-size:1em;gap:4px}.DocSearch-AskAiScreen-MessageContent-Tool{align-items:center;color:var(--docsearch-muted-color);display:flex;line-height:1.2;width:100%}.DocSearch-AskAiScreen-MessageContent-Tool.Tool--Result{padding-block-start:0}.DocSearch-AskAiScreen-MessageContent-Tool>svg{color:var(--docsearch-icon-color);margin-inline-end:8px}.DocSearch-AskAiScreen-MessageContent-Tool-Query{color:var(--docsearch-muted-color);transition:box-shadow .2s}.DocSearch-AskAiScreen-MessageContent-Tool-Query svg{color:var(--docsearch-muted-color)}.DocSearch-AskAiScreen-MessageContent-Tool-Query:hover{box-shadow:0 1px 0 0 var(--docsearch-highlight-color);color:var(--docsearch-highlight-color);cursor:pointer}.DocSearck-AskAiScreen-MessageContent-Stopped{color:var(--docsearch-muted-color);font-style:italic;margin-block-start:1em}.DocSearch-AskAiScreen-SmallerLoadingIcon{height:16px;width:16px}.shimmer{background:var(--shimmer-bg);background-clip:text;-webkit-background-clip:text;background-size:200% auto;color:#0000;display:flex;-webkit-text-fill-color:#0000;animation:2.5s linear infinite c}@keyframes c{0%{background-position:200% 0}to{background-position:-200% 0}}.DocSearch-CodeSnippet,.DocSearch-Menu{position:relative}.DocSearch-CodeSnippet-CopyButton{align-items:center;background:var(--docsearch-key-background);border:none;border-radius:4px;color:var(--docsearch-text-color);cursor:pointer;display:flex;font-size:.75em;inset-block-start:8px;inset-inline-end:8px;padding:.2em .6em;position:absolute;transition:opacity .2s}.DocSearch-CodeSnippet-CopyButton:active{opacity:.6}.DocSearch-CodeSnippet-CopyButton svg{height:16px;margin-inline-end:4px;width:16px}#__docusaurus-base-url-issue-banner-container,.DocSearch-CodeSnippet-CheckIcon,.DocSearch-CodeSnippet-CopyButton--copied .DocSearch-CodeSnippet-CopyIcon,.DocSearch-Markdown-Content--streaming .DocSearch-CodeSnippet-CopyButton,.docSidebarContainer_YfHR,.navbarSearchContainer_Bca1:empty,.sidebarLogo_isFc,.themedComponent_mlkZ,.toggleIcon_g3eP,html[data-announcement-bar-initially-dismissed=true] .announcementBar_mb4j{display:none}.DocSearch-CodeSnippet-CopyButton--copied .DocSearch-CodeSnippet-CheckIcon{display:inline-block}.DocSearch-NewConversationScreen{padding:3em var(--docsearch-spacing)}.DocSearch-NewConversationScreen-Title{color:var(--docsearch-text-color);font-size:26px;font-weight:600;margin-block-end:.15em}.DocSearch-NewConversationScreen-Description{color:var(--docsearch-muted-color);font-size:14px}.DocSearch-NewConversationScreen-SuggestedQuestions{align-items:start;display:flex;flex-direction:column;gap:var(--docsearch-spacing);margin-block-start:1.5em}.DocSearch-NewConversationScreen-SuggestedQuestion{align-items:center;background-color:var(--docsearch-searchbox-background);border:1px solid var(--docsearch-subtle-color);border-radius:var(--docsearch-border-radius);color:var(--docsearch-text-color);cursor:pointer;display:inline-flex;height:40px;justify-content:center;padding:12px}.DocSearch-Menu-content{background-color:var(--docsearch-dropdown-menu-background);border-radius:var(--docsearch-border-radius);box-shadow:0 0 0 1px #21243d0d,0 8px 16px -4px #21243d40;display:none;flex-direction:column;inset-block-start:calc(100% + 12px);inset-inline-end:0;min-width:195px;padding:8px 0;position:absolute;z-index:422}.DocSearch-Container,.skipToContent_fXgn{z-index:calc(var(--ifm-z-index-fixed) + 1)}.DocSearch-Menu-item{align-items:center;background-color:initial;border:0;color:var(--docsearch-text-color);cursor:pointer;display:flex;font-size:14px;gap:8px;padding:10px 16px;white-space:nowrap}.DocSearch-Menu-item:hover{background-color:var(--docsearch-dropdown-menu-item-hover-background)}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Button-Key,.codeBlockStandalone_MEMb{padding:0}.skipToContent_fXgn{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem}.skipToContent_fXgn:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_CVFx{line-height:0;padding:0}.content_knG7{font-size:85%;padding:5px 0;text-align:center}.content_knG7 a{color:inherit}.announcementBar_mb4j{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vyr4{flex:0 0 10px}.announcementBarClose_gvF7{align-self:stretch;flex:0 0 30px}.toggle_vylO{height:2rem;width:2rem}.toggleButton_gllP{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_gllP:hover{background:var(--ifm-color-emphasis-200)}[data-theme-choice=dark] .darkToggleIcon_wfgR,[data-theme-choice=light] .lightToggleIcon_pyhR,[data-theme-choice=system] .systemToggleIcon_QzmC,[data-theme=dark] .themedComponent--dark_xIcU,[data-theme=light] .themedComponent--light_NVdE,html:not([data-theme]) .themedComponent--light_NVdE{display:initial}.toggleButtonDisabled_aARS{cursor:not-allowed}.darkNavbarColorModeToggle_X3D1:hover{background:var(--ifm-color-gray-800)}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_PEFL{display:none;margin:0}.categoryLinkLabel_W154,.linkLabel_WmDU{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}.iconExternalLink_nPIU{margin-left:.3rem}.linkLabel_WmDU{line-clamp:2;-webkit-line-clamp:2}.categoryLink_byQd{overflow:hidden}.menu__link--sublist-caret:after{margin-left:var(--ifm-menu-link-padding-vertical)}.categoryLinkLabel_W154{flex:1;line-clamp:2;-webkit-line-clamp:2}.docMainContainer_TBSr,.docRoot_UBD9{display:flex;width:100%}.docsWrapper_hBAB{display:flex;flex:1 0 auto}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.footerLogoLink_BH7S:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.anchorTargetStickyNavbar_Vzrq{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorTargetHideOnScrollNavbar_vjPI{scroll-margin-top:.5rem}.dropdownNavbarItemMobile_J0Sd{cursor:pointer}.iconLanguage_nlXk{margin-right:5px;vertical-align:text-bottom}.navbarHideable_m1mJ{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_jGov{transform:translate3d(0,calc(-100% - 2px),0)}.navbar__items--right>:last-child{padding-right:0}.errorBoundaryError_a6uf{color:red;white-space:pre-wrap}.errorBoundaryFallback_VBag{color:red;padding:.55rem}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.footerLogoLink_BH7S{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.mainWrapper_z2l0{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.sidebar_re4s{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 2rem)}.sidebarItemTitle_pO2u{font-size:var(--ifm-h3-font-size);font-weight:var(--ifm-font-weight-bold)}.container_mt6G,.sidebarItemList_Yudw{font-size:.9rem}.sidebarItem__DBe{margin-top:.7rem}.sidebarItemLink_mo7H{color:var(--ifm-font-color-base);display:block}.sidebarItemLinkActive_I1ZP{color:var(--ifm-color-primary)!important}.yearGroupHeading_rMGB{margin-bottom:.4rem;margin-top:1.6rem}.yearGroupHeading_QT03{margin:1rem .75rem .5rem}.searchQueryInput_u2C7,.searchVersionInput_m0Ui{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_u2C7:focus,.searchVersionInput_m0Ui:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_u2C7::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_JPFH{font-size:.9rem;font-weight:700}.searchLogoColumn_rJIA{align-items:center;display:flex;gap:.5rem;justify-content:flex-end}.searchLogoColumn_rJIA span{color:var(--docsearch-muted-color);font-weight:400}.searchResultItem_Tv2o{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_KbCB{font-weight:400;margin-bottom:0}.searchResultItemPath_lhe1{color:var(--ifm-color-content-secondary);font-size:.8rem;--ifm-breadcrumb-separator-size-multiplier:1}.searchResultItemSummary_AEaO{font-style:italic;margin:.5rem 0 0}.loadingSpinner_XVxU{animation:1s linear infinite d;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}.authorSocialIcon_XYv3,.authorSocialLink_owbf,.authorSocials_rSDt{height:var(--docusaurus-blog-social-icon-size)}.authorSocialIcon_XYv3,.authorSocialLink_owbf{width:var(--docusaurus-blog-social-icon-size)}@keyframes d{to{transform:rotate(1turn)}}.loader_vvXV{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}[data-theme=dark] .blueskySvg_AzZw,[data-theme=dark] .githubSvg_Uu4N,[data-theme=dark] .instagramSvg_YC40,[data-theme=dark] .linkedinSvg_FCgI,[data-theme=dark] .threadsSvg_PTXY,[data-theme=dark] .xSvg_y3PF{fill:var(--light)}[data-theme=light] .blueskySvg_AzZw,[data-theme=light] .githubSvg_Uu4N,[data-theme=light] .instagramSvg_YC40,[data-theme=light] .linkedinSvg_FCgI,[data-theme=light] .threadsSvg_PTXY,[data-theme=light] .xSvg_y3PF{fill:var(--dark)}.authorSocials_rSDt{align-items:center;display:flex;flex-wrap:wrap;overflow:hidden;line-clamp:1;-webkit-line-clamp:1;-webkit-box-orient:vertical}.authorSocialLink_owbf,.authorSocials_rSDt{line-height:0}.authorSocialLink_owbf{margin-right:.4rem}.authorImage_XqGP{--ifm-avatar-photo-size:3.6rem}.author-as-h1_n9oJ .authorImage_XqGP{--ifm-avatar-photo-size:7rem}.author-as-h2_gXvM .authorImage_XqGP{--ifm-avatar-photo-size:5.4rem}.authorDetails_lV9A{align-items:flex-start;display:flex;flex-direction:column;justify-content:space-around}.authorName_yefp{display:flex;flex-direction:row;font-size:1.1rem;line-height:1.1rem}.author-as-h1_n9oJ .authorName_yefp{display:inline;font-size:2.4rem;line-height:2.4rem}.author-as-h2_gXvM .authorName_yefp{display:inline;font-size:1.4rem;line-height:1.4rem}.authorTitle_nd0D{display:-webkit-box;font-size:.8rem;line-height:1rem;overflow:hidden;line-clamp:1;-webkit-line-clamp:1;-webkit-box-orient:vertical}.author-as-h1_n9oJ .authorTitle_nd0D{font-size:1.2rem;line-height:1.6rem}.author-as-h2_gXvM .authorTitle_nd0D{font-size:1rem;line-height:1.3rem}.authorBlogPostCount_iiJ5{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.8rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.buttonGroup_M5ko button,.codeBlockContainer_Ckt0{background:var(--prism-background-color);color:var(--prism-color)}.authorListItem_n3yI{list-style-type:none;margin-bottom:2rem}.authorCol_Hf19{max-width:inherit!important}.imageOnlyAuthorRow_pa_O{display:flex;flex-flow:row wrap}.buttons_AeoN,.features_t9lD{align-items:center;display:flex}.imageOnlyAuthorCol_G86a{margin-left:.3rem;margin-right:.3rem}.features_t9lD{padding:2rem 0;width:100%}.featureSvg_GfXr{height:200px;width:200px}.heroBanner_qdFl{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_AeoN{justify-content:center}.codeBlockContainer_Ckt0{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlock_bY9V{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockLines_e6Vv{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_o6Pm{display:table;padding:var(--ifm-pre-padding) 0}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_lJS_{counter-increment:line-count;display:table-row}.codeLineNumber_Tfdd{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_Tfdd:before{content:counter(line-count);opacity:.4}.codeLineContent_feaV{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_Vdqa{opacity:1!important}.copyButtonIcons_IEyt{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_TrPX,.copyButtonSuccessIcon_cVMy{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_cVMy{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_Vdqa .copyButtonIcon_TrPX{opacity:0;transform:scale(.33)}.copyButtonCopied_Vdqa .copyButtonSuccessIcon_cVMy{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_b1P5{height:1.2rem;width:1.2rem}.buttonGroup_M5ko{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup_M5ko button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup_M5ko button:focus-visible,.buttonGroup_M5ko button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup_M5ko button{opacity:.4}.codeBlockContent_QJqH{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_OeMC{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlockTitle_OeMC+.codeBlockContent_QJqH .codeBlock_a8dz{border-top-left-radius:0;border-top-right-radius:0}.playgroundContainer_XwyR{border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading);overflow:hidden}.playgroundHeader_EIHj{background:var(--ifm-color-emphasis-200);color:var(--ifm-color-content);font-size:var(--ifm-code-font-size);font-weight:700;letter-spacing:.08rem;padding:.75rem}.playgroundHeader_EIHj:first-of-type{background:var(--ifm-color-emphasis-700);color:var(--ifm-color-content-inverse)}.playgroundPreview_bYPY{background-color:var(--ifm-pre-background);padding:1rem}.playgroundEditor_L2Ll{direction:ltr;font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace)!important}.playgroundEditor_L2Ll pre{border-radius:0}.tag_zVej{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_zVej:hover{--docusaurus-tag-list-border:var(--ifm-link-color)}.tagRegular_sFm0{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_h2kH{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_h2kH:after,.tagWithCount_h2kH:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_h2kH:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_h2kH:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_h2kH span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tag_Nnez{display:inline-block;margin:.5rem .5rem 0 1rem}.details_lb9f{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_lb9f>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_lb9f>summary::-webkit-details-marker{display:none}.details_lb9f>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_i85q{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.tags_jXut{display:inline}.tag_QGVx{display:inline-block;margin:0 .4rem .5rem 0}.iconEdit_Z9Sw{margin-right:.3em;vertical-align:sub}.details_b_Ee{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.lastUpdated_JAkA{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_TO0P{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_TO0P:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_MG3E:after,.tocCollapsibleExpanded_sAul{transform:none}.tocCollapsible_ETCw{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_vkbj>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_vkbj ul li{margin:.4rem .8rem}.containsTaskList_mC6p{list-style:none}.img_ev3q{height:auto}.admonition_xJq3{margin-bottom:1em}.admonitionHeading_Gvgb{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_Gvgb:not(:last-child){margin-bottom:.3rem}.admonitionHeading_Gvgb code{text-transform:none}.admonitionIcon_Rf37{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_Rf37 svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.tableOfContents_bqdL{overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YNFT{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_Z_bl{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_j9I6{justify-content:center}@media (min-width:997px){.collapseSidebarButton_PEFL,.expandButton_TmdG{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_gvF7,.announcementBarPlaceholder_vyr4{flex-basis:50px}.collapseSidebarButton_PEFL{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_kv0_{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_i1dp,[dir=rtl] .collapseSidebarButtonIcon_kv0_{transform:rotate(0)}.collapseSidebarButton_PEFL:focus,.collapseSidebarButton_PEFL:hover,.expandButton_TmdG:focus,.expandButton_TmdG:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_M9Kj{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_SIkG{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_SIkG{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_GW3s{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_njMd{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_wUlq{padding-top:0}.sidebarHidden_VK0M{opacity:0;visibility:hidden}.sidebarLogo_isFc{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);-webkit-text-decoration:none!important;text-decoration:none!important}.sidebarLogo_isFc img{height:2rem;margin-right:.5rem}.expandButton_TmdG{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_i1dp{transform:rotate(180deg)}.docSidebarContainer_YfHR{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_DPk8{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_aRkj{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_TBSr{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_lQrH{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_JWYK{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_Bca1{padding:0 var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_JAkA{text-align:right}.tocMobile_ITEo{display:none}.docItemCol_VOVn{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_DEke,.footer__link-separator,.navbar__item,.sidebar_re4s,.tableOfContents_bqdL{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_Bca1{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_F8PC{padding:0 .3rem}}@media only screen and (max-width:996px){.searchQueryColumn_RTkw,.searchResultsColumn_JPFH{max-width:60%!important}.searchLogoColumn_rJIA,.searchVersionColumn_ypXd{max-width:40%!important}.searchLogoColumn_rJIA{padding-left:0!important}}@media screen and (max-width:996px){.heroBanner_qdFl{padding:2rem}}@media (max-width:768px){.DocSearch-Button{width:auto}.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:48px}.DocSearch-Input{font-size:1rem}.DocSearch-Hit-AskAIButton-icon{margin-inline-end:8px}body:has(.DocSearch-Container){overflow:hidden;position:fixed}.DocSearch-Dropdown{height:100%;max-height:none}.DocSearch-Container{height:calc(var(--docsearch-vh,1vh)*100);height:100dvh}.DocSearch-Footer{border-radius:0;inset-block-end:0;position:static}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:calc(var(--docsearch-vh,1vh)*100);height:100dvh;margin:0;max-width:100%;width:100%}.DocSearch-AskAiScreen-Response-Container{flex-direction:column}.DocSearch-AskAiScreen-RelatedSources,.DocSearch-AskAiScreen-Response{width:100%}}@media (max-width:640px){.askai-suggestions{flex-direction:column}.askai-suggestion-btn{min-height:44px;text-align:left;width:100%}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}.title_f1Hy{font-size:2rem}}@media screen and (max-width:576px){.searchQueryColumn_RTkw{max-width:100%!important}.searchVersionColumn_ypXd{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_sjWU:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:no-preference){.askai-suggestion-btn{animation:.3s forwards e;opacity:0;transform:translateY(8px)}.askai-suggestion-btn:nth-child(2){animation-delay:75ms}.askai-suggestion-btn:nth-child(3){animation-delay:.15s}.askai-suggestion-btn:nth-child(4){animation-delay:225ms}@keyframes e{to{opacity:1;transform:translateY(0)}}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media (prefers-reduced-motion){.DocSearch-Button-Key{transition:none}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Action{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;inset-inline-end:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@media print{.announcementBar_mb4j,.footer,.menu,.navbar,.noPrint_WFHX,.pagination-nav,.table-of-contents,.tocMobile_ITEo{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_e6Vv{white-space:pre-wrap}}
\ No newline at end of file
diff --git a/docs/images/popular-extensions/1-2-3.gif b/assets/images/1-2-3-2baddde7c9b006e7c84dfaf449d2f2c9.gif
similarity index 100%
rename from docs/images/popular-extensions/1-2-3.gif
rename to assets/images/1-2-3-2baddde7c9b006e7c84dfaf449d2f2c9.gif
diff --git a/docs/images/beautifyCode/Beautify-Code-after-save.png b/assets/images/Beautify-Code-after-save-82acb2723da86a54d9302d0874831c2b.png
similarity index 100%
rename from docs/images/beautifyCode/Beautify-Code-after-save.png
rename to assets/images/Beautify-Code-after-save-82acb2723da86a54d9302d0874831c2b.png
diff --git a/docs/images/beautifyCode/Context-Menu.png b/assets/images/Context-Menu-8173aa5d559f358ddc3fd6054581e178.png
similarity index 100%
rename from docs/images/beautifyCode/Context-Menu.png
rename to assets/images/Context-Menu-8173aa5d559f358ddc3fd6054581e178.png
diff --git a/docs/images/popular-extensions/Func-Docr.gif b/assets/images/Func-Docr-c8a17e10862c5855bc4e241cd40cd548.gif
similarity index 100%
rename from docs/images/popular-extensions/Func-Docr.gif
rename to assets/images/Func-Docr-c8a17e10862c5855bc4e241cd40cd548.gif
diff --git a/docs/images/popular-extensions/Show-Whitespace.png b/assets/images/Show-Whitespace-7af1837294998ace257ae52aeeebb935.png
similarity index 100%
rename from docs/images/popular-extensions/Show-Whitespace.png
rename to assets/images/Show-Whitespace-7af1837294998ace257ae52aeeebb935.png
diff --git a/docs/images/edu/activate-edu-license.png b/assets/images/activate-edu-license-4e9f1f80f1c2a90bc87aedca55403203.png
similarity index 100%
rename from docs/images/edu/activate-edu-license.png
rename to assets/images/activate-edu-license-4e9f1f80f1c2a90bc87aedca55403203.png
diff --git a/docs/images/CustomSnippets/add-snippet.png b/assets/images/add-snippet-7ccf5b31a43851dbe05ec38ca6733d93.png
similarity index 100%
rename from docs/images/CustomSnippets/add-snippet.png
rename to assets/images/add-snippet-7ccf5b31a43851dbe05ec38ca6733d93.png
diff --git a/docs/images/CustomSnippets/add-snippet-panel.png b/assets/images/add-snippet-panel-7a57a0f2198b515d9c00f99425bc0b03.png
similarity index 100%
rename from docs/images/CustomSnippets/add-snippet-panel.png
rename to assets/images/add-snippet-panel-7a57a0f2198b515d9c00f99425bc0b03.png
diff --git a/docs/images/CustomSnippets/after-edit-snippet.png b/assets/images/after-edit-snippet-3dd8215740509bc5caa57f481aadcdca.png
similarity index 100%
rename from docs/images/CustomSnippets/after-edit-snippet.png
rename to assets/images/after-edit-snippet-3dd8215740509bc5caa57f481aadcdca.png
diff --git a/docs/images/pro/ai-attach-dropdown.png b/assets/images/ai-attach-dropdown-784ff31d32b89626ad3e713ea4003537.png
similarity index 100%
rename from docs/images/pro/ai-attach-dropdown.png
rename to assets/images/ai-attach-dropdown-784ff31d32b89626ad3e713ea4003537.png
diff --git a/docs/images/pro/ai-chat-panel.png b/assets/images/ai-chat-panel-b0b0d9b641a0101804099ea7afc7313b.png
similarity index 100%
rename from docs/images/pro/ai-chat-panel.png
rename to assets/images/ai-chat-panel-b0b0d9b641a0101804099ea7afc7313b.png
diff --git a/docs/images/pro/ai-chips.png b/assets/images/ai-chips-0b33a8c34b1201fe4489dfa2ce9e7ead.png
similarity index 100%
rename from docs/images/pro/ai-chips.png
rename to assets/images/ai-chips-0b33a8c34b1201fe4489dfa2ce9e7ead.png
diff --git a/docs/images/pro/ai-diff.png b/assets/images/ai-diff-d8e662b0eed142007395e8f7f4301e15.png
similarity index 100%
rename from docs/images/pro/ai-diff.png
rename to assets/images/ai-diff-d8e662b0eed142007395e8f7f4301e15.png
diff --git a/docs/images/pro/ai-history.png b/assets/images/ai-history-d817a0b975a1ea768e4aa6d5500a8864.png
similarity index 100%
rename from docs/images/pro/ai-history.png
rename to assets/images/ai-history-d817a0b975a1ea768e4aa6d5500a8864.png
diff --git a/docs/images/pro/ai-permissions.png b/assets/images/ai-permissions-4a614c6b00f5c955c6ea7a7ba79104ed.png
similarity index 100%
rename from docs/images/pro/ai-permissions.png
rename to assets/images/ai-permissions-4a614c6b00f5c955c6ea7a7ba79104ed.png
diff --git a/docs/images/pro/ai-screenshot-dropdown.png b/assets/images/ai-screenshot-dropdown-739f02b4602fe7a0cd6a1bf08b1814c6.png
similarity index 100%
rename from docs/images/pro/ai-screenshot-dropdown.png
rename to assets/images/ai-screenshot-dropdown-739f02b4602fe7a0cd6a1bf08b1814c6.png
diff --git a/docs/images/pro/ai-settings.png b/assets/images/ai-settings-87168e345e0d965d0a66bfa1403dfdcd.png
similarity index 100%
rename from docs/images/pro/ai-settings.png
rename to assets/images/ai-settings-87168e345e0d965d0a66bfa1403dfdcd.png
diff --git a/docs/images/pro/ai-settings-dialog.png b/assets/images/ai-settings-dialog-2db5a84268eac13befff6d988b5486b9.png
similarity index 100%
rename from docs/images/pro/ai-settings-dialog.png
rename to assets/images/ai-settings-dialog-2db5a84268eac13befff6d988b5486b9.png
diff --git a/docs/images/pro/ai-stop.png b/assets/images/ai-stop-3d1698784f0e06c84de3ad18133c3ae0.png
similarity index 100%
rename from docs/images/pro/ai-stop.png
rename to assets/images/ai-stop-3d1698784f0e06c84de3ad18133c3ae0.png
diff --git a/docs/images/pro/ai-undo.png b/assets/images/ai-undo-63f2cbf78b22e66a28ec0df67a16f7f2.png
similarity index 100%
rename from docs/images/pro/ai-undo.png
rename to assets/images/ai-undo-63f2cbf78b22e66a28ec0df67a16f7f2.png
diff --git a/docs/images/keyboard/assign.png b/assets/images/assign-f7883c143ca6438f8c7afc27beae385c.png
similarity index 100%
rename from docs/images/keyboard/assign.png
rename to assets/images/assign-f7883c143ca6438f8c7afc27beae385c.png
diff --git a/docs/images/editingText/auto-rename-tag.png b/assets/images/auto-rename-tag-be192184dd67f581688f906ca00eddaf.png
similarity index 100%
rename from docs/images/editingText/auto-rename-tag.png
rename to assets/images/auto-rename-tag-be192184dd67f581688f906ca00eddaf.png
diff --git a/docs/images/editingText/auto-spacing.png b/assets/images/auto-spacing-f95f4ad94872c5fbbee504a125215035.png
similarity index 100%
rename from docs/images/editingText/auto-spacing.png
rename to assets/images/auto-spacing-f95f4ad94872c5fbbee504a125215035.png
diff --git a/api/08-How-To/images/bottom-panel.png b/assets/images/bottom-panel-84e2d0bb50feeac59a7f228347e97015.png
similarity index 100%
rename from api/08-How-To/images/bottom-panel.png
rename to assets/images/bottom-panel-84e2d0bb50feeac59a7f228347e97015.png
diff --git a/api/08-How-To/images/bottom-panel-example.png b/assets/images/bottom-panel-example-d7b102fe2a72cdf87672dde01cf97705.png
similarity index 100%
rename from api/08-How-To/images/bottom-panel-example.png
rename to assets/images/bottom-panel-example-d7b102fe2a72cdf87672dde01cf97705.png
diff --git a/docs/images/beautifyCode/bracketSameLine-false.png b/assets/images/bracketSameLine-false-5cddd00f353ce49fe53bc4a15e92a4d8.png
similarity index 100%
rename from docs/images/beautifyCode/bracketSameLine-false.png
rename to assets/images/bracketSameLine-false-5cddd00f353ce49fe53bc4a15e92a4d8.png
diff --git a/docs/images/beautifyCode/bracketSameLine-true.png b/assets/images/bracketSameLine-true-49e7c4cffaa9809a9cd50a55cedf707f.png
similarity index 100%
rename from docs/images/beautifyCode/bracketSameLine-true.png
rename to assets/images/bracketSameLine-true-49e7c4cffaa9809a9cd50a55cedf707f.png
diff --git a/docs/images/editingColors/colorHints.png b/assets/images/colorHints-2b430e5fb6f41382012636317a7fe8ca.png
similarity index 100%
rename from docs/images/editingColors/colorHints.png
rename to assets/images/colorHints-2b430e5fb6f41382012636317a7fe8ca.png
diff --git a/docs/images/editingColors/colorPicker.png b/assets/images/colorPicker-5fb509811cd885dc6bad0b903c558e95.png
similarity index 100%
rename from docs/images/editingColors/colorPicker.png
rename to assets/images/colorPicker-5fb509811cd885dc6bad0b903c558e95.png
diff --git a/docs/images/editingColors/colorPreview.png b/assets/images/colorPreview-0c906adc6f19225724362382e11afd2a.png
similarity index 100%
rename from docs/images/editingColors/colorPreview.png
rename to assets/images/colorPreview-0c906adc6f19225724362382e11afd2a.png
diff --git a/docs/images/editingColors/colorPreviewHover.png b/assets/images/colorPreviewHover-c67ffee8b9c6e6de0eaeef2e43102438.png
similarity index 100%
rename from docs/images/editingColors/colorPreviewHover.png
rename to assets/images/colorPreviewHover-c67ffee8b9c6e6de0eaeef2e43102438.png
diff --git a/docs/images/git-images/commit-dialog.png b/assets/images/commit-dialog-58df3dd71e62d5199135e6ef01bc5421.png
similarity index 100%
rename from docs/images/git-images/commit-dialog.png
rename to assets/images/commit-dialog-58df3dd71e62d5199135e6ef01bc5421.png
diff --git a/api/images/publishing-extensions/compress-to-zip.png b/assets/images/compress-to-zip-c4c9896983e9859f5f1a40a39bcc5fa2.png
similarity index 100%
rename from api/images/publishing-extensions/compress-to-zip.png
rename to assets/images/compress-to-zip-c4c9896983e9859f5f1a40a39bcc5fa2.png
diff --git a/docs/images/pro/control-box.png b/assets/images/control-box-c1ae95fb08a3548ffa4739cb5762a236.png
similarity index 100%
rename from docs/images/pro/control-box.png
rename to assets/images/control-box-c1ae95fb08a3548ffa4739cb5762a236.png
diff --git a/api/images/publishing-extensions/create-new-tag.png b/assets/images/create-new-tag-e6e42d0ef9e8feae8b11c9449b42e0ab.png
similarity index 100%
rename from api/images/publishing-extensions/create-new-tag.png
rename to assets/images/create-new-tag-e6e42d0ef9e8feae8b11c9449b42e0ab.png
diff --git a/api/08-How-To/images/custom-dialog-box-gif.gif b/assets/images/custom-dialog-box-gif-11573dfb6efabd5555e4bb9f6b5c73ee.gif
similarity index 100%
rename from api/08-How-To/images/custom-dialog-box-gif.gif
rename to assets/images/custom-dialog-box-gif-11573dfb6efabd5555e4bb9f6b5c73ee.gif
diff --git a/api/08-How-To/images/custom-dialog.png b/assets/images/custom-dialog-fb30b696c3fa6e2736f84a24e76e1e6f.png
similarity index 100%
rename from api/08-How-To/images/custom-dialog.png
rename to assets/images/custom-dialog-fb30b696c3fa6e2736f84a24e76e1e6f.png
diff --git a/docs/images/CustomSnippets/custom-snippet-example.png b/assets/images/custom-snippet-example-83489ee1ec306855c06ad2ac43604316.png
similarity index 100%
rename from docs/images/CustomSnippets/custom-snippet-example.png
rename to assets/images/custom-snippet-example-83489ee1ec306855c06ad2ac43604316.png
diff --git a/docs/images/CustomSnippets/custom-snippet-icon.png b/assets/images/custom-snippet-icon-ffdc5bff906637ae27de8086e58c5b0b.png
similarity index 100%
rename from docs/images/CustomSnippets/custom-snippet-icon.png
rename to assets/images/custom-snippet-icon-ffdc5bff906637ae27de8086e58c5b0b.png
diff --git a/docs/images/CustomSnippets/custom-snippets-count.png b/assets/images/custom-snippets-count-d424aa3b6b9ad340e3fcbc522d362227.png
similarity index 100%
rename from docs/images/CustomSnippets/custom-snippets-count.png
rename to assets/images/custom-snippets-count-d424aa3b6b9ad340e3fcbc522d362227.png
diff --git a/docs/images/CustomSnippets/custom-snippets-empty-panel.png b/assets/images/custom-snippets-empty-panel-d8d8cfb85aaf8e0176d7fa08347acd5d.png
similarity index 100%
rename from docs/images/CustomSnippets/custom-snippets-empty-panel.png
rename to assets/images/custom-snippets-empty-panel-d8d8cfb85aaf8e0176d7fa08347acd5d.png
diff --git a/docs/images/CustomSnippets/custom-snippets-menu-item.png b/assets/images/custom-snippets-menu-item-f963aee4552d131878e5d81238c6a149.png
similarity index 100%
rename from docs/images/CustomSnippets/custom-snippets-menu-item.png
rename to assets/images/custom-snippets-menu-item-f963aee4552d131878e5d81238c6a149.png
diff --git a/api/images/creating-themes/debug-menu.png b/assets/images/debug-menu-23e79f25995442a5665046bc8c8d6bb4.png
similarity index 100%
rename from api/images/creating-themes/debug-menu.png
rename to assets/images/debug-menu-23e79f25995442a5665046bc8c8d6bb4.png
diff --git a/api/images/debugging-extensions/debug-menu.png b/assets/images/debug-menu-7e3985c7795c1611a028d64bfcf78d1b.png
similarity index 100%
rename from api/images/debugging-extensions/debug-menu.png
rename to assets/images/debug-menu-7e3985c7795c1611a028d64bfcf78d1b.png
diff --git a/api/images/creating-themes/default-theme.png b/assets/images/default-theme-64592ea9b5bd9a0ef9c5e59115a8c5c2.png
similarity index 100%
rename from api/images/creating-themes/default-theme.png
rename to assets/images/default-theme-64592ea9b5bd9a0ef9c5e59115a8c5c2.png
diff --git a/docs/images/git-images/delete-branch.png b/assets/images/delete-branch-830998fd338a5d691c06276d8b9d81ee.png
similarity index 100%
rename from docs/images/git-images/delete-branch.png
rename to assets/images/delete-branch-830998fd338a5d691c06276d8b9d81ee.png
diff --git a/docs/images/CustomSnippets/delete-snippet.png b/assets/images/delete-snippet-8576a735d0b8387f4569dcc95c790ec8.png
similarity index 100%
rename from docs/images/CustomSnippets/delete-snippet.png
rename to assets/images/delete-snippet-8576a735d0b8387f4569dcc95c790ec8.png
diff --git a/docs/images/designMode/design-mode-layout.png b/assets/images/design-mode-layout-42488219328638520697b7c6a63b9b2c.png
similarity index 100%
rename from docs/images/designMode/design-mode-layout.png
rename to assets/images/design-mode-layout-42488219328638520697b7c6a63b9b2c.png
diff --git a/docs/images/designMode/design-mode-toggle.png b/assets/images/design-mode-toggle-6cb723b6f8e48a9c1785ecd96f8b2923.png
similarity index 100%
rename from docs/images/designMode/design-mode-toggle.png
rename to assets/images/design-mode-toggle-6cb723b6f8e48a9c1785ecd96f8b2923.png
diff --git a/api/images/debugging-extensions/dev-tools.png b/assets/images/dev-tools-fa3423a19be0adb8f15e7a86fe980484.png
similarity index 100%
rename from api/images/debugging-extensions/dev-tools.png
rename to assets/images/dev-tools-fa3423a19be0adb8f15e7a86fe980484.png
diff --git a/docs/images/pro/device-size-dropdown.png b/assets/images/device-size-dropdown-0fd90b6ab85ae938853591b254bcd7a7.png
similarity index 100%
rename from docs/images/pro/device-size-dropdown.png
rename to assets/images/device-size-dropdown-0fd90b6ab85ae938853591b254bcd7a7.png
diff --git a/api/images/debugging-extensions/diagnostic-tools.png b/assets/images/diagnostic-tools-d4d75e4236de3d3d8ae52cfe5f76fd37.png
similarity index 100%
rename from api/images/debugging-extensions/diagnostic-tools.png
rename to assets/images/diagnostic-tools-d4d75e4236de3d3d8ae52cfe5f76fd37.png
diff --git a/docs/images/fileManagement/disable-tab-bar-1.png b/assets/images/disable-tab-bar-1-cebe5cbc905e0db85b6bda6675a74302.png
similarity index 100%
rename from docs/images/fileManagement/disable-tab-bar-1.png
rename to assets/images/disable-tab-bar-1-cebe5cbc905e0db85b6bda6675a74302.png
diff --git a/docs/images/fileManagement/disable-tab-bar-2.png b/assets/images/disable-tab-bar-2-64fb27b6f4f5e685286a97e9b0fcc6d4.png
similarity index 100%
rename from docs/images/fileManagement/disable-tab-bar-2.png
rename to assets/images/disable-tab-bar-2-64fb27b6f4f5e685286a97e9b0fcc6d4.png
diff --git a/docs/images/fileManagement/disable-working-files.png b/assets/images/disable-working-files-60ebca46987836c2bc0a9e6524433b64.png
similarity index 100%
rename from docs/images/fileManagement/disable-working-files.png
rename to assets/images/disable-working-files-60ebca46987836c2bc0a9e6524433b64.png
diff --git a/docs/images/git-images/discard-all-changes.png b/assets/images/discard-all-changes-c8b7b745866759d1ffbe6a1b1986c560.png
similarity index 100%
rename from docs/images/git-images/discard-all-changes.png
rename to assets/images/discard-all-changes-c8b7b745866759d1ffbe6a1b1986c560.png
diff --git a/docs/images/git-images/discard-changes.png b/assets/images/discard-changes-b01df6d57b21e9a2c307efe9ecc24412.png
similarity index 100%
rename from docs/images/git-images/discard-changes.png
rename to assets/images/discard-changes-b01df6d57b21e9a2c307efe9ecc24412.png
diff --git a/docs/images/Website/download.png b/assets/images/download-9d5503efc2ad929ae758ab9712c31b47.png
similarity index 100%
rename from docs/images/Website/download.png
rename to assets/images/download-9d5503efc2ad929ae758ab9712c31b47.png
diff --git a/docs/images/Website/downloadOptions.png b/assets/images/downloadOptions-59fa63c46fc30b1c8bfac73a5895926d.png
similarity index 100%
rename from docs/images/Website/downloadOptions.png
rename to assets/images/downloadOptions-59fa63c46fc30b1c8bfac73a5895926d.png
diff --git a/api/images/publishing-extensions/draft-new-release.png b/assets/images/draft-new-release-d98ab78386636a766c7921acd265bef4.png
similarity index 100%
rename from api/images/publishing-extensions/draft-new-release.png
rename to assets/images/draft-new-release-d98ab78386636a766c7921acd265bef4.png
diff --git a/api/images/publishing-extensions/drag-drop.gif b/assets/images/drag-drop-946ba662d98f0acdd52c5e1d60795e2e.gif
similarity index 100%
rename from api/images/publishing-extensions/drag-drop.gif
rename to assets/images/drag-drop-946ba662d98f0acdd52c5e1d60795e2e.gif
diff --git a/docs/images/CustomSnippets/edit-snippet.png b/assets/images/edit-snippet-cc007f151f132d865283e7c03f418c75.png
similarity index 100%
rename from docs/images/CustomSnippets/edit-snippet.png
rename to assets/images/edit-snippet-cc007f151f132d865283e7c03f418c75.png
diff --git a/docs/images/pro/element-properties.png b/assets/images/element-properties-042058b9f6ae7071eae412d838980f8c.png
similarity index 100%
rename from docs/images/pro/element-properties.png
rename to assets/images/element-properties-042058b9f6ae7071eae412d838980f8c.png
diff --git a/docs/images/Emmet/emmet-link-mdn.png b/assets/images/emmet-link-mdn-7dad55e620c8c0f3fd8de43f852418d8.png
similarity index 100%
rename from docs/images/Emmet/emmet-link-mdn.png
rename to assets/images/emmet-link-mdn-7dad55e620c8c0f3fd8de43f852418d8.png
diff --git a/docs/images/pro/enable-show-measurements.png b/assets/images/enable-show-measurements-6269f78f8c6fe1d060fd682ebe2d4cbb.png
similarity index 100%
rename from docs/images/pro/enable-show-measurements.png
rename to assets/images/enable-show-measurements-6269f78f8c6fe1d060fd682ebe2d4cbb.png
diff --git a/docs/images/extensions/extension-manager-button.png b/assets/images/extension-manager-button-467fe5a1b8e23ada40a5990a2cffa081.png
similarity index 100%
rename from docs/images/extensions/extension-manager-button.png
rename to assets/images/extension-manager-button-467fe5a1b8e23ada40a5990a2cffa081.png
diff --git a/api/images/publishing-extensions/extension-store.png b/assets/images/extension-store-55e5afd0adb2291385a92325ac98317e.png
similarity index 100%
rename from api/images/publishing-extensions/extension-store.png
rename to assets/images/extension-store-55e5afd0adb2291385a92325ac98317e.png
diff --git a/docs/images/find/fif.png b/assets/images/fif-750c256065fa01ad80939c7aab57a891.png
similarity index 100%
rename from docs/images/find/fif.png
rename to assets/images/fif-750c256065fa01ad80939c7aab57a891.png
diff --git a/docs/images/editingText/file-association.png b/assets/images/file-association-fe9fbd627e34eaad9b5f0add2c39e169.png
similarity index 100%
rename from docs/images/editingText/file-association.png
rename to assets/images/file-association-fe9fbd627e34eaad9b5f0add2c39e169.png
diff --git a/docs/images/editingText/file-encoding.png b/assets/images/file-encoding-c19da2809b2fa0272b04962466b77ea1.png
similarity index 100%
rename from docs/images/editingText/file-encoding.png
rename to assets/images/file-encoding-c19da2809b2fa0272b04962466b77ea1.png
diff --git a/docs/images/fileManagement/file-recovery.png b/assets/images/file-recovery-5a5349b0f89a7b80569b77ed7b04cd98.png
similarity index 100%
rename from docs/images/fileManagement/file-recovery.png
rename to assets/images/file-recovery-5a5349b0f89a7b80569b77ed7b04cd98.png
diff --git a/docs/images/fileManagement/file-tree.png b/assets/images/file-tree-892c570f63e758bd6e1b4a24c4658a71.png
similarity index 100%
rename from docs/images/fileManagement/file-tree.png
rename to assets/images/file-tree-892c570f63e758bd6e1b4a24c4658a71.png
diff --git a/docs/images/fileManagement/file-tree-context-menu-key-shortcut.png b/assets/images/file-tree-context-menu-key-shortcut-4fbbcca0c1c778a4f4753b28626ae337.png
similarity index 100%
rename from docs/images/fileManagement/file-tree-context-menu-key-shortcut.png
rename to assets/images/file-tree-context-menu-key-shortcut-4fbbcca0c1c778a4f4753b28626ae337.png
diff --git a/docs/images/fileManagement/file-tree-sort-folders-option.png b/assets/images/file-tree-sort-folders-option-94c171a477281d7c88dac73bb8ddbcc6.png
similarity index 100%
rename from docs/images/fileManagement/file-tree-sort-folders-option.png
rename to assets/images/file-tree-sort-folders-option-94c171a477281d7c88dac73bb8ddbcc6.png
diff --git a/docs/images/fileManagement/file-tree-sorted.png b/assets/images/file-tree-sorted-b12e9c2853aaed30418feb10cf19eb57.png
similarity index 100%
rename from docs/images/fileManagement/file-tree-sorted.png
rename to assets/images/file-tree-sorted-b12e9c2853aaed30418feb10cf19eb57.png
diff --git a/docs/images/CustomSnippets/filter-snippet.png b/assets/images/filter-snippet-3f007c72da08c28f513d70181731b521.png
similarity index 100%
rename from docs/images/CustomSnippets/filter-snippet.png
rename to assets/images/filter-snippet-3f007c72da08c28f513d70181731b521.png
diff --git a/docs/images/find/folder.png b/assets/images/folder-1d082044530ff0ee5776a2f2255f6f49.png
similarity index 100%
rename from docs/images/find/folder.png
rename to assets/images/folder-1d082044530ff0ee5776a2f2255f6f49.png
diff --git a/docs/images/pro/folder-selection-button.png b/assets/images/folder-selection-button-9211a4549bb50539a4ee0ffd63b8975a.png
similarity index 100%
rename from docs/images/pro/folder-selection-button.png
rename to assets/images/folder-selection-button-9211a4549bb50539a4ee0ffd63b8975a.png
diff --git a/docs/images/pro/folder-selection-dialog.png b/assets/images/folder-selection-dialog-64a3c2fb5003b60bc8eea3f419fedebe.png
similarity index 100%
rename from docs/images/pro/folder-selection-dialog.png
rename to assets/images/folder-selection-dialog-64a3c2fb5003b60bc8eea3f419fedebe.png
diff --git a/docs/images/pro/formatting-more.png b/assets/images/formatting-more-c0aa5b3a0757252c42110637508c1aa3.png
similarity index 100%
rename from docs/images/pro/formatting-more.png
rename to assets/images/formatting-more-c0aa5b3a0757252c42110637508c1aa3.png
diff --git a/docs/images/pro/formatting-toolbar.png b/assets/images/formatting-toolbar-e8a66820b21615991d02f3bb8e187306.png
similarity index 100%
rename from docs/images/pro/formatting-toolbar.png
rename to assets/images/formatting-toolbar-e8a66820b21615991d02f3bb8e187306.png
diff --git a/docs/images/git-images/get-from-git.png b/assets/images/get-from-git-c9f09b8c00dda57695fc065ace4a08ba.png
similarity index 100%
rename from docs/images/git-images/get-from-git.png
rename to assets/images/get-from-git-c9f09b8c00dda57695fc065ace4a08ba.png
diff --git a/docs/images/git-images/get-from-git-dialog.png b/assets/images/get-from-git-dialog-ca73be7458b6ad7dfbc5b9458562abf0.png
similarity index 100%
rename from docs/images/git-images/get-from-git-dialog.png
rename to assets/images/get-from-git-dialog-ca73be7458b6ad7dfbc5b9458562abf0.png
diff --git a/docs/images/git-images/git-branch.png b/assets/images/git-branch-6d1ce95f746409044e152b8944194c7a.png
similarity index 100%
rename from docs/images/git-images/git-branch.png
rename to assets/images/git-branch-6d1ce95f746409044e152b8944194c7a.png
diff --git a/docs/images/git-images/git-clone-dialog.png b/assets/images/git-clone-dialog-e5966df936decf6d03618a3123d295c3.png
similarity index 100%
rename from docs/images/git-images/git-clone-dialog.png
rename to assets/images/git-clone-dialog-e5966df936decf6d03618a3123d295c3.png
diff --git a/docs/images/git-images/git-clone-more-options.png b/assets/images/git-clone-more-options-647157d400324163161cd7663c125812.png
similarity index 100%
rename from docs/images/git-images/git-clone-more-options.png
rename to assets/images/git-clone-more-options-647157d400324163161cd7663c125812.png
diff --git a/docs/images/git-images/git-commit.png b/assets/images/git-commit-cadf7ef1960a86877135ff05f7ee5165.png
similarity index 100%
rename from docs/images/git-images/git-commit.png
rename to assets/images/git-commit-cadf7ef1960a86877135ff05f7ee5165.png
diff --git a/docs/images/git-images/git-commit-errors.png b/assets/images/git-commit-errors-95987108d89e710113b68e357fc75a7d.png
similarity index 100%
rename from docs/images/git-images/git-commit-errors.png
rename to assets/images/git-commit-errors-95987108d89e710113b68e357fc75a7d.png
diff --git a/docs/images/git-images/git-delete-remote.png b/assets/images/git-delete-remote-bf2fa7eaf6e0742800a5a54074dbaf13.png
similarity index 100%
rename from docs/images/git-images/git-delete-remote.png
rename to assets/images/git-delete-remote-bf2fa7eaf6e0742800a5a54074dbaf13.png
diff --git a/docs/images/git-images/git-diff-dialog.png b/assets/images/git-diff-dialog-64e6728aa787d37e8dad2b4edd767cda.png
similarity index 100%
rename from docs/images/git-images/git-diff-dialog.png
rename to assets/images/git-diff-dialog-64e6728aa787d37e8dad2b4edd767cda.png
diff --git a/docs/images/git-images/git-diff-icon.png b/assets/images/git-diff-icon-99207ec802e288d371a92b9e1acd452a.png
similarity index 100%
rename from docs/images/git-images/git-diff-icon.png
rename to assets/images/git-diff-icon-99207ec802e288d371a92b9e1acd452a.png
diff --git a/docs/images/git-images/git-fetch.png b/assets/images/git-fetch-fc0c766770f3d1ac3573ef0cc9794ae9.png
similarity index 100%
rename from docs/images/git-images/git-fetch.png
rename to assets/images/git-fetch-fc0c766770f3d1ac3573ef0cc9794ae9.png
diff --git a/docs/images/git-images/git-init.png b/assets/images/git-init-8b4fa883030b8b0018a2c3f9250886da.png
similarity index 100%
rename from docs/images/git-images/git-init.png
rename to assets/images/git-init-8b4fa883030b8b0018a2c3f9250886da.png
diff --git a/docs/images/git-images/git-menu.png b/assets/images/git-menu-7abfadf236379bc301d27968ef61713b.png
similarity index 100%
rename from docs/images/git-images/git-menu.png
rename to assets/images/git-menu-7abfadf236379bc301d27968ef61713b.png
diff --git a/docs/images/git-images/git-menu-from-panel.png b/assets/images/git-menu-from-panel-21267375e96c076f640af93cf6e12042.png
similarity index 100%
rename from docs/images/git-images/git-menu-from-panel.png
rename to assets/images/git-menu-from-panel-21267375e96c076f640af93cf6e12042.png
diff --git a/docs/images/git-images/git-new-branch-dialog.png b/assets/images/git-new-branch-dialog-9c263752ef9dd7e258c869ebacadf00a.png
similarity index 100%
rename from docs/images/git-images/git-new-branch-dialog.png
rename to assets/images/git-new-branch-dialog-9c263752ef9dd7e258c869ebacadf00a.png
diff --git a/docs/images/git-images/git-overview.png b/assets/images/git-overview-f251dd919a3c527f94c7efe809f2356a.png
similarity index 100%
rename from docs/images/git-images/git-overview.png
rename to assets/images/git-overview-f251dd919a3c527f94c7efe809f2356a.png
diff --git a/docs/images/git-images/git-panel.png b/assets/images/git-panel-5b7c8f0ab36655f000ddf30410ba85a0.png
similarity index 100%
rename from docs/images/git-images/git-panel.png
rename to assets/images/git-panel-5b7c8f0ab36655f000ddf30410ba85a0.png
diff --git a/docs/images/git-images/git-pull-dialog.png b/assets/images/git-pull-dialog-abea69ac10247830d71eff48deeacb56.png
similarity index 100%
rename from docs/images/git-images/git-pull-dialog.png
rename to assets/images/git-pull-dialog-abea69ac10247830d71eff48deeacb56.png
diff --git a/docs/images/git-images/git-pull.png b/assets/images/git-pull-f110a922be3a7e21825b38e523614345.png
similarity index 100%
rename from docs/images/git-images/git-pull.png
rename to assets/images/git-pull-f110a922be3a7e21825b38e523614345.png
diff --git a/docs/images/git-images/git-push.png b/assets/images/git-push-90a5d6275eedb65ae98f4cfac79d910f.png
similarity index 100%
rename from docs/images/git-images/git-push.png
rename to assets/images/git-push-90a5d6275eedb65ae98f4cfac79d910f.png
diff --git a/docs/images/git-images/git-push-error.png b/assets/images/git-push-error-0c2f8b9c01bf563461a57818f3664b51.png
similarity index 100%
rename from docs/images/git-images/git-push-error.png
rename to assets/images/git-push-error-0c2f8b9c01bf563461a57818f3664b51.png
diff --git a/docs/images/git-images/git-push-more-options.png b/assets/images/git-push-more-options-096e949f021dbca54f9e909497e6987e.png
similarity index 100%
rename from docs/images/git-images/git-push-more-options.png
rename to assets/images/git-push-more-options-096e949f021dbca54f9e909497e6987e.png
diff --git a/docs/images/git-images/git-remote.png b/assets/images/git-remote-801d26af448dead2b5299ec59b3656fd.png
similarity index 100%
rename from docs/images/git-images/git-remote.png
rename to assets/images/git-remote-801d26af448dead2b5299ec59b3656fd.png
diff --git a/docs/images/git-images/git-remote-name.png b/assets/images/git-remote-name-d561e5dcb0e2f0f503b3098067f0b890.png
similarity index 100%
rename from docs/images/git-images/git-remote-name.png
rename to assets/images/git-remote-name-d561e5dcb0e2f0f503b3098067f0b890.png
diff --git a/docs/images/git-images/git-settings-dialog.png b/assets/images/git-settings-dialog-32f4dccda01b84f0a80c85bcc061a7cd.png
similarity index 100%
rename from docs/images/git-images/git-settings-dialog.png
rename to assets/images/git-settings-dialog-32f4dccda01b84f0a80c85bcc061a7cd.png
diff --git a/docs/images/git-images/git-settings-from-file-menu.png b/assets/images/git-settings-from-file-menu-7fdb38e7382abf7402f34b461cc3fe2a.png
similarity index 100%
rename from docs/images/git-images/git-settings-from-file-menu.png
rename to assets/images/git-settings-from-file-menu-7fdb38e7382abf7402f34b461cc3fe2a.png
diff --git a/docs/images/git-images/git-settings-from-panel.png b/assets/images/git-settings-from-panel-3e504985b2d407e84c53d40bc2670908.png
similarity index 100%
rename from docs/images/git-images/git-settings-from-panel.png
rename to assets/images/git-settings-from-panel-3e504985b2d407e84c53d40bc2670908.png
diff --git a/docs/images/git-images/history-viewer.png b/assets/images/history-viewer-516735aaf90f434d2baf5e95c6c897ef.png
similarity index 100%
rename from docs/images/git-images/history-viewer.png
rename to assets/images/history-viewer-516735aaf90f434d2baf5e95c6c897ef.png
diff --git a/docs/images/git-images/history-viewer-expanded.png b/assets/images/history-viewer-expanded-94f7059b441632b9cfbf7d41af1147c3.png
similarity index 100%
rename from docs/images/git-images/history-viewer-expanded.png
rename to assets/images/history-viewer-expanded-94f7059b441632b9cfbf7d41af1147c3.png
diff --git a/docs/images/pro/hover-box.png b/assets/images/hover-box-85f3ed7552a13e5f30d85c6d8b7397f0.png
similarity index 100%
rename from docs/images/pro/hover-box.png
rename to assets/images/hover-box-85f3ed7552a13e5f30d85c6d8b7397f0.png
diff --git a/docs/images/pro/image-gallery.png b/assets/images/image-gallery-89de2617a5355346bf28b21246e90025.png
similarity index 100%
rename from docs/images/pro/image-gallery.png
rename to assets/images/image-gallery-89de2617a5355346bf28b21246e90025.png
diff --git a/docs/images/pro/image-size-dropdown.png b/assets/images/image-size-dropdown-0c5954234e73f686f9fb96d8d1972732.png
similarity index 100%
rename from docs/images/pro/image-size-dropdown.png
rename to assets/images/image-size-dropdown-0c5954234e73f686f9fb96d8d1972732.png
diff --git a/docs/images/editingText/indent-display.png b/assets/images/indent-display-6b6313994236e9d96a00e1c77684d83a.png
similarity index 100%
rename from docs/images/editingText/indent-display.png
rename to assets/images/indent-display-6b6313994236e9d96a00e1c77684d83a.png
diff --git a/docs/images/editingText/indent-lines.png b/assets/images/indent-lines-70d9e82eca5f62913c73453579959fb3.png
similarity index 100%
rename from docs/images/editingText/indent-lines.png
rename to assets/images/indent-lines-70d9e82eca5f62913c73453579959fb3.png
diff --git a/docs/images/editingColors/inlineColorEditor.png b/assets/images/inlineColorEditor-610c5be7bc6c236829f5a4a800883ceb.png
similarity index 100%
rename from docs/images/editingColors/inlineColorEditor.png
rename to assets/images/inlineColorEditor-610c5be7bc6c236829f5a4a800883ceb.png
diff --git a/docs/images/pro/insert-element.png b/assets/images/insert-element-2b7c020e0a7a55d500ed7529a171b883.png
similarity index 100%
rename from docs/images/pro/insert-element.png
rename to assets/images/insert-element-2b7c020e0a7a55d500ed7529a171b883.png
diff --git a/docs/images/pro/insert-element-custom.png b/assets/images/insert-element-custom-2d99e6a2fb736cd774ffcebbbace2db3.png
similarity index 100%
rename from docs/images/pro/insert-element-custom.png
rename to assets/images/insert-element-custom-2d99e6a2fb736cd774ffcebbbace2db3.png
diff --git a/docs/images/pro/inspect-element-hover.png b/assets/images/inspect-element-hover-7ce4a08eab7f5896b2ac7bc32e09a281.png
similarity index 100%
rename from docs/images/pro/inspect-element-hover.png
rename to assets/images/inspect-element-hover-7ce4a08eab7f5896b2ac7bc32e09a281.png
diff --git a/api/images/debugging-extensions/inspect-phnode.png b/assets/images/inspect-phnode-63ccd0f9e855fff8702bdaff5d26f029.png
similarity index 100%
rename from api/images/debugging-extensions/inspect-phnode.png
rename to assets/images/inspect-phnode-63ccd0f9e855fff8702bdaff5d26f029.png
diff --git a/docs/images/terminal/integrated-terminal-context-menu.png b/assets/images/integrated-terminal-context-menu-b8078ea73080b9ebeaa1c9919fa3fea5.png
similarity index 100%
rename from docs/images/terminal/integrated-terminal-context-menu.png
rename to assets/images/integrated-terminal-context-menu-b8078ea73080b9ebeaa1c9919fa3fea5.png
diff --git a/docs/images/Website/linuxCmd.png b/assets/images/linuxCmd-a6e2843eeb5e2b2c29d9521cc38aa05d.png
similarity index 100%
rename from docs/images/Website/linuxCmd.png
rename to assets/images/linuxCmd-a6e2843eeb5e2b2c29d9521cc38aa05d.png
diff --git a/docs/images/livePreview/lp-bolt.png b/assets/images/lp-bolt-5e56836e6a826c2bf76e1672c2f4b642.png
similarity index 100%
rename from docs/images/livePreview/lp-bolt.png
rename to assets/images/lp-bolt-5e56836e6a826c2bf76e1672c2f4b642.png
diff --git a/docs/images/livePreview/lp-browsers.png b/assets/images/lp-browsers-e82dcf48651e31731b271187ea94c283.png
similarity index 100%
rename from docs/images/livePreview/lp-browsers.png
rename to assets/images/lp-browsers-e82dcf48651e31731b271187ea94c283.png
diff --git a/docs/images/livePreview/lp-central.png b/assets/images/lp-central-4a522f465e618b9db824fa7a8d6dc664.png
similarity index 100%
rename from docs/images/livePreview/lp-central.png
rename to assets/images/lp-central-4a522f465e618b9db824fa7a8d6dc664.png
diff --git a/docs/images/livePreview/lp-left.png b/assets/images/lp-left-5df2df93e03b09497cbcf33548654f4e.png
similarity index 100%
rename from docs/images/livePreview/lp-left.png
rename to assets/images/lp-left-5df2df93e03b09497cbcf33548654f4e.png
diff --git a/docs/images/livePreview/lp-menu.png b/assets/images/lp-menu-d0dd11ec7c4873ba2c1b901a4897cb7b.png
similarity index 100%
rename from docs/images/livePreview/lp-menu.png
rename to assets/images/lp-menu-d0dd11ec7c4873ba2c1b901a4897cb7b.png
diff --git a/docs/images/livePreview/lp-mode.png b/assets/images/lp-mode-ac20eab6478729ef3661377fc0533495.png
similarity index 100%
rename from docs/images/livePreview/lp-mode.png
rename to assets/images/lp-mode-ac20eab6478729ef3661377fc0533495.png
diff --git a/docs/images/livePreview/lp-right.png b/assets/images/lp-right-826911aa582d2e6da60f63d856916800.png
similarity index 100%
rename from docs/images/livePreview/lp-right.png
rename to assets/images/lp-right-826911aa582d2e6da60f63d856916800.png
diff --git a/docs/images/livePreview/lp-toolbar.png b/assets/images/lp-toolbar-002533c583afe550035a0b5b1b9b2ae4.png
similarity index 100%
rename from docs/images/livePreview/lp-toolbar.png
rename to assets/images/lp-toolbar-002533c583afe550035a0b5b1b9b2ae4.png
diff --git a/docs/images/pro/markdown-blocks-lists.png b/assets/images/markdown-blocks-lists-05f6e56c1c32777650d6bac292ffdfcb.png
similarity index 100%
rename from docs/images/pro/markdown-blocks-lists.png
rename to assets/images/markdown-blocks-lists-05f6e56c1c32777650d6bac292ffdfcb.png
diff --git a/docs/images/pro/markdown-edit-button.png b/assets/images/markdown-edit-button-c7617e36423b479db1329cc9047b3b09.png
similarity index 100%
rename from docs/images/pro/markdown-edit-button.png
rename to assets/images/markdown-edit-button-c7617e36423b479db1329cc9047b3b09.png
diff --git a/docs/images/pro/markdown-format-bar.png b/assets/images/markdown-format-bar-4e9463570a7dbde89055cf7fa37387ff.png
similarity index 100%
rename from docs/images/pro/markdown-format-bar.png
rename to assets/images/markdown-format-bar-4e9463570a7dbde89055cf7fa37387ff.png
diff --git a/docs/images/pro/markdown-image-options.png b/assets/images/markdown-image-options-4c255a61d000ea632a1432bc33e9535c.png
similarity index 100%
rename from docs/images/pro/markdown-image-options.png
rename to assets/images/markdown-image-options-4c255a61d000ea632a1432bc33e9535c.png
diff --git a/docs/images/livePreview/markdown-preview.png b/assets/images/markdown-preview-61539cdd0c30736b4f8c7c5088b12912.png
similarity index 100%
rename from docs/images/livePreview/markdown-preview.png
rename to assets/images/markdown-preview-61539cdd0c30736b4f8c7c5088b12912.png
diff --git a/docs/images/pro/markdown-slash-menu.png b/assets/images/markdown-slash-menu-489e1dcbdb1f213ecdaabb3e5ccb0aed.png
similarity index 100%
rename from docs/images/pro/markdown-slash-menu.png
rename to assets/images/markdown-slash-menu-489e1dcbdb1f213ecdaabb3e5ccb0aed.png
diff --git a/docs/images/pro/markdown-theme-toggle.png b/assets/images/markdown-theme-toggle-dedf458a2f30b1ec49a46e79dffb751b.png
similarity index 100%
rename from docs/images/pro/markdown-theme-toggle.png
rename to assets/images/markdown-theme-toggle-dedf458a2f30b1ec49a46e79dffb751b.png
diff --git a/docs/images/pro/measurements.png b/assets/images/measurements-b9b5af176bc880f6e7c0f8042c8df901.png
similarity index 100%
rename from docs/images/pro/measurements.png
rename to assets/images/measurements-b9b5af176bc880f6e7c0f8042c8df901.png
diff --git a/docs/images/keyboard/menu.png b/assets/images/menu-28052aafcbb7fd7dffdde7e3d78a5a7b.png
similarity index 100%
rename from docs/images/keyboard/menu.png
rename to assets/images/menu-28052aafcbb7fd7dffdde7e3d78a5a7b.png
diff --git a/api/08-How-To/images/menu-item-before-after.png b/assets/images/menu-item-before-after-cbc0862108df63e0adb2b72ce2c286e5.png
similarity index 100%
rename from api/08-How-To/images/menu-item-before-after.png
rename to assets/images/menu-item-before-after-cbc0862108df63e0adb2b72ce2c286e5.png
diff --git a/api/08-How-To/images/menu-item-example.png b/assets/images/menu-item-example-178f27b8a6a5c928f60fb836bd1ec8c6.png
similarity index 100%
rename from api/08-How-To/images/menu-item-example.png
rename to assets/images/menu-item-example-178f27b8a6a5c928f60fb836bd1ec8c6.png
diff --git a/api/08-How-To/images/menu-item-first.png b/assets/images/menu-item-first-92bc1b5b3f6a6480eef573a493681ded.png
similarity index 100%
rename from api/08-How-To/images/menu-item-first.png
rename to assets/images/menu-item-first-92bc1b5b3f6a6480eef573a493681ded.png
diff --git a/docs/images/git-images/merge-branch.png b/assets/images/merge-branch-6869bb2da694746451b0ccad893ca783.png
similarity index 100%
rename from docs/images/git-images/merge-branch.png
rename to assets/images/merge-branch-6869bb2da694746451b0ccad893ca783.png
diff --git a/docs/images/git-images/merge-branch-dialog.png b/assets/images/merge-branch-dialog-1c07f61b94640c7ea80c133d2d4cfaac.png
similarity index 100%
rename from docs/images/git-images/merge-branch-dialog.png
rename to assets/images/merge-branch-dialog-1c07f61b94640c7ea80c133d2d4cfaac.png
diff --git a/docs/images/popular-extensions/minimap.png b/assets/images/minimap-0f5bc4e16371590e00a86db9fd97f112.png
similarity index 100%
rename from docs/images/popular-extensions/minimap.png
rename to assets/images/minimap-0f5bc4e16371590e00a86db9fd97f112.png
diff --git a/docs/images/editingText/modify-preferences.png b/assets/images/modify-preferences-6994d4190d47635929047a8206eeb539.png
similarity index 100%
rename from docs/images/editingText/modify-preferences.png
rename to assets/images/modify-preferences-6994d4190d47635929047a8206eeb539.png
diff --git a/docs/images/pro/more-options-dropdown.png b/assets/images/more-options-dropdown-2b02c463ead75eb94a7591daabc09e03.png
similarity index 100%
rename from docs/images/pro/more-options-dropdown.png
rename to assets/images/more-options-dropdown-2b02c463ead75eb94a7591daabc09e03.png
diff --git a/docs/images/git-images/move-to-next-change.png b/assets/images/move-to-next-change-e5d4a9e30f81267735c3bb2542bf2948.png
similarity index 100%
rename from docs/images/git-images/move-to-next-change.png
rename to assets/images/move-to-next-change-e5d4a9e30f81267735c3bb2542bf2948.png
diff --git a/docs/images/git-images/move-to-previous-change.png b/assets/images/move-to-previous-change-da5a34c57064f6eb4ed6f64d5e509caf.png
similarity index 100%
rename from docs/images/git-images/move-to-previous-change.png
rename to assets/images/move-to-previous-change-da5a34c57064f6eb4ed6f64d5e509caf.png
diff --git a/docs/images/find/new-exclusion.png b/assets/images/new-exclusion-581fe6d26f53116e0f5267c53bc985ef.png
similarity index 100%
rename from docs/images/find/new-exclusion.png
rename to assets/images/new-exclusion-581fe6d26f53116e0f5267c53bc985ef.png
diff --git a/docs/images/editingText/no-distractions.png b/assets/images/no-distractions-55a29450d30f7cd7c911ef741ee35278.png
similarity index 100%
rename from docs/images/editingText/no-distractions.png
rename to assets/images/no-distractions-55a29450d30f7cd7c911ef741ee35278.png
diff --git a/docs/images/number-dial.gif b/assets/images/number-dial-a65a9e9c4dde31e902c401a5d20b3e3e.gif
similarity index 100%
rename from docs/images/number-dial.gif
rename to assets/images/number-dial-a65a9e9c4dde31e902c401a5d20b3e3e.gif
diff --git a/api/images/creating-themes/open-cloned-repo.png b/assets/images/open-cloned-repo-c85f200e030581f71736637564dc05ed.png
similarity index 100%
rename from api/images/creating-themes/open-cloned-repo.png
rename to assets/images/open-cloned-repo-c85f200e030581f71736637564dc05ed.png
diff --git a/docs/images/quickStartProject/open-folder.png b/assets/images/open-folder-1e8feedd8865ec8bec14d3989fe0eceb.png
similarity index 100%
rename from docs/images/quickStartProject/open-folder.png
rename to assets/images/open-folder-1e8feedd8865ec8bec14d3989fe0eceb.png
diff --git a/docs/images/fileManagement/overflow-button.png b/assets/images/overflow-button-6f38035e9a745d362c320de06294c560.png
similarity index 100%
rename from docs/images/fileManagement/overflow-button.png
rename to assets/images/overflow-button-6f38035e9a745d362c320de06294c560.png
diff --git a/docs/images/keyboard/panel.png b/assets/images/panel-3e18440614aedd37e8697bfb6f7b8ff5.png
similarity index 100%
rename from docs/images/keyboard/panel.png
rename to assets/images/panel-3e18440614aedd37e8697bfb6f7b8ff5.png
diff --git a/docs/images/phpLivePreview/phpCustomServer.png b/assets/images/phpCustomServer-23ae891bea40924e86bafd7273ac64b3.png
similarity index 100%
rename from docs/images/phpLivePreview/phpCustomServer.png
rename to assets/images/phpCustomServer-23ae891bea40924e86bafd7273ac64b3.png
diff --git a/api/08-How-To/images/plugin-panel-example.png b/assets/images/plugin-panel-example-cdf9fbb9ccd3db750380862996b1d82c.png
similarity index 100%
rename from api/08-How-To/images/plugin-panel-example.png
rename to assets/images/plugin-panel-example-cdf9fbb9ccd3db750380862996b1d82c.png
diff --git a/api/08-How-To/images/plugin-panel.png b/assets/images/plugin-panel-ffdc0e6edeff5e1b9c10db5957ee911b.png
similarity index 100%
rename from api/08-How-To/images/plugin-panel.png
rename to assets/images/plugin-panel-ffdc0e6edeff5e1b9c10db5957ee911b.png
diff --git a/docs/images/editingText/preferences.png b/assets/images/preferences-ebc0e5bb9a61d63304ec17b66910ee4d.png
similarity index 100%
rename from docs/images/editingText/preferences.png
rename to assets/images/preferences-ebc0e5bb9a61d63304ec17b66910ee4d.png
diff --git a/docs/images/fileManagement/preview-tab.png b/assets/images/preview-tab-7e30256eb0916b472a190e95afba3d7c.png
similarity index 100%
rename from docs/images/fileManagement/preview-tab.png
rename to assets/images/preview-tab-7e30256eb0916b472a190e95afba3d7c.png
diff --git a/docs/images/editingColors/previously-used-colors.png b/assets/images/previously-used-colors-abb1767404546f7b8c3b552a626efbee.png
similarity index 100%
rename from docs/images/editingColors/previously-used-colors.png
rename to assets/images/previously-used-colors-abb1767404546f7b8c3b552a626efbee.png
diff --git a/api/images/publishing-extensions/publish-failed.png b/assets/images/publish-failed-ce5fb40d3fb2a7179f6faec794bf46f9.png
similarity index 100%
rename from api/images/publishing-extensions/publish-failed.png
rename to assets/images/publish-failed-ce5fb40d3fb2a7179f6faec794bf46f9.png
diff --git a/docs/images/git-images/push-dialog.png b/assets/images/push-dialog-17783f22101f31e587f9ae5b94a65bbb.png
similarity index 100%
rename from docs/images/git-images/push-dialog.png
rename to assets/images/push-dialog-17783f22101f31e587f9ae5b94a65bbb.png
diff --git a/docs/images/editingText/quick-docs.png b/assets/images/quick-docs-f23cc8636c9a7f8aaec899a6196ed91d.png
similarity index 100%
rename from docs/images/editingText/quick-docs.png
rename to assets/images/quick-docs-f23cc8636c9a7f8aaec899a6196ed91d.png
diff --git a/docs/images/QuickEdit/quickedit.png b/assets/images/quickedit-aee08cd2747b91204c7586c408f3d331.png
similarity index 100%
rename from docs/images/QuickEdit/quickedit.png
rename to assets/images/quickedit-aee08cd2747b91204c7586c408f3d331.png
diff --git a/docs/images/QuickEdit/quickeditPanel.png b/assets/images/quickeditPanel-606ea89d20a31a1bb0c145ce3ec87ec5.png
similarity index 100%
rename from docs/images/QuickEdit/quickeditPanel.png
rename to assets/images/quickeditPanel-606ea89d20a31a1bb0c145ce3ec87ec5.png
diff --git a/docs/images/QuickEdit/quickeditcontext.png b/assets/images/quickeditcontext-326718e201139fde2f79c6cf0111d6ac.png
similarity index 100%
rename from docs/images/QuickEdit/quickeditcontext.png
rename to assets/images/quickeditcontext-326718e201139fde2f79c6cf0111d6ac.png
diff --git a/docs/images/fileManagement/recent-files.png b/assets/images/recent-files-a9fa5e954b0315e12950f7f5b391c16c.png
similarity index 100%
rename from docs/images/fileManagement/recent-files.png
rename to assets/images/recent-files-a9fa5e954b0315e12950f7f5b391c16c.png
diff --git a/docs/images/quickStartProject/recent-projects.png b/assets/images/recent-projects-b5fe1561288247533c92ef8847c086ff.png
similarity index 100%
rename from docs/images/quickStartProject/recent-projects.png
rename to assets/images/recent-projects-b5fe1561288247533c92ef8847c086ff.png
diff --git a/docs/images/git-images/refresh-panel.png b/assets/images/refresh-panel-a55c088bfc0cb3d6537b80d7a4584af6.png
similarity index 100%
rename from docs/images/git-images/refresh-panel.png
rename to assets/images/refresh-panel-a55c088bfc0cb3d6537b80d7a4584af6.png
diff --git a/api/images/publishing-extensions/release-github.png b/assets/images/release-github-f4cc9b3b5f249a7ba91c2d5d2a3d6ac9.png
similarity index 100%
rename from api/images/publishing-extensions/release-github.png
rename to assets/images/release-github-f4cc9b3b5f249a7ba91c2d5d2a3d6ac9.png
diff --git a/docs/images/quickStartProject/reopen-start-project-dialog.png b/assets/images/reopen-start-project-dialog-34f189a313925385538f545d50b35287.png
similarity index 100%
rename from docs/images/quickStartProject/reopen-start-project-dialog.png
rename to assets/images/reopen-start-project-dialog-34f189a313925385538f545d50b35287.png
diff --git a/docs/images/keyboard/reset.png b/assets/images/reset-474204405c457189d9fcacffde8b7cc7.png
similarity index 100%
rename from docs/images/keyboard/reset.png
rename to assets/images/reset-474204405c457189d9fcacffde8b7cc7.png
diff --git a/docs/images/fileManagement/save-file-dialog.png b/assets/images/save-file-dialog-694af7f69c0561a55f0cee916b5e5fe6.png
similarity index 100%
rename from docs/images/fileManagement/save-file-dialog.png
rename to assets/images/save-file-dialog-694af7f69c0561a55f0cee916b5e5fe6.png
diff --git a/docs/images/find/search_in_files.png b/assets/images/search_in_files-1e116404456666ade0eed9fa1c542502.png
similarity index 100%
rename from docs/images/find/search_in_files.png
rename to assets/images/search_in_files-1e116404456666ade0eed9fa1c542502.png
diff --git a/docs/images/pro/select-from-device.png b/assets/images/select-from-device-97660034efd5953feeb9ced80cef956b.png
similarity index 100%
rename from docs/images/pro/select-from-device.png
rename to assets/images/select-from-device-97660034efd5953feeb9ced80cef956b.png
diff --git a/docs/images/pro/select-parent.png b/assets/images/select-parent-daaae173d47bdb6c7922f4d73bdf7d92.png
similarity index 100%
rename from docs/images/pro/select-parent.png
rename to assets/images/select-parent-daaae173d47bdb6c7922f4d73bdf7d92.png
diff --git a/docs/images/livePreview/settings-dialog.png b/assets/images/settings-dialog-5b320c38bc8850879db44d36b26a5af4.png
similarity index 100%
rename from docs/images/livePreview/settings-dialog.png
rename to assets/images/settings-dialog-5b320c38bc8850879db44d36b26a5af4.png
diff --git a/docs/images/livePreview/settings-gear.png b/assets/images/settings-gear-97bc597b071bd9f9087b0f3a358867ee.png
similarity index 100%
rename from docs/images/livePreview/settings-gear.png
rename to assets/images/settings-gear-97bc597b071bd9f9087b0f3a358867ee.png
diff --git a/docs/images/livePreview/settings-menu.png b/assets/images/settings-menu-667c5d35a84a0c582170399457c0560b.png
similarity index 100%
rename from docs/images/livePreview/settings-menu.png
rename to assets/images/settings-menu-667c5d35a84a0c582170399457c0560b.png
diff --git a/docs/images/git-images/show-file-history.png b/assets/images/show-file-history-5376f680661735e52ad853c9b7801a6f.png
similarity index 100%
rename from docs/images/git-images/show-file-history.png
rename to assets/images/show-file-history-5376f680661735e52ad853c9b7801a6f.png
diff --git a/docs/images/git-images/show-history.png b/assets/images/show-history-41f42182e71c7a1041d0d3cc564b5d81.png
similarity index 100%
rename from docs/images/git-images/show-history.png
rename to assets/images/show-history-41f42182e71c7a1041d0d3cc564b5d81.png
diff --git a/docs/images/beautifyCode/singleAttributePerLine-false.png b/assets/images/singleAttributePerLine-false-2813438e4f99ec944ceb3f903ba7dd9f.png
similarity index 100%
rename from docs/images/beautifyCode/singleAttributePerLine-false.png
rename to assets/images/singleAttributePerLine-false-2813438e4f99ec944ceb3f903ba7dd9f.png
diff --git a/docs/images/beautifyCode/singleAttributePerLine-true.png b/assets/images/singleAttributePerLine-true-16ca7e6cae6aa418a6a57e214175630b.png
similarity index 100%
rename from docs/images/beautifyCode/singleAttributePerLine-true.png
rename to assets/images/singleAttributePerLine-true-16ca7e6cae6aa418a6a57e214175630b.png
diff --git a/docs/images/beautifyCode/singleQuotes-false.png b/assets/images/singleQuotes-false-2ebb32c4c58a77cd4ef3e8a9f7c06cf7.png
similarity index 100%
rename from docs/images/beautifyCode/singleQuotes-false.png
rename to assets/images/singleQuotes-false-2ebb32c4c58a77cd4ef3e8a9f7c06cf7.png
diff --git a/docs/images/beautifyCode/singleQuotes-true.png b/assets/images/singleQuotes-true-cfa5db909f6d80e807c8b75697db6c45.png
similarity index 100%
rename from docs/images/beautifyCode/singleQuotes-true.png
rename to assets/images/singleQuotes-true-cfa5db909f6d80e807c8b75697db6c45.png
diff --git a/docs/images/CustomSnippets/snippet-cursor.png b/assets/images/snippet-cursor-00a4a6a76bb23749a4673c91bbbe485b.png
similarity index 100%
rename from docs/images/CustomSnippets/snippet-cursor.png
rename to assets/images/snippet-cursor-00a4a6a76bb23749a4673c91bbbe485b.png
diff --git a/docs/images/fileManagement/split-panes-tabs.png b/assets/images/split-panes-tabs-d27187f22855c61ac5a8b03e20ef7a54.png
similarity index 100%
rename from docs/images/fileManagement/split-panes-tabs.png
rename to assets/images/split-panes-tabs-d27187f22855c61ac5a8b03e20ef7a54.png
diff --git a/docs/images/git-images/stage-files.png b/assets/images/stage-files-e8f3109e21e3324ced10f59ce47933cf.png
similarity index 100%
rename from docs/images/git-images/stage-files.png
rename to assets/images/stage-files-e8f3109e21e3324ced10f59ce47933cf.png
diff --git a/docs/images/git-images/start-project.png b/assets/images/start-project-b427bc5dc33af5911c515ba0cd68b519.png
similarity index 100%
rename from docs/images/git-images/start-project.png
rename to assets/images/start-project-b427bc5dc33af5911c515ba0cd68b519.png
diff --git a/docs/images/quickStartProject/start-project-dialog.png b/assets/images/start-project-dialog-462f0136960138e7e86cba28aa176598.png
similarity index 100%
rename from docs/images/quickStartProject/start-project-dialog.png
rename to assets/images/start-project-dialog-462f0136960138e7e86cba28aa176598.png
diff --git a/api/08-How-To/images/submenu.png b/assets/images/submenu-e57b65d4816fd199d92649f2031c9d9d.png
similarity index 100%
rename from api/08-How-To/images/submenu.png
rename to assets/images/submenu-e57b65d4816fd199d92649f2031c9d9d.png
diff --git a/docs/images/syntaxHighlighting/syntax-highlighting-add.png b/assets/images/syntax-highlighting-add-771104a73d6b3a3a81b2ff8d63bd44bc.png
similarity index 100%
rename from docs/images/syntaxHighlighting/syntax-highlighting-add.png
rename to assets/images/syntax-highlighting-add-771104a73d6b3a3a81b2ff8d63bd44bc.png
diff --git a/docs/images/syntaxHighlighting/syntax-highlighting.png b/assets/images/syntax-highlighting-fdcfc81f787064eca7617b65b29c3163.png
similarity index 100%
rename from docs/images/syntaxHighlighting/syntax-highlighting.png
rename to assets/images/syntax-highlighting-fdcfc81f787064eca7617b65b29c3163.png
diff --git a/docs/images/syntaxHighlighting/syntax-highlighting-material-color-light-theme.png b/assets/images/syntax-highlighting-material-color-light-theme-0d0b1e4517b57cbc081c3c4d7a0712f2.png
similarity index 100%
rename from docs/images/syntaxHighlighting/syntax-highlighting-material-color-light-theme.png
rename to assets/images/syntax-highlighting-material-color-light-theme-0d0b1e4517b57cbc081c3c4d7a0712f2.png
diff --git a/docs/images/syntaxHighlighting/syntax-highlighting-monokai-dark-soda-theme.png b/assets/images/syntax-highlighting-monokai-dark-soda-theme-89b2be9da19f7aa850d3024a76c94007.png
similarity index 100%
rename from docs/images/syntaxHighlighting/syntax-highlighting-monokai-dark-soda-theme.png
rename to assets/images/syntax-highlighting-monokai-dark-soda-theme-89b2be9da19f7aa850d3024a76c94007.png
diff --git a/docs/images/fileManagement/tab-bar.png b/assets/images/tab-bar-801b0cfbb476f004a8e738a49d8ae35a.png
similarity index 100%
rename from docs/images/fileManagement/tab-bar.png
rename to assets/images/tab-bar-801b0cfbb476f004a8e738a49d8ae35a.png
diff --git a/docs/images/fileManagement/tab-bar-context-menu.png b/assets/images/tab-bar-context-menu-e8bc3b175a557e12e75204d3e9c626b8.png
similarity index 100%
rename from docs/images/fileManagement/tab-bar-context-menu.png
rename to assets/images/tab-bar-context-menu-e8bc3b175a557e12e75204d3e9c626b8.png
diff --git a/docs/images/fileManagement/tab-bar-git.png b/assets/images/tab-bar-git-811c82fa61907d6bd9ad9fdd7876e9bf.png
similarity index 100%
rename from docs/images/fileManagement/tab-bar-git.png
rename to assets/images/tab-bar-git-811c82fa61907d6bd9ad9fdd7876e9bf.png
diff --git a/docs/images/fileManagement/tab-bar-main.png b/assets/images/tab-bar-main-b5cca0dc25c6c679dab5b475a790df04.png
similarity index 100%
rename from docs/images/fileManagement/tab-bar-main.png
rename to assets/images/tab-bar-main-b5cca0dc25c6c679dab5b475a790df04.png
diff --git a/docs/images/terminal/terminal-tabs.png b/assets/images/terminal-tabs-024d68ec2b11e757bebb7293503e4457.png
similarity index 100%
rename from docs/images/terminal/terminal-tabs.png
rename to assets/images/terminal-tabs-024d68ec2b11e757bebb7293503e4457.png
diff --git a/api/images/creating-themes/theme-template-repo.png b/assets/images/theme-template-repo-8f28670371a15845e05568947b6a8ae2.png
similarity index 100%
rename from api/images/creating-themes/theme-template-repo.png
rename to assets/images/theme-template-repo-8f28670371a15845e05568947b6a8ae2.png
diff --git a/docs/images/editingText/themes-settings-font.png b/assets/images/themes-settings-font-c1bd03068320c72db68189255677bc3e.png
similarity index 100%
rename from docs/images/editingText/themes-settings-font.png
rename to assets/images/themes-settings-font-c1bd03068320c72db68189255677bc3e.png
diff --git a/docs/images/editingText/themes-settings-line-height.png b/assets/images/themes-settings-line-height-19fc715ce5632a4fcb08ebcd78598900.png
similarity index 100%
rename from docs/images/editingText/themes-settings-line-height.png
rename to assets/images/themes-settings-line-height-19fc715ce5632a4fcb08ebcd78598900.png
diff --git a/docs/images/editingText/themes-settings-scroll-sensitivity.png b/assets/images/themes-settings-scroll-sensitivity-c79a1bcf395d79dc3c603733ce5e8279.png
similarity index 100%
rename from docs/images/editingText/themes-settings-scroll-sensitivity.png
rename to assets/images/themes-settings-scroll-sensitivity-c79a1bcf395d79dc3c603733ce5e8279.png
diff --git a/docs/images/editingText/themes-settings-theme.png b/assets/images/themes-settings-theme-36806d853065f560f3336d8d64b3462c.png
similarity index 100%
rename from docs/images/editingText/themes-settings-theme.png
rename to assets/images/themes-settings-theme-36806d853065f560f3336d8d64b3462c.png
diff --git a/docs/images/extensions/themes-tab.png b/assets/images/themes-tab-8a777fbb22571d147609b325b6c18273.png
similarity index 100%
rename from docs/images/extensions/themes-tab.png
rename to assets/images/themes-tab-8a777fbb22571d147609b325b6c18273.png
diff --git a/docs/images/Emmet/toggle-emmet.png b/assets/images/toggle-emmet-9566153c219ead2bc651fb62d58853f6.png
similarity index 100%
rename from docs/images/Emmet/toggle-emmet.png
rename to assets/images/toggle-emmet-9566153c219ead2bc651fb62d58853f6.png
diff --git a/docs/images/pro/tools.png b/assets/images/tools-4da783777a189880077404fa13ec5b8e.png
similarity index 100%
rename from docs/images/pro/tools.png
rename to assets/images/tools-4da783777a189880077404fa13ec5b8e.png
diff --git a/docs/images/beautifyCode/trailingComma-all.png b/assets/images/trailingComma-all-d7612732831ca0714af8ed936c6aa2fb.png
similarity index 100%
rename from docs/images/beautifyCode/trailingComma-all.png
rename to assets/images/trailingComma-all-d7612732831ca0714af8ed936c6aa2fb.png
diff --git a/docs/images/beautifyCode/trailingComma-es5.png b/assets/images/trailingComma-es5-bab95c16817f40598bc90a5d50ae0e2e.png
similarity index 100%
rename from docs/images/beautifyCode/trailingComma-es5.png
rename to assets/images/trailingComma-es5-bab95c16817f40598bc90a5d50ae0e2e.png
diff --git a/docs/images/beautifyCode/trailingComma-none.png b/assets/images/trailingComma-none-8968557a47087024c5a4121896440004.png
similarity index 100%
rename from docs/images/beautifyCode/trailingComma-none.png
rename to assets/images/trailingComma-none-8968557a47087024c5a4121896440004.png
diff --git a/docs/images/git-images/view-authors.png b/assets/images/view-authors-3819eabc8819a8af5e8f2d38ad7628de.png
similarity index 100%
rename from docs/images/git-images/view-authors.png
rename to assets/images/view-authors-3819eabc8819a8af5e8f2d38ad7628de.png
diff --git a/docs/images/edu/vol-license.png b/assets/images/vol-license-70d2acf87c6f61d4db2b4d598f6b7979.png
similarity index 100%
rename from docs/images/edu/vol-license.png
rename to assets/images/vol-license-70d2acf87c6f61d4db2b4d598f6b7979.png
diff --git a/docs/images/pro/width-ruler.png b/assets/images/width-ruler-8790707bec88b6ec20c43dfa30d64b67.png
similarity index 100%
rename from docs/images/pro/width-ruler.png
rename to assets/images/width-ruler-8790707bec88b6ec20c43dfa30d64b67.png
diff --git a/docs/images/fileManagement/working-files-context-menu.png b/assets/images/working-files-context-menu-2b8e8e731f0099a09504e0a395506965.png
similarity index 100%
rename from docs/images/fileManagement/working-files-context-menu.png
rename to assets/images/working-files-context-menu-2b8e8e731f0099a09504e0a395506965.png
diff --git a/docs/images/fileManagement/working-files.png b/assets/images/working-files-f14ea4ee59954cf357a0ef3f973326c8.png
similarity index 100%
rename from docs/images/fileManagement/working-files.png
rename to assets/images/working-files-f14ea4ee59954cf357a0ef3f973326c8.png
diff --git a/docs/images/fileManagement/working-files-split-panes.png b/assets/images/working-files-split-panes-7e6ad66f3b93bbf1c1fba9d9f191aa19.png
similarity index 100%
rename from docs/images/fileManagement/working-files-split-panes.png
rename to assets/images/working-files-split-panes-7e6ad66f3b93bbf1c1fba9d9f191aa19.png
diff --git a/assets/js/0058b4c6.c389e68a.js b/assets/js/0058b4c6.c389e68a.js
new file mode 100644
index 00000000..5f701221
--- /dev/null
+++ b/assets/js/0058b4c6.c389e68a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[849],{86164:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"category","label":"Getting Started","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/intro","label":"Installation Guide","docId":"Getting Started/installation","unlisted":false},{"type":"link","href":"/docs/quick-start-project","label":"Quick Start Project","docId":"Getting Started/quick-start-project","unlisted":false}],"href":"/docs/what-is-phoenix-code"},{"type":"category","label":"Live Preview","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/design-mode","label":"Design Mode","docId":"Live Preview/design-mode","unlisted":false},{"type":"link","href":"/docs/Pro Features/live-preview-edit","label":"Live Preview Edit","docId":"Live Preview/live-preview-edit","unlisted":false},{"type":"link","href":"/docs/Pro Features/device-preview","label":"Device Preview","docId":"Live Preview/device-preview","unlisted":false},{"type":"link","href":"/docs/Pro Features/measurements","label":"Measurements","docId":"Live Preview/measurements","unlisted":false},{"type":"link","href":"/docs/Pro Features/image-gallery","label":"Image Gallery","docId":"Live Preview/image-gallery","unlisted":false},{"type":"link","href":"/docs/Pro Features/markdown-editor","label":"Markdown Editor","docId":"Live Preview/markdown-editor","unlisted":false},{"type":"link","href":"/docs/Features/Live Preview/php-live-preview","label":"PHP Live Preview Setup","docId":"Live Preview/php-live-preview","unlisted":false},{"type":"link","href":"/docs/Features/Live Preview/live-preview-settings","label":"Custom Live Preview Server","docId":"Live Preview/live-preview-settings","unlisted":false}],"href":"/docs/Features/Live Preview"},{"type":"link","href":"/docs/Pro Features/ai-chat","label":"AI","docId":"ai","unlisted":false},{"type":"category","label":"Editing & Code","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/editing-text","label":"Editing Text","docId":"Editing & Code/editing-text","unlisted":false},{"type":"link","href":"/docs/editing-colors","label":"Editing Colors","docId":"Editing & Code/editing-colors","unlisted":false},{"type":"link","href":"/docs/Features/quick-edit","label":"Quick Edit","docId":"Editing & Code/quick-edit","unlisted":false},{"type":"link","href":"/docs/Features/syntax-highlighting","label":"Syntax Highlighting","docId":"Editing & Code/syntax-highlighting","unlisted":false},{"type":"link","href":"/docs/Features/emmet","label":"Emmet","docId":"Editing & Code/emmet","unlisted":false},{"type":"link","href":"/docs/Features/custom-snippets","label":"Custom Snippets","docId":"Editing & Code/custom-snippets","unlisted":false},{"type":"link","href":"/docs/Features/beautify-code","label":"Beautify Code","docId":"Editing & Code/beautify-code","unlisted":false}]},{"type":"category","label":"Workspace","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/file-management","label":"File Management","docId":"Workspace/file-management","unlisted":false},{"type":"link","href":"/docs/Features/find-in-files","label":"Find In Files","docId":"Workspace/find-in-files","unlisted":false},{"type":"link","href":"/docs/customizing-editor","label":"Customizing the Editor","docId":"Workspace/customizing-editor","unlisted":false},{"type":"link","href":"/docs/Features/keyboard-shortcuts","label":"Keyboard Shortcuts","docId":"Workspace/keyboard-shortcuts","unlisted":false},{"type":"link","href":"/docs/Features/terminal","label":"Terminal","docId":"Workspace/terminal","unlisted":false},{"type":"link","href":"/docs/Features/git","label":"Git","docId":"Workspace/git","unlisted":false},{"type":"link","href":"/docs/extensions","label":"Extensions","docId":"Workspace/extensions","unlisted":false}]},{"type":"category","label":"Code Quality","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/Features/Problems Panel/html-lint","label":"HTML Validator","docId":"Code Quality/html-lint","unlisted":false},{"type":"link","href":"/docs/Features/Problems Panel/ESLint","label":"ESLint for Javascript Problems","docId":"Code Quality/ESLint","unlisted":false}]},{"type":"category","label":"Schools & Workplaces","collapsible":true,"collapsed":true,"items":[{"type":"link","href":"/docs/phoenix-pro-school","label":"Phoenix Pro for Education (Free)","docId":"Schools & Workplaces/phoenix-pro-for-education","unlisted":false},{"type":"link","href":"/docs/control-ai","label":"AI Control For School And Work","docId":"Schools & Workplaces/ai-control","unlisted":false}]}]},"docs":{"ai":{"id":"ai","title":"AI","description":"Upgrade to Phoenix Code Pro to access this feature.","sidebar":"tutorialSidebar"},"Code Quality/ESLint":{"id":"Code Quality/ESLint","title":"ESLint for Javascript Problems","description":"Phoenix Code provides a comprehensive interface for identifying and resolving","sidebar":"tutorialSidebar"},"Code Quality/html-lint":{"id":"Code Quality/html-lint","title":"HTML Validator","description":"HTML Validator helps you find errors when you open or edit an HTML file. E.g.","sidebar":"tutorialSidebar"},"Editing & Code/beautify-code":{"id":"Editing & Code/beautify-code","title":"Beautify Code","description":"The Beautify Code feature ensures your code is consistently formatted, improving readability and maintainability. It automatically aligns your code with your preferred style, taking into account indentation, spacing, and other formatting rules.","sidebar":"tutorialSidebar"},"Editing & Code/custom-snippets":{"id":"Editing & Code/custom-snippets","title":"Custom Snippets","description":"Custom Snippets let you create your own reusable code hints. You can define short abbreviations that expand into full code snippets when selected from the code hints that appear as you type. In the code hint, Phoenix Code displays a small Snippet label on the right, indicating that the hint comes from custom snippets.","sidebar":"tutorialSidebar"},"Editing & Code/editing-colors":{"id":"Editing & Code/editing-colors","title":"Editing Colors","description":"This section provides an overview of the core color editing features in Phoenix Code.","sidebar":"tutorialSidebar"},"Editing & Code/editing-text":{"id":"Editing & Code/editing-text","title":"Editing Text","description":"This section provides an overview of the core text and code editing features in Phoenix Code.","sidebar":"tutorialSidebar"},"Editing & Code/emmet":{"id":"Editing & Code/emmet","title":"Emmet","description":"Emmet helps you quickly expand shorthand abbreviations into full code blocks. When you type an Emmet-compatible abbreviation, Phoenix Code displays a code hint with the abbreviation text and a small Emmet icon on the right, indicating that the hint comes from Emmet. Selecting the hint expands it into a complete code snippet.","sidebar":"tutorialSidebar"},"Editing & Code/quick-edit":{"id":"Editing & Code/quick-edit","title":"Quick Edit","description":"The Quick Edit feature in Phoenix Code allows you to edit CSS files directly within HTML files. This integration helps you focus on one file at a time, reducing distractions. Using Quick Edit with the Live Preview function provides immediate feedback on your changes, allowing you to adjust your CSS efficiently.","sidebar":"tutorialSidebar"},"Editing & Code/syntax-highlighting":{"id":"Editing & Code/syntax-highlighting","title":"Syntax Highlighting","description":"Syntax highlighting improves code readability by coloring different syntax elements in your code. This feature helps you quickly identify keywords, variables, and other code components, aiding in error detection and code comprehension.","sidebar":"tutorialSidebar"},"Getting Started/index":{"id":"Getting Started/index","title":"What is Phoenix Code?","description":"Phoenix Code is a lightweight, web-first code editor built by the same team behind Brackets. It\'s a front-end editor centered on Live Preview: edit your HTML and CSS and watch the page render as you type, or edit the rendered page directly and let Phoenix Code update your source code automatically.","sidebar":"tutorialSidebar"},"Getting Started/installation":{"id":"Getting Started/installation","title":"Installation Guide","description":"Phoenix Code is a text editor designed to make coding as intuitive and fun as playing a video game \u2014 specially crafted for web developers, designers, and students. This guide walks you through downloading and installing Phoenix Code on Windows, macOS, and Linux, or running it straight from your browser with no install at all.","sidebar":"tutorialSidebar"},"Getting Started/quick-start-project":{"id":"Getting Started/quick-start-project","title":"Quick Start Project","description":"This section provides an overview of how to create and manage projects using the Start Project Dialog in Phoenix Code.","sidebar":"tutorialSidebar"},"Live Preview/design-mode":{"id":"Live Preview/design-mode","title":"Design Mode","description":"Design Mode is a layout that hides the code editor and gives that entire space to your Live Preview. It is built for visual-first work: chatting with the AI while you watch changes land in the preview, editing your page directly in Live Preview Edit Mode, or testing how your design looks at different device sizes.","sidebar":"tutorialSidebar"},"Live Preview/device-preview":{"id":"Live Preview/device-preview","title":"Device Preview","description":"Upgrade to Phoenix Code Pro to access this feature.","sidebar":"tutorialSidebar"},"Live Preview/image-gallery":{"id":"Live Preview/image-gallery","title":"Image Gallery","description":"Upgrade to Phoenix Code Pro to access this feature.","sidebar":"tutorialSidebar"},"Live Preview/index":{"id":"Live Preview/index","title":"Live Preview","description":"The Live Preview feature in Phoenix Code provides instant feedback on changes made to HTML and CSS files, letting you see your edits in real-time.","sidebar":"tutorialSidebar"},"Live Preview/live-preview-edit":{"id":"Live Preview/live-preview-edit","title":"Live Preview Edit","description":"Upgrade to Phoenix Code Pro to access this feature.","sidebar":"tutorialSidebar"},"Live Preview/live-preview-settings":{"id":"Live Preview/live-preview-settings","title":"Custom Live Preview Server","description":"Phoenix Code now allows you to integrate your custom development server directly into the editor, enabling a Live Preview of your project as it would appear when served by your server. This is especially useful for dynamic projects that rely on server-side languages like PHP or frameworks like React that supports hot reloading.","sidebar":"tutorialSidebar"},"Live Preview/markdown-editor":{"id":"Live Preview/markdown-editor","title":"Markdown Editor","description":"When you open a Markdown file (.md), Live Preview shows a nicely formatted version of your document \u2014 with syntax-highlighted code blocks, rendered Mermaid diagrams, and more. As you type in the editor, the preview updates in real time. With Phoenix Pro, you can go a step further and edit your Markdown directly in the preview with a full rich text editor.","sidebar":"tutorialSidebar"},"Live Preview/measurements":{"id":"Live Preview/measurements","title":"Measurements","description":"Upgrade to Phoenix Code Pro to access this feature.","sidebar":"tutorialSidebar"},"Live Preview/php-live-preview":{"id":"Live Preview/php-live-preview","title":"PHP Live Preview Setup","description":"Setting up Live Preview for PHP projects is straightforward with Apache and XAMPP. Below are the installation and configuration steps for each operating system:","sidebar":"tutorialSidebar"},"Schools & Workplaces/ai-control":{"id":"Schools & Workplaces/ai-control","title":"AI Control For School And Work","description":"\ud83d\udd10 Disable or manage AI features in Phoenix Code for educational and enterprise environments.","sidebar":"tutorialSidebar"},"Schools & Workplaces/phoenix-pro-for-education":{"id":"Schools & Workplaces/phoenix-pro-for-education","title":"Phoenix Pro for Education (Free)","description":"A large portion of the Phoenix Code community comes from schools and universities, where students and teachers value ease of use and a low learning curve. Education has always been central to our mission, and we want every student to have access to the full Phoenix Pro feature set without barriers.","sidebar":"tutorialSidebar"},"Workspace/customizing-editor":{"id":"Workspace/customizing-editor","title":"Customizing the Editor","description":"This section provides an overview of the editor appearance and display settings in Phoenix Code.","sidebar":"tutorialSidebar"},"Workspace/extensions":{"id":"Workspace/extensions","title":"Extensions","description":"Phoenix Code supports extensions for adding features, themes, and language support. Everything is managed through the built-in Extension Manager.","sidebar":"tutorialSidebar"},"Workspace/file-management":{"id":"Workspace/file-management","title":"File Management","description":"This section covers how Phoenix Code lets you manage, organize, and navigate files and folders within your projects.","sidebar":"tutorialSidebar"},"Workspace/find-in-files":{"id":"Workspace/find-in-files","title":"Find In Files","description":"The Find in Files feature in Phoenix Code is a powerful tool to quickly search for specific text across multiple files within a project. This feature is useful for developers working on large codebases to find references, variable names, or specific lines of code.","sidebar":"tutorialSidebar"},"Workspace/git":{"id":"Workspace/git","title":"Git","description":"Getting Started with Git in Phoenix Code","sidebar":"tutorialSidebar"},"Workspace/keyboard-shortcuts":{"id":"Workspace/keyboard-shortcuts","title":"Keyboard Shortcuts","description":"Now you can make your own shortcuts for any menu, so you don\'t have to memorize a bunch of different ones for every app. It\'s like customizing your game controls to play your way!","sidebar":"tutorialSidebar"},"Workspace/terminal":{"id":"Workspace/terminal","title":"Terminal","description":"Phoenix Code has a built-in terminal so you can run commands without leaving the editor.","sidebar":"tutorialSidebar"}}}}')}}]);
\ No newline at end of file
diff --git a/assets/js/01a85c17.f5fd27cb.js b/assets/js/01a85c17.f5fd27cb.js
new file mode 100644
index 00000000..eb4a91e0
--- /dev/null
+++ b/assets/js/01a85c17.f5fd27cb.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8209],{44096:(e,t,a)=>{a.d(t,{in:()=>c,OU:()=>P,Ki:()=>A,kJ:()=>b,x:()=>l,e7:()=>m,J_:()=>f,Gx:()=>y});var s=a(96540),n=a(89532),i=a(36803),r=a(74848);function l(){const e=(0,i.A)(),t=e?.data?.blogMetadata;if(!t)throw new Error("useBlogMetadata() can't be called on the current route because the blog metadata could not be found in route context");return t}const o=s.createContext(null);function c({children:e,content:t,isBlogPostPage:a=!1}){const n=function({content:e,isBlogPostPage:t}){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,toc:e.toc,isBlogPostPage:t})),[e,t])}({content:t,isBlogPostPage:a});return(0,r.jsx)(o.Provider,{value:n,children:e})}function m(){const e=(0,s.useContext)(o);if(null===e)throw new n.dV("BlogPostProvider");return e}var d=a(86025),u=a(44586);const g=e=>new Date(e).toISOString();function h(e){const t=e.map(x);return{author:1===t.length?t[0]:t}}function p(e,t,a){return e?{image:j({imageUrl:t(e,{absolute:!0}),caption:`title image for the blog post: ${a}`})}:{}}function b(e){const{siteConfig:t}=(0,u.A)(),{withBaseUrl:a}=(0,d.hH)(),{metadata:{blogDescription:s,blogTitle:n,permalink:i}}=e,r=`${t.url}${i}`;return{"@context":"https://schema.org","@type":"Blog","@id":r,mainEntityOfPage:r,headline:n,description:s,blogPost:e.items.map((e=>function(e,t,a){const{assets:s,frontMatter:n,metadata:i}=e,{date:r,title:l,description:o,lastUpdatedAt:c}=i,m=s.image??n.image,d=n.keywords??[],u=`${t.url}${i.permalink}`,b=c?g(c):void 0;return{"@type":"BlogPosting","@id":u,mainEntityOfPage:u,url:u,headline:l,name:l,description:o,datePublished:r,...b?{dateModified:b}:{},...h(i.authors),...p(m,a,l),...d?{keywords:d}:{}}}(e.content,t,a)))}}function f(){const e=l(),{assets:t,metadata:a}=m(),{siteConfig:s}=(0,u.A)(),{withBaseUrl:n}=(0,d.hH)(),{date:i,title:r,description:o,frontMatter:c,lastUpdatedAt:b}=a,f=t.image??c.image,x=c.keywords??[],j=b?g(b):void 0,N=`${s.url}${a.permalink}`;return{"@context":"https://schema.org","@type":"BlogPosting","@id":N,mainEntityOfPage:N,url:N,headline:r,name:r,description:o,datePublished:i,...j?{dateModified:j}:{},...h(a.authors),...p(f,n,r),...x?{keywords:x}:{},isPartOf:{"@type":"Blog","@id":`${s.url}${e.blogBasePath}`,name:e.blogTitle}}}function x(e){return{"@type":"Person",...e.name?{name:e.name}:{},...e.title?{description:e.title}:{},...e.url?{url:e.url}:{},...e.email?{email:e.email}:{},...e.imageURL?{image:e.imageURL}:{}}}function j({imageUrl:e,caption:t}){return{"@type":"ImageObject","@id":e,url:e,contentUrl:e,caption:t}}var N=a(56347),v=a(28774),C=a(31682),k=a(99169);function y(e){const{pathname:t}=(0,N.zy)();return(0,s.useMemo)((()=>e.filter((e=>function(e,t){return!(e.unlisted&&!(0,k.ys)(e.permalink,t))}(e,t)))),[e,t])}function A(e){const t=(0,C.$z)(e,(e=>`${new Date(e.date).getFullYear()}`)),a=Object.entries(t);return a.reverse(),a}function P({items:e,ulClassName:t,liClassName:a,linkClassName:s,linkActiveClassName:n}){return(0,r.jsx)("ul",{className:t,children:e.map((e=>(0,r.jsx)("li",{className:a,children:(0,r.jsx)(v.A,{isNavLink:!0,to:e.permalink,className:s,activeClassName:n,children:e.title})},e.permalink)))})}},28027:(e,t,a)=>{a.d(t,{A:()=>O});var s=a(96540),n=a(34164),i=a(36882),r=a(24581),l=a(21312),o=a(44096),c=a(6342),m=a(51107),d=a(74848);function u({year:e,yearGroupHeadingClassName:t,children:a}){return(0,d.jsxs)("div",{role:"group",children:[(0,d.jsx)(m.A,{as:"h3",className:t,children:e}),a]})}function g({items:e,yearGroupHeadingClassName:t,ListComponent:a}){if((0,c.p)().blog.sidebar.groupByYear){const s=(0,o.Ki)(e);return(0,d.jsx)(d.Fragment,{children:s.map((([e,s])=>(0,d.jsx)(u,{year:e,yearGroupHeadingClassName:t,children:(0,d.jsx)(a,{items:s})},e)))})}return(0,d.jsx)(a,{items:e})}const h=(0,s.memo)(g),p="sidebar_re4s",b="sidebarItemTitle_pO2u",f="sidebarItemList_Yudw",x="sidebarItem__DBe",j="sidebarItemLink_mo7H",N="sidebarItemLinkActive_I1ZP",v="yearGroupHeading_rMGB",C=({items:e})=>(0,d.jsx)(o.OU,{items:e,ulClassName:(0,n.A)(f,"clean-list"),liClassName:x,linkClassName:j,linkActiveClassName:N});function k({sidebar:e}){const t=(0,o.Gx)(e.items);return(0,d.jsx)("aside",{className:"col col--3",children:(0,d.jsxs)("nav",{className:(0,n.A)(p,"thin-scrollbar"),"aria-label":(0,l.T)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"}),children:[(0,d.jsx)("div",{className:(0,n.A)(b,"margin-bottom--md"),children:e.title}),(0,d.jsx)(h,{items:t,ListComponent:C,yearGroupHeadingClassName:v})]})})}const y=(0,s.memo)(k);var A=a(75600);const P={yearGroupHeading:"yearGroupHeading_QT03"},_=({items:e})=>(0,d.jsx)(o.OU,{items:e,ulClassName:"menu__list",liClassName:"menu__list-item",linkClassName:"menu__link",linkActiveClassName:"menu__link--active"});function w({sidebar:e}){const t=(0,o.Gx)(e.items);return(0,d.jsx)(h,{items:t,ListComponent:_,yearGroupHeadingClassName:P.yearGroupHeading})}function B(e){return(0,d.jsx)(A.GX,{component:w,props:e})}const G=(0,s.memo)(B);function H({sidebar:e}){const t=(0,r.l)();return e?.items.length?"mobile"===t?(0,d.jsx)(G,{sidebar:e}):(0,d.jsx)(y,{sidebar:e}):null}function O(e){const{sidebar:t,toc:a,children:s,...r}=e,l=t&&t.items.length>0;return(0,d.jsx)(i.A,{...r,children:(0,d.jsx)("div",{className:"container margin-vert--lg",children:(0,d.jsxs)("div",{className:"row",children:[(0,d.jsx)(H,{sidebar:t}),(0,d.jsx)("main",{className:(0,n.A)("col",{"col--7":l,"col--9 col--offset-1":!l}),children:s}),a&&(0,d.jsx)("div",{className:"col col--2",children:a})]})})})}},69158:(e,t,a)=>{a.r(t),a.d(t,{default:()=>b});a(96540);var s=a(34164),n=a(21312);const i=()=>(0,n.T)({id:"theme.tags.tagsPageTitle",message:"Tags",description:"The title of the tag list page"});var r=a(45500),l=a(17559),o=a(28027),c=a(56133),m=a(51107);const d={tag:"tag_Nnez"};var u=a(74848);function g({letterEntry:e}){return(0,u.jsxs)("article",{children:[(0,u.jsx)(m.A,{as:"h2",id:e.letter,children:e.letter}),(0,u.jsx)("ul",{className:"padding--none",children:e.tags.map((e=>(0,u.jsx)("li",{className:d.tag,children:(0,u.jsx)(c.A,{...e})},e.permalink)))}),(0,u.jsx)("hr",{})]})}function h({tags:e}){const t=function(e){const t={};return Object.values(e).forEach((e=>{const a=function(e){return e[0].toUpperCase()}(e.label);t[a]??=[],t[a].push(e)})),Object.entries(t).sort((([e],[t])=>e.localeCompare(t))).map((([e,t])=>({letter:e,tags:t.sort(((e,t)=>e.label.localeCompare(t.label)))})))}(e);return(0,u.jsx)("section",{className:"margin-vert--lg",children:t.map((e=>(0,u.jsx)(g,{letterEntry:e},e.letter)))})}var p=a(41463);function b({tags:e,sidebar:t}){const a=i();return(0,u.jsxs)(r.e3,{className:(0,s.A)(l.G.wrapper.blogPages,l.G.page.blogTagsListPage),children:[(0,u.jsx)(r.be,{title:a}),(0,u.jsx)(p.A,{tag:"blog_tags_list"}),(0,u.jsxs)(o.A,{sidebar:t,children:[(0,u.jsx)(m.A,{as:"h1",children:a}),(0,u.jsx)(h,{tags:e})]})]})}},56133:(e,t,a)=>{a.d(t,{A:()=>l});a(96540);var s=a(34164),n=a(28774);const i={tag:"tag_zVej",tagRegular:"tagRegular_sFm0",tagWithCount:"tagWithCount_h2kH"};var r=a(74848);function l({permalink:e,label:t,count:a,description:l}){return(0,r.jsxs)(n.A,{rel:"tag",href:e,title:l,className:(0,s.A)(i.tag,a?i.tagWithCount:i.tagRegular),children:[t,a&&(0,r.jsx)("span",{children:a})]})}}}]);
\ No newline at end of file
diff --git a/assets/js/01eab772.250e0b90.js b/assets/js/01eab772.250e0b90.js
new file mode 100644
index 00000000..a0ca24e8
--- /dev/null
+++ b/assets/js/01eab772.250e0b90.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8698],{58167:a=>{a.exports=JSON.parse('{"tag":{"label":"Phoenix Pro","permalink":"/blog/tags/phoenix-pro","allTagsPath":"/blog/tags","count":2,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/phoenix-pro","page":1,"postsPerPage":10,"totalPages":1,"totalCount":2,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/020967ce.8203f28d.js b/assets/js/020967ce.8203f28d.js
new file mode 100644
index 00000000..9c3a96c6
--- /dev/null
+++ b/assets/js/020967ce.8203f28d.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5389],{84246:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>x,frontMatter:()=>h,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"Workspace/extensions","title":"Extensions","description":"Phoenix Code supports extensions for adding features, themes, and language support. Everything is managed through the built-in Extension Manager.","source":"@site/docs/05-Workspace/07-extensions.md","sourceDirName":"05-Workspace","slug":"/extensions","permalink":"/docs/extensions","draft":false,"unlisted":false,"editUrl":"https://github.com/phcode-dev/docs/blob/main/docs/05-Workspace/07-extensions.md","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"Extensions","slug":"/extensions"},"sidebar":"tutorialSidebar","previous":{"title":"Git","permalink":"/docs/Features/git"},"next":{"title":"HTML Validator","permalink":"/docs/Features/Problems Panel/html-lint"}}');var i=s(74848),r=s(28453),o=(s(96540),s(56399));const h={title:"Extensions",slug:"/extensions"},a=void 0,d={},c=[{value:"Themes",id:"themes",level:2},{value:"Create your own",id:"create-your-own",level:2},{value:"Popular extensions",id:"popular-extensions",level:2},{value:"Minimap",id:"minimap",level:3},{value:"Show Whitespace",id:"show-whitespace",level:3},{value:"1-2-3",id:"1-2-3",level:3},{value:"FuncDocr",id:"funcdocr",level:3},{value:"Remove Comments",id:"remove-comments",level:3},{value:"Autosave Files on Window Blur",id:"autosave-files-on-window-blur",level:3}];function l(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.p,{children:["Phoenix Code supports extensions for adding features, themes, and language support. Everything is managed through the built-in ",(0,i.jsx)(n.strong,{children:"Extension Manager"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"To open the Extension Manager, click the extension icon on the right-hand toolbar, as shown below."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Extension Manager icon location on the right toolbar",src:s(28124).A+"",title:"Click the Extension Manager icon on the right toolbar",width:"1920",height:"1080"})}),"\n",(0,i.jsx)(n.p,{children:"The dialog has four tabs:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Tab"}),(0,i.jsx)(n.th,{children:"Contents"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Available"})}),(0,i.jsx)(n.td,{children:"Marketplace extensions. A search box at the top filters the list."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Themes"})}),(0,i.jsx)(n.td,{children:"Marketplace themes."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Installed"})}),(0,i.jsx)(n.td,{children:"Everything you've installed. Apply, update, or remove from here."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.strong,{children:"Default"})}),(0,i.jsx)(n.td,{children:"Built-in extensions that ship with Phoenix Code."})]})]})]}),"\n",(0,i.jsxs)(n.p,{children:["A ",(0,i.jsx)(n.strong,{children:"Sort"})," dropdown at the top of the dialog orders the list by ",(0,i.jsx)(n.strong,{children:"Last Updated"})," (most recently published first), ",(0,i.jsx)(n.strong,{children:"Downloads"})," (most-installed first), ",(0,i.jsx)(n.strong,{children:"Star Rating"})," (highest GitHub stars), or ",(0,i.jsx)(n.strong,{children:"Verified"})," (Phoenix-verified extensions first)."]}),"\n",(0,i.jsx)(o.A,{src:"https://docs-images.phcode.dev/videos/extensions/extension-manager.mp4"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Install"}),": pick an item from ",(0,i.jsx)(n.strong,{children:"Available"})," or ",(0,i.jsx)(n.strong,{children:"Themes"})," and click ",(0,i.jsx)(n.strong,{children:"Install"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Update"}),": when a newer version is available, an ",(0,i.jsx)(n.strong,{children:"Update"})," button appears on the extension's card in ",(0,i.jsx)(n.strong,{children:"Installed"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Remove"}),": click ",(0,i.jsx)(n.strong,{children:"Remove"})," on the card in ",(0,i.jsx)(n.strong,{children:"Installed"}),", then confirm with ",(0,i.jsx)(n.strong,{children:"Remove Extensions and Reload"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"themes",children:"Themes"}),"\n",(0,i.jsxs)(n.p,{children:["Themes use the same flow under the ",(0,i.jsx)(n.strong,{children:"Themes"})," tab."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Themes tab in the Extension Manager",src:s(81586).A+"",title:"Themes tab in the Extension Manager",width:"1140",height:"766"})}),"\n",(0,i.jsxs)(n.p,{children:["To switch to an installed theme, either pick it from ",(0,i.jsx)(n.code,{children:"View > Themes..."})," (see ",(0,i.jsx)(n.a,{href:"./customizing-editor#themes",children:"Customizing the Editor \u2192 Themes"}),") or click ",(0,i.jsx)(n.strong,{children:"Apply"})," next to the theme in ",(0,i.jsx)(n.strong,{children:"Installed"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"create-your-own",children:"Create your own"}),"\n",(0,i.jsx)(n.p,{children:"For authoring extensions and themes, see the API section:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/api/creating-themes",children:"Creating Themes"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/api/creating-extensions",children:"Creating Extensions"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/api/creating-node-extensions",children:"Creating Node Extensions"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/api/debugging-extensions",children:"Debugging Extensions"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/api/publishing-extensions",children:"Publishing Extensions"})}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"popular-extensions",children:"Popular extensions"}),"\n",(0,i.jsx)(n.p,{children:"A curated list of community extensions worth checking out."}),"\n",(0,i.jsx)(n.h3,{id:"minimap",children:"Minimap"}),"\n",(0,i.jsxs)(n.p,{children:["Created by: ",(0,i.jsx)(n.a,{href:"https://github.com/zorgzerg",children:"Zorgzerg"})]}),"\n",(0,i.jsx)(n.p,{children:"This extension adds a minimap preview of your code on the side of your editor, making it easier to navigate and get an overview of your code structure."}),"\n",(0,i.jsxs)(n.p,{children:["For more details, visit the ",(0,i.jsx)(n.a,{href:"https://github.com/zorgzerg/brackets-minimap",children:"GitHub repository"})," of the extension."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Minimap"})," in action :-"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Minimap",src:s(63569).A+"",width:"1919",height:"1112"})}),"\n",(0,i.jsx)(n.h3,{id:"show-whitespace",children:"Show Whitespace"}),"\n",(0,i.jsxs)(n.p,{children:["Created by: ",(0,i.jsx)(n.a,{href:"https://github.com/DennisKehrig",children:"Dennis Kehrig"})]}),"\n",(0,i.jsx)(n.p,{children:"This extension allows users to visualize spaces and tabs, making code more readable and helping maintain formatting consistency."}),"\n",(0,i.jsxs)(n.p,{children:["For more details, visit the ",(0,i.jsx)(n.a,{href:"https://github.com/DennisKehrig/brackets-show-whitespace",children:"GitHub repository"})," of the extension."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Show Whitespace"})," in action :-"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"Show Whitespace",src:s(13707).A+"",width:"1840",height:"929"})}),"\n",(0,i.jsx)(n.h3,{id:"1-2-3",children:"1-2-3"}),"\n",(0,i.jsxs)(n.p,{children:["Created by: ",(0,i.jsx)(n.a,{href:"https://github.com/michaljerabek",children:"Michal Je\u0159\xe1bek"})]}),"\n",(0,i.jsx)(n.p,{children:"This extension generates number sequences directly in your editor, making it easy to create ordered lists or numbered markers with minimal effort."}),"\n",(0,i.jsxs)(n.p,{children:["For more details, visit the ",(0,i.jsx)(n.a,{href:"https://github.com/michaljerabek/1-2-3",children:"GitHub repository"})," of the extension."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"1-2-3"})," in action :-"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"1-2-3",src:s(65367).A+"",width:"640",height:"360"})}),"\n",(0,i.jsx)(n.h3,{id:"funcdocr",children:"FuncDocr"}),"\n",(0,i.jsxs)(n.p,{children:["Created by: ",(0,i.jsx)(n.a,{href:"https://github.com/Wikunia",children:"Ole Kr\xf6ger"})]}),"\n",(0,i.jsx)(n.p,{children:"This extension generates JS/PHPDocs for your functions, keeping your code documented and organized."}),"\n",(0,i.jsxs)(n.p,{children:["For more details, visit the ",(0,i.jsx)(n.a,{href:"https://github.com/wikunia/brackets-funcdocr",children:"GitHub repository"})," of the extension."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"FuncDocr"})," in action :-"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"FuncDocr",src:s(96924).A+"",width:"548",height:"320"})}),"\n",(0,i.jsx)(n.h3,{id:"remove-comments",children:"Remove Comments"}),"\n",(0,i.jsxs)(n.p,{children:["Created by: ",(0,i.jsx)(n.a,{href:"https://github.com/devvaannsh",children:"Pluto"})]}),"\n",(0,i.jsx)(n.p,{children:"This extension allows you to remove unwanted comments from your code. You can delete all comments at once or only those within a selected section."}),"\n",(0,i.jsxs)(n.p,{children:["For more details, visit the ",(0,i.jsx)(n.a,{href:"https://github.com/devvaannsh/Remove-Comments",children:"GitHub repository"})," of the extension."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Remove Comments"})," in action :-"]}),"\n",(0,i.jsx)(o.A,{src:"https://docs-images.phcode.dev/videos/popular-extensions/Remove-Comments.mp4"}),"\n",(0,i.jsx)(n.h3,{id:"autosave-files-on-window-blur",children:"Autosave Files on Window Blur"}),"\n",(0,i.jsxs)(n.p,{children:["Created by: ",(0,i.jsx)(n.a,{href:"https://github.com/martypenner",children:"Marty Penner"})]}),"\n",(0,i.jsx)(n.p,{children:"This extension automatically saves all unsaved files whenever Phoenix Code loses focus (for example, when you switch to another application)."}),"\n",(0,i.jsxs)(n.p,{children:["For more details, visit the ",(0,i.jsx)(n.a,{href:"https://github.com/martypenner/brackets-autosave-files-on-window-blur",children:"GitHub repository"})," of the extension."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"Autosave Files on Window Blur"})," in action :-"]}),"\n",(0,i.jsx)(o.A,{src:"https://docs-images.phcode.dev/videos/popular-extensions/autosave.mp4"})]})}function x(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},56399:(e,n,s)=>{s.d(n,{A:()=>r});var t=s(96540),i=s(74848);const r=({src:e,winLinuxTitle:n,macTitle:s})=>{const[r,o]=(0,t.useState)("");(0,t.useEffect)((()=>{navigator.platform.toLowerCase().includes("mac")?o(s):o(n)}),[n,s]);return(0,i.jsxs)("div",{style:{maxHeight:"68vh",width:"100%",display:"flex",justifyContent:"center",alignItems:"center",flexDirection:"column"},children:[(0,i.jsxs)("video",{style:{height:"90%",width:"100%"},controls:!0,autoPlay:!0,muted:!0,loop:!0,children:[(0,i.jsx)("source",{src:e,type:"video/mp4"}),"Your browser does not support the video tag."]}),(0,i.jsx)("div",{style:{width:"100%",textAlign:"center",fontSize:"1em",marginTop:"10px"},children:r})]})}},28124:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/extension-manager-button-467fe5a1b8e23ada40a5990a2cffa081.png"},81586:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/themes-tab-8a777fbb22571d147609b325b6c18273.png"},65367:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/1-2-3-2baddde7c9b006e7c84dfaf449d2f2c9.gif"},96924:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/Func-Docr-c8a17e10862c5855bc4e241cd40cd548.gif"},13707:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/Show-Whitespace-7af1837294998ace257ae52aeeebb935.png"},63569:(e,n,s)=>{s.d(n,{A:()=>t});const t=s.p+"assets/images/minimap-0f5bc4e16371590e00a86db9fd97f112.png"},28453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>h});var t=s(96540);const i={},r=t.createContext(i);function o(e){const n=t.useContext(r);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function h(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/031fbf0b.cd712cca.js b/assets/js/031fbf0b.cd712cca.js
new file mode 100644
index 00000000..74fc1544
--- /dev/null
+++ b/assets/js/031fbf0b.cd712cca.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3151],{7619:t=>{t.exports=JSON.parse('{"tag":{"label":"Continued","permalink":"/blog/tags/continued","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/continued","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/04f2eb81.741ad7d1.js b/assets/js/04f2eb81.741ad7d1.js
new file mode 100644
index 00000000..776a8850
--- /dev/null
+++ b/assets/js/04f2eb81.741ad7d1.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8451],{15334:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>c,frontMatter:()=>l,metadata:()=>r,toc:()=>u});const r=JSON.parse('{"id":"API-Reference/utils/FeatureGate","title":"FeatureGate","description":"Import :","source":"@site/api/API-Reference/utils/FeatureGate.md","sourceDirName":"API-Reference/utils","slug":"/API-Reference/utils/FeatureGate","permalink":"/api/API-Reference/utils/FeatureGate","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"ExtensionUtils","permalink":"/api/API-Reference/utils/ExtensionUtils"},"next":{"title":"KeyEvent","permalink":"/api/API-Reference/utils/KeyEvent"}}');var n=a(74848),s=a(28453);const l={},i=void 0,d={},u=[{value:"Import :",id:"import-",level:3},{value:"utils/FeatureGate",id:"utilsfeaturegate",level:2},{value:"Usage",id:"usage",level:2},{value:"creating a feature gate",id:"creating-a-feature-gate",level:3},{value:"checking if a feature is gated",id:"checking-if-a-feature-is-gated",level:3},{value:"Enabling features for testing",id:"enabling-features-for-testing",level:3},{value:"utils/FeatureGate.FEATURE_REGISTERED : string",id:"utilsfeaturegatefeature_registered--string",level:3},{value:"utils/FeatureGate.registerFeatureGate(featureName, enabledDefault) : function",id:"utilsfeaturegateregisterfeaturegatefeaturename-enableddefault--function",level:3},{value:"utils/FeatureGate.getAllRegisteredFeatures() \u21d2 Array.<string>",id:"utilsfeaturegategetallregisteredfeatures--arraystring",level:3},{value:"utils/FeatureGate.isFeatureEnabled(featureName) \u21d2 boolean",id:"utilsfeaturegateisfeatureenabledfeaturename--boolean",level:3},{value:"utils/FeatureGate.setFeatureEnabled(featureName, isEnabled)",id:"utilsfeaturegatesetfeatureenabledfeaturename-isenabled",level:3}];function o(e){const t={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h3,{id:"import-",children:"Import :"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-js",children:'const FeatureGate = brackets.getModule("utils/FeatureGate")\n'})}),"\n",(0,n.jsx)("a",{name:"module_utils/FeatureGate"}),"\n",(0,n.jsx)(t.h2,{id:"utilsfeaturegate",children:"utils/FeatureGate"}),"\n",(0,n.jsxs)(t.p,{children:["FeatureGate defines util methods for enabling or disabling features in development based on a flag in local storage.\nA global ",(0,n.jsx)(t.code,{children:"window.FeatureGate"})," object is made available in phoenix that can be called anytime after AppStart."]}),"\n",(0,n.jsx)(t.h2,{id:"usage",children:"Usage"}),"\n",(0,n.jsx)(t.p,{children:"For Eg. You may have an extensions in development that colors phoenix in red. But you are working on a new feature\nthat makes other colors available, but not yet ready for use. So put the extension behind a named feature gate\nso that only people who want to test the extension will be able to use it."}),"\n",(0,n.jsx)(t.h3,{id:"creating-a-feature-gate",children:"creating a feature gate"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.strong,{children:"Example"})}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-js",children:"// within extensions\nconst FeatureGate = brackets.getModule(\"utils/FeatureGate\"); // replace with `require` for core modules.\nconst FEATURE_NEW_COLORS = 'myExtension.newColors';\nFeatureGate.registerFeatureGate(FEATURE_NEW_COLORS, false); // false is the default value\n"})}),"\n",(0,n.jsx)(t.h3,{id:"checking-if-a-feature-is-gated",children:"checking if a feature is gated"}),"\n",(0,n.jsxs)(t.p,{children:["Once the feature is registered, use the below code to check if the feature can be safely enabled. For Eg., if\nyou want to enable fancy colors based on the example above:\n",(0,n.jsx)(t.strong,{children:"Example"})]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-js",children:"if(FeatureGate.isFeatureEnabled(FEATURE_NEW_COLORS)){\n // do fancy colors here\n}\n"})}),"\n",(0,n.jsx)(t.h3,{id:"enabling-features-for-testing",children:"Enabling features for testing"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"Open developer tools > local storage"}),"\n",(0,n.jsxs)(t.li,{children:["Add a new key with the key you have specified for the feature gate.\nIn the above Eg., the key is ",(0,n.jsx)(t.code,{children:"myExtension.newColors"})]}),"\n",(0,n.jsxs)(t.li,{children:["set the value in local storage to ",(0,n.jsx)(t.code,{children:"enabled"})," to enable the feature or anything else to disable."]}),"\n"]}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate",children:"utils/FeatureGate"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate..FEATURE_REGISTERED",children:".FEATURE_REGISTERED"})," : ",(0,n.jsx)("code",{children:"string"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate..registerFeatureGate",children:".registerFeatureGate(featureName, enabledDefault)"})," : ",(0,n.jsx)("code",{children:"function"})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate..getAllRegisteredFeatures",children:".getAllRegisteredFeatures()"})," \u21d2 ",(0,n.jsx)("code",{children:"Array."})]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate..isFeatureEnabled",children:".isFeatureEnabled(featureName)"})," \u21d2 ",(0,n.jsx)("code",{children:"boolean"})]}),"\n",(0,n.jsx)(t.li,{children:(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate..setFeatureEnabled",children:".setFeatureEnabled(featureName, isEnabled)"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)("a",{name:"module_utils/FeatureGate..FEATURE_REGISTERED"}),"\n",(0,n.jsxs)(t.h3,{id:"utilsfeaturegatefeature_registered--string",children:["utils/FeatureGate.FEATURE_REGISTERED : ",(0,n.jsx)("code",{children:"string"})]}),"\n",(0,n.jsx)(t.p,{children:"Feature gate registered"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": inner constant of ",(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate",children:(0,n.jsx)("code",{children:"utils/FeatureGate"})})]}),"\n",(0,n.jsx)("a",{name:"module_utils/FeatureGate..registerFeatureGate"}),"\n",(0,n.jsxs)(t.h3,{id:"utilsfeaturegateregisterfeaturegatefeaturename-enableddefault--function",children:["utils/FeatureGate.registerFeatureGate(featureName, enabledDefault) : ",(0,n.jsx)("code",{children:"function"})]}),"\n",(0,n.jsxs)(t.p,{children:["Registers a named feature with the default enabled state.\nTo register a feature gate with name ",(0,n.jsx)(t.code,{children:"myExtension.newColors"}),"\nconst FEATURE_NEW_COLORS = 'myExtension.newColors';\nFeatureGate.registerFeatureGate(FEATURE_NEW_COLORS, false); // false is the default value here"]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": inner method of ",(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate",children:(0,n.jsx)("code",{children:"utils/FeatureGate"})})]}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Param"}),(0,n.jsx)(t.th,{children:"Type"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"featureName"}),(0,n.jsx)(t.td,{children:(0,n.jsx)("code",{children:"string"})})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"enabledDefault"}),(0,n.jsx)(t.td,{children:(0,n.jsx)("code",{children:"boolean"})})]})]})]}),"\n",(0,n.jsx)("a",{name:"module_utils/FeatureGate..getAllRegisteredFeatures"}),"\n",(0,n.jsxs)(t.h3,{id:"utilsfeaturegategetallregisteredfeatures--arraystring",children:["utils/FeatureGate.getAllRegisteredFeatures() \u21d2 ",(0,n.jsx)("code",{children:"Array."})]}),"\n",(0,n.jsx)(t.p,{children:"Returns an array of all named registered feature gates."}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": inner method of ",(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate",children:(0,n.jsx)("code",{children:"utils/FeatureGate"})}),(0,n.jsx)(t.br,{}),"\n",(0,n.jsx)(t.strong,{children:"Returns"}),": ",(0,n.jsx)("code",{children:"Array."})," - list of registered features"]}),"\n",(0,n.jsx)("a",{name:"module_utils/FeatureGate..isFeatureEnabled"}),"\n",(0,n.jsxs)(t.h3,{id:"utilsfeaturegateisfeatureenabledfeaturename--boolean",children:["utils/FeatureGate.isFeatureEnabled(featureName) \u21d2 ",(0,n.jsx)("code",{children:"boolean"})]}),"\n",(0,n.jsxs)(t.p,{children:["Returns true is an featureGate is enabled either by default or overridden by the user using local storage.\nTo check if the feature ",(0,n.jsx)(t.code,{children:"myExtension.newColors"})," is enabled\nconst FEATURE_NEW_COLORS = 'myExtension.newColors';\nif(FeatureGate.isFeatureEnabled(FEATURE_NEW_COLORS))"]}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": inner method of ",(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate",children:(0,n.jsx)("code",{children:"utils/FeatureGate"})})]}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Param"}),(0,n.jsx)(t.th,{children:"Type"})]})}),(0,n.jsx)(t.tbody,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"featureName"}),(0,n.jsx)(t.td,{children:(0,n.jsx)("code",{children:"string"})})]})})]}),"\n",(0,n.jsx)("a",{name:"module_utils/FeatureGate..setFeatureEnabled"}),"\n",(0,n.jsx)(t.h3,{id:"utilsfeaturegatesetfeatureenabledfeaturename-isenabled",children:"utils/FeatureGate.setFeatureEnabled(featureName, isEnabled)"}),"\n",(0,n.jsx)(t.p,{children:"Sets the enabled state of a specific feature in the application."}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": inner method of ",(0,n.jsx)(t.a,{href:"#module_utils/FeatureGate",children:(0,n.jsx)("code",{children:"utils/FeatureGate"})})]}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Param"}),(0,n.jsx)(t.th,{children:"Type"}),(0,n.jsx)(t.th,{children:"Description"})]})}),(0,n.jsxs)(t.tbody,{children:[(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"featureName"}),(0,n.jsx)(t.td,{children:(0,n.jsx)("code",{children:"string"})}),(0,n.jsx)(t.td,{children:"The name of the feature to be modified."})]}),(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"isEnabled"}),(0,n.jsx)(t.td,{children:(0,n.jsx)("code",{children:"boolean"})}),(0,n.jsx)(t.td,{children:"A boolean flag indicating whether the feature should be enabled (true) or disabled (false)."})]})]})]})]})}function c(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(o,{...e})}):o(e)}},28453:(e,t,a)=>{a.d(t,{R:()=>l,x:()=>i});var r=a(96540);const n={},s=r.createContext(n);function l(e){const t=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:l(e.components),r.createElement(s.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0829e0b2.b96f4893.js b/assets/js/0829e0b2.b96f4893.js
new file mode 100644
index 00000000..d61c2599
--- /dev/null
+++ b/assets/js/0829e0b2.b96f4893.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5435],{54345:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>a,frontMatter:()=>t,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"API-Reference/utils/NodeUtils","title":"NodeUtils","description":"Import :","source":"@site/api/API-Reference/utils/NodeUtils.md","sourceDirName":"API-Reference/utils","slug":"/API-Reference/utils/NodeUtils","permalink":"/api/API-Reference/utils/NodeUtils","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"NativeApp","permalink":"/api/API-Reference/utils/NativeApp"},"next":{"title":"PerfUtils","permalink":"/api/API-Reference/utils/PerfUtils"}}');var r=s(74848),l=s(28453);const t={},d=void 0,o={},c=[{value:"Import :",id:"import-",level:3},{value:"isNodeReady \u21d2 boolean",id:"isnodeready--boolean",level:2},{value:"Strings",id:"strings",level:2},{value:"fetchURLText(url, encoding) \u21d2 Promise.<string>",id:"fetchurltexturl-encoding--promisestring",level:2},{value:"getPhoenixBinaryVersion() \u21d2 Promise.<string>",id:"getphoenixbinaryversion--promisestring",level:2},{value:"getLinuxOSFlavorName() \u21d2 Promise.<(string|null)>",id:"getlinuxosflavorname--promisestringnull",level:2},{value:"openUrlInBrowser(url, browserName)",id:"openurlinbrowserurl-browsername",level:2},{value:"getEnvironmentVariable(varName) \u21d2 Promise.<string>",id:"getenvironmentvariablevarname--promisestring",level:2},{value:"ESLintFile(text, fullFilePath, projectFullPath)",id:"eslintfiletext-fullfilepath-projectfullpath",level:2},{value:"openNativeTerminal(cwd, [usePowerShell])",id:"opennativeterminalcwd-usepowershell",level:2},{value:"openInDefaultApp(fullPath) \u21d2 Promise.<void>",id:"openindefaultappfullpath--promisevoid",level:2},{value:"getDeviceID() \u21d2 Promise.<(string|null)>",id:"getdeviceid--promisestringnull",level:2},{value:"addDeviceLicenseSystemWide() \u21d2 Promise.<boolean>",id:"adddevicelicensesystemwide--promiseboolean",level:2},{value:"removeDeviceLicenseSystemWide() \u21d2 Promise.<boolean>",id:"removedevicelicensesystemwide--promiseboolean",level:2},{value:"isLicensedDeviceSystemWide() \u21d2 Promise.<boolean>",id:"islicenseddevicesystemwide--promiseboolean",level:2},{value:"getOSUserName() \u21d2 Promise.<string>",id:"getosusername--promisestring",level:2},{value:"getSystemSettingsDir() \u21d2 Promise.<string>",id:"getsystemsettingsdir--promisestring",level:2}];function h(e){const n={br:"br",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h3,{id:"import-",children:"Import :"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-js",children:'const NodeUtils = brackets.getModule("utils/NodeUtils")\n'})}),"\n",(0,r.jsx)("a",{name:"isNodeReady"}),"\n",(0,r.jsxs)(n.h2,{id:"isnodeready--boolean",children:["isNodeReady \u21d2 ",(0,r.jsx)("code",{children:"boolean"})]}),"\n",(0,r.jsx)(n.p,{children:"checks if Node connector is ready"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global variable",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"boolean"})," - returns true if it's ready, otherwise false"]}),"\n",(0,r.jsx)("a",{name:"Strings"}),"\n",(0,r.jsx)(n.h2,{id:"strings",children:"Strings"}),"\n",(0,r.jsxs)(n.p,{children:["Generic node util APIs connector. see ",(0,r.jsx)(n.code,{children:"src-node/utils.js"})," for node peer"]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global constant"]}),"\n",(0,r.jsx)("a",{name:"fetchURLText"}),"\n",(0,r.jsxs)(n.h2,{id:"fetchurltexturl-encoding--promisestring",children:["fetchURLText(url, encoding) \u21d2 ",(0,r.jsx)("code",{children:"Promise."})]}),"\n",(0,r.jsx)(n.p,{children:"Fetches text content from a URL\nThis is only available in the native app"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"url"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"encoding"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})})]})]})]}),"\n",(0,r.jsx)("a",{name:"getPhoenixBinaryVersion"}),"\n",(0,r.jsxs)(n.h2,{id:"getphoenixbinaryversion--promisestring",children:["getPhoenixBinaryVersion() \u21d2 ",(0,r.jsx)("code",{children:"Promise."})]}),"\n",(0,r.jsx)(n.p,{children:"Gets the version of the Phoenix binary\nThis is only available in the native app"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,r.jsx)("a",{name:"getLinuxOSFlavorName"}),"\n",(0,r.jsxs)(n.h2,{id:"getlinuxosflavorname--promisestringnull",children:["getLinuxOSFlavorName() \u21d2 ",(0,r.jsx)("code",{children:"Promise.<(string|null)>"})]}),"\n",(0,r.jsx)(n.p,{children:"Retrieves the Linux OS flavor name\nThis is only available in the native app on Linux"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,r.jsx)("a",{name:"openUrlInBrowser"}),"\n",(0,r.jsx)(n.h2,{id:"openurlinbrowserurl-browsername",children:"openUrlInBrowser(url, browserName)"}),"\n",(0,r.jsx)(n.p,{children:"Opens a URL in the default browser.\nThis is only available in the native app."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"url"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"browserName"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})})]})]})]}),"\n",(0,r.jsx)("a",{name:"getEnvironmentVariable"}),"\n",(0,r.jsxs)(n.h2,{id:"getenvironmentvariablevarname--promisestring",children:["getEnvironmentVariable(varName) \u21d2 ",(0,r.jsx)("code",{children:"Promise."})]}),"\n",(0,r.jsx)(n.p,{children:"Gets an environment variable's value\nThis is only available in the native app"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"varName"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})})]})})]}),"\n",(0,r.jsx)("a",{name:"ESLintFile"}),"\n",(0,r.jsx)(n.h2,{id:"eslintfiletext-fullfilepath-projectfullpath",children:"ESLintFile(text, fullFilePath, projectFullPath)"}),"\n",(0,r.jsx)(n.p,{children:"Runs ESLint on a file\nThis is only available in the native app"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"text"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"fullFilePath"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"projectFullPath"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})})]})]})]}),"\n",(0,r.jsx)("a",{name:"openNativeTerminal"}),"\n",(0,r.jsx)(n.h2,{id:"opennativeterminalcwd-usepowershell",children:"openNativeTerminal(cwd, [usePowerShell])"}),"\n",(0,r.jsx)(n.p,{children:"Runs ESLint on a file\nThis is only available in the native app"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Default"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"cwd"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{}),(0,r.jsx)(n.td,{children:"the working directory of terminal"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"[usePowerShell]"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"boolean"})}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"false"})}),(0,r.jsx)(n.td,{})]})]})]}),"\n",(0,r.jsx)("a",{name:"openInDefaultApp"}),"\n",(0,r.jsxs)(n.h2,{id:"openindefaultappfullpath--promisevoid",children:["openInDefaultApp(fullPath) \u21d2 ",(0,r.jsx)("code",{children:"Promise."})]}),"\n",(0,r.jsx)(n.p,{children:"Opens a file in the default application for its type on Windows, macOS, and Linux."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise."})," - - Resolves if the file/folder is opened successfully, rejects otherwise."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Param"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsx)(n.tbody,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"fullPath"}),(0,r.jsx)(n.td,{children:(0,r.jsx)("code",{children:"string"})}),(0,r.jsx)(n.td,{children:"The path to the file/folder to open."})]})})]}),"\n",(0,r.jsx)("a",{name:"getDeviceID"}),"\n",(0,r.jsxs)(n.h2,{id:"getdeviceid--promisestringnull",children:["getDeviceID() \u21d2 ",(0,r.jsx)("code",{children:"Promise.<(string|null)>"})]}),"\n",(0,r.jsx)(n.p,{children:"gets the os device id. this usually won't change till os reinstall."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise.<(string|null)>"})," - - Resolves with the os identifier or null",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("code",{children:"Error"})," - If called from the browser"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"addDeviceLicenseSystemWide"}),"\n",(0,r.jsxs)(n.h2,{id:"adddevicelicensesystemwide--promiseboolean",children:["addDeviceLicenseSystemWide() \u21d2 ",(0,r.jsx)("code",{children:"Promise."})]}),"\n",(0,r.jsx)(n.p,{children:"Enables device license by creating a system-wide license file.\nOn Windows, macOS, and Linux this will request elevation if needed."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise."})," - - Resolves true if system wide defile file added, else false.",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("code",{children:"Error"})," - If called from the browser"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"removeDeviceLicenseSystemWide"}),"\n",(0,r.jsxs)(n.h2,{id:"removedevicelicensesystemwide--promiseboolean",children:["removeDeviceLicenseSystemWide() \u21d2 ",(0,r.jsx)("code",{children:"Promise."})]}),"\n",(0,r.jsx)(n.p,{children:"Removes the system-wide device license file.\nOn Windows, macOS, and Linux this will request elevation if needed."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise."})," - - Resolves true if system wide defile file removed, else false.",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("code",{children:"Error"})," - If called from the browser"]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"isLicensedDeviceSystemWide"}),"\n",(0,r.jsxs)(n.h2,{id:"islicenseddevicesystemwide--promiseboolean",children:["isLicensedDeviceSystemWide() \u21d2 ",(0,r.jsx)("code",{children:"Promise."})]}),"\n",(0,r.jsxs)(n.p,{children:["Checks if the current machine is configured to check for system-wide device license for all users at app start.\nThis validates that the system-wide license file exists, contains valid JSON, and has ",(0,r.jsx)(n.code,{children:"licensedDevice: true"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise."})," - - Resolves with ",(0,r.jsx)(n.code,{children:"true"})," if the device is licensed, ",(0,r.jsx)(n.code,{children:"false"})," otherwise."]}),"\n",(0,r.jsx)("a",{name:"getOSUserName"}),"\n",(0,r.jsxs)(n.h2,{id:"getosusername--promisestring",children:["getOSUserName() \u21d2 ",(0,r.jsx)("code",{children:"Promise."})]}),"\n",(0,r.jsx)(n.p,{children:"Retrieves the operating system username of the current user.\nThis method is only available in native apps."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise."})," - A promise that resolves to the OS username of the current user.",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("code",{children:"Error"})," Throws an error if called in a browser environment."]}),"\n"]}),"\n",(0,r.jsx)("a",{name:"getSystemSettingsDir"}),"\n",(0,r.jsxs)(n.h2,{id:"getsystemsettingsdir--promisestring",children:["getSystemSettingsDir() \u21d2 ",(0,r.jsx)("code",{children:"Promise."})]}),"\n",(0,r.jsx)(n.p,{children:"Retrieves the directory path for system settings. This method is applicable to native apps only."}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Kind"}),": global function",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Returns"}),": ",(0,r.jsx)("code",{children:"Promise."})," - A promise that resolves to the path of the system settings directory.",(0,r.jsx)(n.br,{}),"\n",(0,r.jsx)(n.strong,{children:"Throws"}),":"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)("code",{children:"Error"})," If the method is called in browser app."]}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},28453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>d});var i=s(96540);const r={},l=i.createContext(r);function t(e){const n=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),i.createElement(l.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/08a857c2.00f23e7a.js b/assets/js/08a857c2.00f23e7a.js
new file mode 100644
index 00000000..18b34c16
--- /dev/null
+++ b/assets/js/08a857c2.00f23e7a.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1711],{54784:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>d,default:()=>h,frontMatter:()=>s,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"API-Reference/preferences/StateManager","title":"StateManager","description":"Import :","source":"@site/api/API-Reference/preferences/StateManager.md","sourceDirName":"API-Reference/preferences","slug":"/API-Reference/preferences/StateManager","permalink":"/api/API-Reference/preferences/StateManager","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"PreferencesManager","permalink":"/api/API-Reference/preferences/PreferencesManager"},"next":{"title":"FileSyncManager","permalink":"/api/API-Reference/project/FileSyncManager"}}');var i=t(74848),c=t(28453);const s={},d=void 0,l={},o=[{value:"Import :",id:"import-",level:3},{value:"_",id:"_",level:2},{value:"PROJECT_CONTEXT : string",id:"project_context--string",level:2},{value:"GLOBAL_CONTEXT : string",id:"global_context--string",level:2},{value:"PROJECT_THEN_GLOBAL_CONTEXT : string",id:"project_then_global_context--string",level:2},{value:"getVal(id, [context])",id:"getvalid-context",level:2},{value:"setVal(id, value, [context])",id:"setvalid-value-context",level:2},{value:"definePreferenceInternal(id, type, initial, options) \u21d2 Object",id:"definepreferenceinternalid-type-initial-options--object",level:2},{value:"getPreferenceInternal(id) \u21d2 Object",id:"getpreferenceinternalid--object",level:2},{value:"createExtensionStateManager(extensionID) \u21d2 object",id:"createextensionstatemanagerextensionid--object",level:2}];function a(e){const n={br:"br",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,c.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h3,{id:"import-",children:"Import :"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:'const StateManager = brackets.getModule("preferences/StateManager")\n'})}),"\n",(0,i.jsx)("a",{name:"_"}),"\n",(0,i.jsx)(n.h2,{id:"_",children:"_"}),"\n",(0,i.jsx)(n.p,{children:"StateManager"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": global constant"]}),"\n",(0,i.jsx)("a",{name:"PROJECT_CONTEXT"}),"\n",(0,i.jsxs)(n.h2,{id:"project_context--string",children:["PROJECT_CONTEXT : ",(0,i.jsx)("code",{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:"Project specific context"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": global constant"]}),"\n",(0,i.jsx)("a",{name:"GLOBAL_CONTEXT"}),"\n",(0,i.jsxs)(n.h2,{id:"global_context--string",children:["GLOBAL_CONTEXT : ",(0,i.jsx)("code",{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:"Global context"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": global constant"]}),"\n",(0,i.jsx)("a",{name:"PROJECT_THEN_GLOBAL_CONTEXT"}),"\n",(0,i.jsxs)(n.h2,{id:"project_then_global_context--string",children:["PROJECT_THEN_GLOBAL_CONTEXT : ",(0,i.jsx)("code",{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:"Project or global context"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": global constant"]}),"\n",(0,i.jsx)("a",{name:"getVal"}),"\n",(0,i.jsx)(n.h2,{id:"getvalid-context",children:"getVal(id, [context])"}),"\n",(0,i.jsx)(n.p,{children:"Convenience function that gets a view state"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"id"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"preference to get"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[context]"}),(0,i.jsxs)(n.td,{children:[(0,i.jsx)("code",{children:"Object"})," | ",(0,i.jsx)("code",{children:"string"})]}),(0,i.jsx)(n.td,{children:"Optional additional information about the request, can be: - ScopeManager.PROJECT_CONTEXT if you want to get project specific value or - ScopeManager.GLOBAL_CONTEXT if you want to get it from global context and not the project context. - null/undefined if you want to get from project context first, and then global context if not found in project context."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[context.scope]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"Eg. user - deprecated, do not use"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[context.layer]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"Eg. project - deprecated, do not use"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[context.layerID]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"Eg. /tauri/path/to/project - deprecated, do not use"})]})]})]}),"\n",(0,i.jsx)("a",{name:"setVal"}),"\n",(0,i.jsx)(n.h2,{id:"setvalid-value-context",children:"setVal(id, value, [context])"}),"\n",(0,i.jsx)(n.p,{children:"Convenience function that sets a view state and then saves the file"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"id"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"preference to set"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"value"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"*"})}),(0,i.jsx)(n.td,{children:"new value for the preference"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[context]"}),(0,i.jsxs)(n.td,{children:[(0,i.jsx)("code",{children:"Object"})," | ",(0,i.jsx)("code",{children:"string"})]}),(0,i.jsx)(n.td,{children:"Optional additional information about the request, can be: ScopeManager.PROJECT_CONTEXT if you want to get project specific value or ScopeManager.GLOBAL_CONTEXT or null if you want to set globally."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[context.scope]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"Eg. user - deprecated, do not use"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[context.layer]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"Eg. project - deprecated, do not use"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[context.layerID]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"Eg. /tauri/path/to/project - deprecated, do not use"})]})]})]}),"\n",(0,i.jsx)("a",{name:"definePreferenceInternal"}),"\n",(0,i.jsxs)(n.h2,{id:"definepreferenceinternalid-type-initial-options--object",children:["definePreferenceInternal(id, type, initial, options) \u21d2 ",(0,i.jsx)("code",{children:"Object"})]}),"\n",(0,i.jsxs)(n.p,{children:["returns a preference instance that can be listened ",(0,i.jsx)(n.code,{children:'.on("change", cbfn(changeType))'})," . The callback fucntion will be called\nwhenever there is a change in the supplied id with a changeType argument. The change type can be one of the two:\nCHANGE_TYPE_INTERNAL - if change is made within the current app window/browser tap\nCHANGE_TYPE_EXTERNAL - if change is made in a different app window/browser tab"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsx)(n.tr,{children:(0,i.jsx)(n.th,{children:"Param"})})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsx)(n.tr,{children:(0,i.jsx)(n.td,{children:"id"})}),(0,i.jsx)(n.tr,{children:(0,i.jsx)(n.td,{children:"type"})}),(0,i.jsx)(n.tr,{children:(0,i.jsx)(n.td,{children:"initial"})}),(0,i.jsx)(n.tr,{children:(0,i.jsx)(n.td,{children:"options"})})]})]}),"\n",(0,i.jsx)("a",{name:"getPreferenceInternal"}),"\n",(0,i.jsxs)(n.h2,{id:"getpreferenceinternalid--object",children:["getPreferenceInternal(id) \u21d2 ",(0,i.jsx)("code",{children:"Object"})]}),"\n",(0,i.jsx)(n.p,{children:"Get the preference instance for the given ID."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"id"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})})]})})]}),"\n",(0,i.jsx)("a",{name:"createExtensionStateManager"}),"\n",(0,i.jsxs)(n.h2,{id:"createextensionstatemanagerextensionid--object",children:["createExtensionStateManager(extensionID) \u21d2 ",(0,i.jsx)("code",{children:"object"})]}),"\n",(0,i.jsx)(n.p,{children:"create a state manager for an extension.\nensure that the IDs are unique."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": global function",(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.strong,{children:"Returns"}),": ",(0,i.jsx)("code",{children:"object"})," - Object with methods to manage the extension's state and preferences."]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"get(id, context)"}),": Get the value from the extension's state."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"set(id, value, context)"}),": Set the value in the extension's state."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"definePreference(id, type, initial, options)"}),": define a preference for the extension."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"getPreference(id)"}),": retrieve a defined preference."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"PROJECT_CONTEXT"}),", ",(0,i.jsx)(n.code,{children:"GLOBAL_CONTEXT"}),", ",(0,i.jsx)(n.code,{children:"PROJECT_THEN_GLOBAL_CONTEXT"}),": constant for context management."]}),"\n"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"extensionID"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})})]})})]})]})}function h(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>d});var r=t(96540);const i={},c=r.createContext(i);function s(e){const n=r.useContext(c);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),r.createElement(c.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/09d9f6f3.ca4ae693.js b/assets/js/09d9f6f3.ca4ae693.js
new file mode 100644
index 00000000..2fbbb212
--- /dev/null
+++ b/assets/js/09d9f6f3.ca4ae693.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9710],{58529:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>l,contentTitle:()=>d,default:()=>o,frontMatter:()=>c,metadata:()=>n,toc:()=>h});const n=JSON.parse('{"id":"API-Reference/search/QuickSearchField","title":"QuickSearchField","description":"Import :","source":"@site/api/API-Reference/search/QuickSearchField.md","sourceDirName":"API-Reference/search","slug":"/API-Reference/search/QuickSearchField","permalink":"/api/API-Reference/search/QuickSearchField","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"QuickOpenHelper","permalink":"/api/API-Reference/search/QuickOpenHelper"},"next":{"title":"SearchModel","permalink":"/api/API-Reference/search/SearchModel"}}');var s=t(74848),r=t(28453);const c={},d=void 0,l={},h=[{value:"Import :",id:"import-",level:3},{value:"QuickSearchField",id:"quicksearchfield",level:2},{value:"new QuickSearchField($input)",id:"new-quicksearchfieldinput",level:3},{value:"quickSearchField.options : Object",id:"quicksearchfieldoptions--object",level:3},{value:"quickSearchField.$input : jQueryObject",id:"quicksearchfieldinput--jqueryobject",level:3},{value:"quickSearchField.$positionEl : jQueryObject",id:"quicksearchfieldpositionel--jqueryobject",level:3},{value:"quickSearchField.updateResults()",id:"quicksearchfieldupdateresults",level:3},{value:"quickSearchField.setText(value)",id:"quicksearchfieldsettextvalue",level:3},{value:"quickSearchField.destroy()",id:"quicksearchfielddestroy",level:3},{value:"KeyEvent",id:"keyevent",level:2}];function a(e){const i={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(i.h3,{id:"import-",children:"Import :"}),"\n",(0,s.jsx)(i.pre,{children:(0,s.jsx)(i.code,{className:"language-js",children:'const QuickSearchField = brackets.getModule("search/QuickSearchField")\n'})}),"\n",(0,s.jsx)("a",{name:"QuickSearchField"}),"\n",(0,s.jsx)(i.h2,{id:"quicksearchfield",children:"QuickSearchField"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Kind"}),": global class"]}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"#QuickSearchField",children:"QuickSearchField"}),"\n",(0,s.jsxs)(i.ul,{children:["\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"#new_QuickSearchField_new",children:"new QuickSearchField($input)"})}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"#QuickSearchField+options",children:".options"})," : ",(0,s.jsx)("code",{children:"Object"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"#QuickSearchField+$input",children:".$input"})," : ",(0,s.jsx)("code",{children:"jQueryObject"})]}),"\n",(0,s.jsxs)(i.li,{children:[(0,s.jsx)(i.a,{href:"#QuickSearchField+$positionEl",children:".$positionEl"})," : ",(0,s.jsx)("code",{children:"jQueryObject"})]}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"#QuickSearchField+updateResults",children:".updateResults()"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"#QuickSearchField+setText",children:".setText(value)"})}),"\n",(0,s.jsx)(i.li,{children:(0,s.jsx)(i.a,{href:"#QuickSearchField+destroy",children:".destroy()"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)("a",{name:"new_QuickSearchField_new"}),"\n",(0,s.jsx)(i.h3,{id:"new-quicksearchfieldinput",children:"new QuickSearchField($input)"}),"\n",(0,s.jsx)(i.p,{children:'Attaches to an existing "input" tag'}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Param"}),(0,s.jsx)(i.th,{children:"Type"}),(0,s.jsx)(i.th,{children:"Description"})]})}),(0,s.jsxs)(i.tbody,{children:[(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"$input"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"jQueryObject"})}),(0,s.jsx)(i.td,{})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.resultProvider"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"function"})}),(0,s.jsx)(i.td,{children:'Given the current search text, returns an array of result objects, an error object, or a Promise that yields one of those. If the Promise is still outstanding when the query next changes, resultProvider() will be called again (without waiting for the earlier Promise), and the Promise\'s result will be ignored. If the provider yields [], or a non-null error string, input is decorated with ".no-results"; if the provider yields a null error string, input is not decorated.'})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.formatter"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"function"})}),(0,s.jsx)(i.td,{children:'Converts one result object to a string of HTML text. Passed the item and the current query. The outermost element must be "li". The ".highlight" class can be ignored as it is applied automatically.'})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.onCommit"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"function"})}),(0,s.jsx)(i.td,{children:"Called when an item is selected by clicking or pressing Enter. Passed the committed item and the current query and its index. If the current result list is not up to date with the query text at the time Enter is pressed, waits until it is before running this callback. If Enter pressed with no results, passed null. The popup remains open after this event."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.onHighlight"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"function"})}),(0,s.jsx)(i.td,{children:"Called when an item is highlighted in the list. Passed the item, the current query, and a flag that is true if the item was highlighted explicitly (arrow keys), not simply due to a results list update. Since the top item in the list is always initially highlighted, every time the list is updated onHighlight() is called with the top item and with the explicit flag set to false."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.onDelete"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"function"})}),(0,s.jsx)(i.td,{children:"Called when delete key is pressed on a selected item in the list. Passed the item."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.onDismiss"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"function"})}),(0,s.jsx)(i.td,{children:"Called when popup is dismissed with escape key press. Popup is not usable after this point."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.maxResults"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"number"})}),(0,s.jsx)(i.td,{children:"Maximum number of items from resultProvider() to display in the popup."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.verticalAdjust"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"number"})}),(0,s.jsx)(i.td,{children:"Number of pixels to position the popup below where $input is when constructor is called. Useful if UI is going to animate position after construction, but QuickSearchField may receive input before the animation is done."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.$positionEl"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"jQueryObject"})}),(0,s.jsx)(i.td,{children:"If provided, the popup will be positioned based on this."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.firstHighlightIndex"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"number"})}),(0,s.jsx)(i.td,{children:"Index of the result that is highlighted by default. null to not highlight any result."})]}),(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"options.focusLastActiveElementOnClose"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"boolean"})}),(0,s.jsx)(i.td,{children:"If set to true, focuses the last active element on close. By default, the editor is always focused."})]})]})]}),"\n",(0,s.jsx)("a",{name:"QuickSearchField+options"}),"\n",(0,s.jsxs)(i.h3,{id:"quicksearchfieldoptions--object",children:["quickSearchField.options : ",(0,s.jsx)("code",{children:"Object"})]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Kind"}),": instance property of ",(0,s.jsx)(i.a,{href:"#QuickSearchField",children:(0,s.jsx)("code",{children:"QuickSearchField"})})]}),"\n",(0,s.jsx)("a",{name:"QuickSearchField+$input"}),"\n",(0,s.jsxs)(i.h3,{id:"quicksearchfieldinput--jqueryobject",children:["quickSearchField.$input : ",(0,s.jsx)("code",{children:"jQueryObject"})]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Kind"}),": instance property of ",(0,s.jsx)(i.a,{href:"#QuickSearchField",children:(0,s.jsx)("code",{children:"QuickSearchField"})})]}),"\n",(0,s.jsx)("a",{name:"QuickSearchField+$positionEl"}),"\n",(0,s.jsxs)(i.h3,{id:"quicksearchfieldpositionel--jqueryobject",children:["quickSearchField.$positionEl : ",(0,s.jsx)("code",{children:"jQueryObject"})]}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Kind"}),": instance property of ",(0,s.jsx)(i.a,{href:"#QuickSearchField",children:(0,s.jsx)("code",{children:"QuickSearchField"})})]}),"\n",(0,s.jsx)("a",{name:"QuickSearchField+updateResults"}),"\n",(0,s.jsx)(i.h3,{id:"quicksearchfieldupdateresults",children:"quickSearchField.updateResults()"}),"\n",(0,s.jsx)(i.p,{children:"Refresh the results dropdown, as if the user had changed the search text. Useful for providers that\nwant to show cached data initially, then update the results with fresher data once available."}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Kind"}),": instance method of ",(0,s.jsx)(i.a,{href:"#QuickSearchField",children:(0,s.jsx)("code",{children:"QuickSearchField"})})]}),"\n",(0,s.jsx)("a",{name:"QuickSearchField+setText"}),"\n",(0,s.jsx)(i.h3,{id:"quicksearchfieldsettextvalue",children:"quickSearchField.setText(value)"}),"\n",(0,s.jsx)(i.p,{children:"Programmatically changes the search text and updates the results."}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Kind"}),": instance method of ",(0,s.jsx)(i.a,{href:"#QuickSearchField",children:(0,s.jsx)("code",{children:"QuickSearchField"})})]}),"\n",(0,s.jsxs)(i.table,{children:[(0,s.jsx)(i.thead,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.th,{children:"Param"}),(0,s.jsx)(i.th,{children:"Type"})]})}),(0,s.jsx)(i.tbody,{children:(0,s.jsxs)(i.tr,{children:[(0,s.jsx)(i.td,{children:"value"}),(0,s.jsx)(i.td,{children:(0,s.jsx)("code",{children:"string"})})]})})]}),"\n",(0,s.jsx)("a",{name:"QuickSearchField+destroy"}),"\n",(0,s.jsx)(i.h3,{id:"quicksearchfielddestroy",children:"quickSearchField.destroy()"}),"\n",(0,s.jsx)(i.p,{children:"Closes the dropdown, and discards any pending Promises."}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Kind"}),": instance method of ",(0,s.jsx)(i.a,{href:"#QuickSearchField",children:(0,s.jsx)("code",{children:"QuickSearchField"})})]}),"\n",(0,s.jsx)("a",{name:"KeyEvent"}),"\n",(0,s.jsx)(i.h2,{id:"keyevent",children:"KeyEvent"}),"\n",(0,s.jsx)(i.p,{children:"Text field with attached dropdown list that is updated (based on a provider) whenever the text changes."}),"\n",(0,s.jsx)(i.p,{children:"For styling, the DOM structure of the popup is as follows:\nbody\nol.quick-search-container\nli\nli.highlight\nli\nAnd the text field is:\ninput\ninput.no-results"}),"\n",(0,s.jsxs)(i.p,{children:[(0,s.jsx)(i.strong,{children:"Kind"}),": global constant"]})]})}function o(e={}){const{wrapper:i}={...(0,r.R)(),...e.components};return i?(0,s.jsx)(i,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},28453:(e,i,t)=>{t.d(i,{R:()=>c,x:()=>d});var n=t(96540);const s={},r=n.createContext(s);function c(e){const i=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function d(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),n.createElement(r.Provider,{value:i},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0b7c8f83.f4ac1996.js b/assets/js/0b7c8f83.f4ac1996.js
new file mode 100644
index 00000000..7d7c1893
--- /dev/null
+++ b/assets/js/0b7c8f83.f4ac1996.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2566],{45956:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>d,default:()=>c,frontMatter:()=>r,metadata:()=>t,toc:()=>l});var t=i(61247),o=i(74848),s=i(28453);const r={slug:"release-3.10",title:"Editor Experience Release (November-2024, V-3.10) is now Live",description:"Phoenix Code 3.10 improves the editor UI with indent guide lines, better performance, and visual feedback. Updated extension developer docs.",authors:["arun","charly","devvaannsh","phoenixBot"],tags:["Editor Experience","UI Improvements","Windows","Linux","Mac","Release"]},d=void 0,a={authorsImageUrls:[void 0,void 0,void 0,void 0]},l=[{value:"Indent Guide Lines",id:"indent-guide-lines",level:2},{value:"Customizable Editor Line Height",id:"customizable-editor-line-height",level:2},{value:"Line:Col Indicator Relocation",id:"linecol-indicator-relocation",level:2},{value:"Performance Tweaks",id:"performance-tweaks",level:2},{value:"Stability Improvements",id:"stability-improvements",level:2},{value:"Documentation Updates",id:"documentation-updates",level:2},{value:"All changes",id:"all-changes",level:2},{value:"A Request from the Phoenix Team:",id:"a-request-from-the-phoenix-team",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",img:"img",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["November release(3.10) of Phoenix Code is now available for download at ",(0,o.jsx)(n.a,{href:"https://phcode.io",children:"phcode.io"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["This month's core theme is ",(0,o.jsx)(n.code,{children:"Editor UI improvements"}),". We have fine-tuned the editing experience for better\nperformance and visual feedback.\nWe've also made substantial improvements to ",(0,o.jsx)(n.a,{href:"https://docs.phcode.dev",children:"docs.phcode.dev"})," to better support extension\ndevelopers."]}),"\n",(0,o.jsx)(n.h2,{id:"indent-guide-lines",children:"Indent Guide Lines"}),"\n",(0,o.jsxs)(n.p,{children:["Phoenix Code now supports indent guidelines to help you better visualize code structure. This feature can\nbe toggled via ",(0,o.jsx)(n.code,{children:"View > Indent Guide Lines"}),". ",(0,o.jsx)(n.a,{href:"https://docs.phcode.dev/docs/editing-text#indent-guide-lines",children:"Read more..."})]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{src:"https://github.com/user-attachments/assets/3d9d0c55-3c9e-4ab3-bbc0-53b563d19e39",alt:"image"})}),"\n",(0,o.jsx)(n.h2,{id:"customizable-editor-line-height",children:"Customizable Editor Line Height"}),"\n",(0,o.jsxs)(n.p,{children:["Theme Settings (",(0,o.jsx)(n.code,{children:"View > Themes..."}),") now has a new ",(0,o.jsx)(n.code,{children:"Line Height"})," slider. Adjust the editor line height between 1x and 3x to find your\nperfect balance of readability and screen real estate. ",(0,o.jsx)(n.a,{href:"https://docs.phcode.dev/docs/editing-text#line-height",children:"Read more..."})]}),"\n",(0,o.jsxs)(n.p,{children:["Also added a ",(0,o.jsx)(n.code,{children:"Get More..."})," button to the Themes dialog, linking directly to the themes section in Extension Manager."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{src:"https://github.com/user-attachments/assets/97a46d9a-e971-401d-8a77-015afa6d5972",alt:"image"})}),"\n",(0,o.jsxs)(n.h2,{id:"linecol-indicator-relocation",children:[(0,o.jsx)(n.code,{children:"Line:Col"})," Indicator Relocation"]}),"\n",(0,o.jsxs)(n.p,{children:["Moved to the right of the status bar, accommodating future status bar extensions. Click on the ",(0,o.jsx)(n.code,{children:"line:col"})," section in the\nstatusbar to jump to specific lines."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{src:"https://github.com/user-attachments/assets/540ea992-dda0-4a2c-8042-3c6228616636",alt:"image"})}),"\n",(0,o.jsx)(n.h2,{id:"performance-tweaks",children:"Performance Tweaks"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.a,{href:"https://github.com/phcode-dev/phoenix/pull/1943",children:"Major improvements to editor rendering"})," with better editor scroll\nconsistency and performance, especially on Safari and macOS."]}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://github.com/phcode-dev/phoenix/pull/1937",children:"Faster startup of extension manager."})}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"stability-improvements",children:"Stability Improvements"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://github.com/phcode-dev/phoenix/pull/1889",children:"File recovery now does integrity checks for more reliable crash recovery."})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://github.com/phcode-dev/phoenix/pull/1838",children:"Fixed Markdown image link handling within href tags."})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"https://github.com/phcode-dev/phoenix/pull/1932",children:"Improved extension registry management to prevent quota issues on Mac/Linux."})}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"documentation-updates",children:"Documentation Updates"}),"\n",(0,o.jsxs)(n.p,{children:["Our documentation site - ",(0,o.jsx)(n.a,{href:"https://docs.phcode.dev",children:"docs.phcode.dev"})," has received a major overhaul:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Updated user guide: ",(0,o.jsx)(n.a,{href:"https://docs.phcode.dev/docs/intro",children:"docs.phcode.dev/docs/intro"})]}),"\n",(0,o.jsxs)(n.li,{children:["New API documentation for extension developers: ",(0,o.jsx)(n.a,{href:"https://docs.phcode.dev/api/getting-started",children:"docs.phcode.dev/api/getting-started"})]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"all-changes",children:"All changes"}),"\n",(0,o.jsxs)(n.p,{children:["Please see ",(0,o.jsx)(n.a,{href:"https://github.com/phcode-dev/phoenix/commits/main/?since=2024-09-11&until=2024-11-24",children:"this link"})," for a full list of changes\nin GitHub."]}),"\n",(0,o.jsx)(n.h2,{id:"a-request-from-the-phoenix-team",children:"A Request from the Phoenix Team:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Share your feedback:"})," ",(0,o.jsx)(n.a,{href:"https://github.com/orgs/phcode-dev/discussions",children:"https://github.com/orgs/phcode-dev/discussions"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Spread the word"})," about Phoenix to friends and colleagues."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsxs)(n.a,{href:"https://github.com/sponsors/phcode-dev",children:[(0,o.jsx)(n.strong,{children:"Consider supporting us"})," on GitHub Sponsors"]}),". Every contribution helps us\nto keep improving Phoenix Code."]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"With gratitude,"}),"\n",(0,o.jsx)(n.p,{children:"The Phoenix Team"})]})}function c(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>r,x:()=>d});var t=i(96540);const o={},s=t.createContext(o);function r(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),t.createElement(s.Provider,{value:n},e.children)}},61247:e=>{e.exports=JSON.parse('{"permalink":"/blog/release-3.10","editUrl":"https://github.com/phcode-dev/docs/blob/main/blog/2024-11-24-Release-3.10/index.md","source":"@site/blog/2024-11-24-Release-3.10/index.md","title":"Editor Experience Release (November-2024, V-3.10) is now Live","description":"Phoenix Code 3.10 improves the editor UI with indent guide lines, better performance, and visual feedback. Updated extension developer docs.","date":"2024-11-24T00:00:00.000Z","tags":[{"inline":true,"label":"Editor Experience","permalink":"/blog/tags/editor-experience"},{"inline":true,"label":"UI Improvements","permalink":"/blog/tags/ui-improvements"},{"inline":true,"label":"Windows","permalink":"/blog/tags/windows"},{"inline":true,"label":"Linux","permalink":"/blog/tags/linux"},{"inline":true,"label":"Mac","permalink":"/blog/tags/mac"},{"inline":true,"label":"Release","permalink":"/blog/tags/release"}],"readingTime":2.09,"hasTruncateMarker":false,"authors":[{"name":"Arun Bose","title":"Co-Founder, Phoenix Code","url":"https://github.com/abose","imageURL":"https://github.com/abose.png","key":"arun","page":null},{"name":"Charly P Abraham","title":"Co-Founder, Phoenix Code","url":"https://github.com/charlypa","imageURL":"https://github.com/charlypa.png","key":"charly","page":null},{"name":"Devansh Agarwal","title":"Founding Engineer, Phoenix Code","url":"https://github.com/devvaannsh","imageURL":"https://github.com/devvaannsh.png","key":"devvaannsh","page":null},{"name":"Phoenix Code Bot","title":"Our little elf who keeps the whole place together","url":"https://github.com/phoenixide","imageURL":"https://github.com/phoenixide.png","key":"phoenixBot","page":null}],"frontMatter":{"slug":"release-3.10","title":"Editor Experience Release (November-2024, V-3.10) is now Live","description":"Phoenix Code 3.10 improves the editor UI with indent guide lines, better performance, and visual feedback. Updated extension developer docs.","authors":["arun","charly","devvaannsh","phoenixBot"],"tags":["Editor Experience","UI Improvements","Windows","Linux","Mac","Release"]},"unlisted":false,"prevItem":{"title":"Phoenix Code: The Legacy of Brackets - Continued","permalink":"/blog/Blog-Legacy"},"nextItem":{"title":"HTML Workflows and stability Release (September-2024, V-3.9) is now Live","permalink":"/blog/release-3.9"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/0d1709d8.348e6b8b.js b/assets/js/0d1709d8.348e6b8b.js
new file mode 100644
index 00000000..8d65dfc7
--- /dev/null
+++ b/assets/js/0d1709d8.348e6b8b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[138],{4536:(e,n,a)=>{a.r(n),a.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"How-To/Panels","title":"How to create Panels","description":"In Phoenix Code, Panels are of two types :- Plugin Panel and Bottom Panel.","source":"@site/api/08-How-To/Panels.md","sourceDirName":"08-How-To","slug":"/How-To/Panels","permalink":"/api/How-To/Panels","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"How to create Panels"},"sidebar":"tutorialSidebar","previous":{"title":"Add Menus, Menu items and Keyboard Shortcuts","permalink":"/api/How-To/Menus"},"next":{"title":"Add an indicator icon on the status bar","permalink":"/api/How-To/StatusBar"}}');var s=a(74848),l=a(28453);const i={title:"How to create Panels"},o=void 0,r={},c=[{value:"Creating a Plugin Panel",id:"creating-a-plugin-panel",level:2},{value:"Managing Plugin Panel State",id:"managing-plugin-panel-state",level:2},{value:"Creating a Bottom Panel",id:"creating-a-bottom-panel",level:2},{value:"Managing Bottom Panel State",id:"managing-bottom-panel-state",level:2},{value:"Best Practices",id:"best-practices",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["In Phoenix Code, Panels are of two types :- ",(0,s.jsx)(n.code,{children:"Plugin Panel"})," and ",(0,s.jsx)(n.code,{children:"Bottom Panel"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Plugin Panel"})," appears on the side of the screen, generally the left side. For Example :- ",(0,s.jsx)(n.em,{children:"Live Preview"})," feature uses the ",(0,s.jsx)(n.code,{children:"Plugin Panel"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Plugin Panel Example",src:a(97925).A+"",width:"1919",height:"1099"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Bottom Panel"})," appears on the bottom of the screen as a tab. Multiple bottom panels share a tabbed interface where each panel gets its own tab with an icon and title. For Example :- ",(0,s.jsx)(n.em,{children:"Git"}),", ",(0,s.jsx)(n.em,{children:"Terminal"}),", ",(0,s.jsx)(n.em,{children:"Problems"})," panel and many more use the ",(0,s.jsx)(n.code,{children:"Bottom Panel"}),"."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Bottom Panel Example",src:a(12053).A+"",width:"1919",height:"1105"})}),"\n",(0,s.jsx)(n.p,{children:"This document outlines the basic features of working with Panels."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#creating-a-plugin-panel",children:"How to create a Plugin Panel"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#managing-plugin-panel-state",children:"How to manage Plugin Panel state"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#creating-a-bottom-panel",children:"How to create a Bottom Panel"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#managing-bottom-panel-state",children:"How to manage Bottom Panel state"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#best-practices",children:"Best Practices for Panels"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"creating-a-plugin-panel",children:"Creating a Plugin Panel"}),"\n",(0,s.jsx)(n.p,{children:"To create a plugin panel, follow these steps:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsxs)(n.strong,{children:["Import the ",(0,s.jsx)(n.code,{children:"WorkSpaceManager"})," modules"]})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:'const WorkspaceManager = brackets.getModule("view/WorkspaceManager");\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Create panel content"}),"\nCreate a jQuery object containing your panel's HTML content:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:'const $panel = $("
")\n .attr("id", "my-extension-panel")\n .html("
My Plugin Panel
Hello from the panel!
");\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Create toolbar icon"}),"\nCreate a toolbar icon to toggle the panel."]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsx)(n.p,{children:"Creating a toolbar icon is mandatory, else the panel won't show up."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Create the plugin panel"}),"\nUse ",(0,s.jsx)(n.code,{children:"WorkspaceManager.createPluginPanel()"})," to create your panel:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:'const pluginPanel = WorkspaceManager.createPluginPanel(\n "myextension.panel", // Unique ID using package-style naming\n $panel, // jQuery object for panel content\n 200, // minSize in pixels\n $toolbarIcon, // toolbar icon\n 400 // initialSize in pixels (optional)\n);\n'})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["For a detailed description, refer to ",(0,s.jsx)(n.a,{href:"https://docs.phcode.dev/api/API-Reference/view/WorkspaceManager#createPluginPanel",children:"this link"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Full Code Example:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:'define(function (require, exports, module) {\n "use strict";\n \n // Brackets modules\n const AppInit = brackets.getModule("utils/AppInit"),\n CommandManager = brackets.getModule("command/CommandManager"),\n Menus = brackets.getModule("command/Menus"),\n WorkspaceManager = brackets.getModule("view/WorkspaceManager");\n \n let pluginPanel; // Store panel reference\n \n // Function to run when the menu item is clicked\n function handleTestExtension() {\n if (!pluginPanel) {\n // Create panel content\n const $panel = $("
")\n .attr("id", "my-extension-panel")\n .html("
My Plugin Panel
Hello from the panel!
");\n \n // Create toolbar icon\n const $toolbarIcon = $("#panel");\n \n // Create the plugin panel\n pluginPanel = WorkspaceManager.createPluginPanel(\n "myextension.panel",\n $panel,\n 200,\n $toolbarIcon,\n 400\n );\n pluginPanel.show();\n }\n }\n \n // Register command\n const MY_COMMAND_ID = "test_menuitem";\n CommandManager.register("Toggle Panel", MY_COMMAND_ID, handleTestExtension);\n \n // Add Menu item\n const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);\n menu.addMenuItem(MY_COMMAND_ID);\n \n // Initialize extension\n AppInit.appReady(function () {\n console.log("Panel extension initialized");\n });\n});\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Visual Reference\n",(0,s.jsx)(n.img,{alt:"Plugin Panel",src:a(16968).A+"",width:"1919",height:"1098"})]}),"\n",(0,s.jsx)(n.h2,{id:"managing-plugin-panel-state",children:"Managing Plugin Panel State"}),"\n",(0,s.jsx)(n.p,{children:"You can control the visibility and state of your plugin panel:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Show/Hide Panel"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:"// Show panel\npluginPanel.show();\n\n// Hide panel\npluginPanel.hide();\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Check Panel Visibility"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:"const isVisible = pluginPanel.isVisible();\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Toggle Panel Visibility"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:"function togglePanel() {\n if (pluginPanel.isVisible()) {\n pluginPanel.hide();\n } else {\n pluginPanel.show();\n }\n}\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"creating-a-bottom-panel",children:"Creating a Bottom Panel"}),"\n",(0,s.jsx)(n.p,{children:"Bottom panels are created similarly to plugin panels but use different methods:"}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["For ",(0,s.jsx)(n.code,{children:"Bottom Panels"})," creating a toolbar icon is not required. Each bottom panel appears as a tab in the shared tab bar."]}),"\n"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Import required modules"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:'const WorkspaceManager = brackets.getModule("view/WorkspaceManager");\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Create the bottom panel"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:'const bottomPanel = WorkspaceManager.createBottomPanel(\n "myextension.panel", // Unique ID using package-style naming\n $panel, // jQuery object for panel content\n undefined, // minSize (deprecated, pass undefined)\n "My Panel", // Title shown on the tab\n {\n iconSvg: "path/to/icon.svg" // SVG icon for the tab\n }\n);\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"title"})}),": The text shown on the panel's tab. If not provided, Phoenix Code uses the text from a ",(0,s.jsx)(n.code,{children:".toolbar .title"})," element inside your panel, or derives it from the panel ID."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:(0,s.jsx)(n.code,{children:"iconSvg"})}),": Path to an SVG file used as the tab icon. The icon automatically adapts to light and dark themes. If not provided, a default icon is used."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"minSize"})," parameter (third argument) is deprecated and no longer used. Pass ",(0,s.jsx)(n.code,{children:"undefined"})," for this parameter."]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["For a detailed description, refer to ",(0,s.jsx)(n.a,{href:"https://docs.phcode.dev/api/API-Reference/view/WorkspaceManager#createBottomPanel",children:"this link"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Full Code Example for Bottom Panel:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:' define(function (require, exports, module) {\n "use strict";\n \n // Brackets modules\n const AppInit = brackets.getModule("utils/AppInit"),\n CommandManager = brackets.getModule("command/CommandManager"),\n Menus = brackets.getModule("command/Menus"),\n WorkspaceManager = brackets.getModule("view/WorkspaceManager");\n \n let bottomPanel; // Store panel reference\n \n // Function to run when the menu item is clicked\n function handleTestExtension() {\n if (!bottomPanel) {\n // Create panel content\n const $panel = $("
")\n .attr("id", "my-extension-panel")\n .html("
My Bottom Panel
Hello from the panel!
");\n \n // Create the bottom panel\n bottomPanel = WorkspaceManager.createBottomPanel(\n "myextension.panel",\n $panel,\n undefined,\n "My Panel",\n { iconSvg: "styles/images/panel-icon-default.svg" }\n );\n bottomPanel.show();\n }\n }\n \n // Register command\n const MY_COMMAND_ID = "test_menuitem";\n CommandManager.register("Toggle Panel", MY_COMMAND_ID, handleTestExtension);\n \n // Add Menu item\n const menu = Menus.getMenu(Menus.AppMenuBar.FILE_MENU);\n menu.addMenuItem(MY_COMMAND_ID);\n \n // Initialize extension\n AppInit.appReady(function () {\n console.log("Panel extension initialized");\n });\n });\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Visual Reference\n",(0,s.jsx)(n.img,{alt:"Bottom Panel",src:a(89880).A+"",width:"1919",height:"1125"})]}),"\n",(0,s.jsx)(n.h2,{id:"managing-bottom-panel-state",children:"Managing Bottom Panel State"}),"\n",(0,s.jsx)(n.p,{children:"Bottom panels support similar state management to plugin panels:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Show/Hide Panel"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:"// Show panel\nbottomPanel.show();\n\n// Hide panel\nbottomPanel.hide();\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Check Panel Visibility"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:"const isVisible = bottomPanel.isVisible();\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Toggle Panel Visibility"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:"function togglePanel() {\n if (bottomPanel.isVisible()) {\n bottomPanel.hide();\n } else {\n bottomPanel.show();\n }\n}\n"})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Update Tab Title"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:'bottomPanel.setTitle("New Title");\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Handle Close Confirmation"})}),"\n",(0,s.jsxs)(n.p,{children:["If your panel has unsaved state or running processes, you can register a handler that runs before the panel closes. Return ",(0,s.jsx)(n.code,{children:"false"})," to prevent closing."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:'bottomPanel.registerOnCloseRequestedHandler(async function () {\n if (hasUnsavedChanges) {\n const confirmed = await showConfirmDialog("Discard changes?");\n return confirmed; // true to close, false to cancel\n }\n return true;\n});\n'})}),"\n",(0,s.jsxs)(n.p,{children:["To programmatically close a panel while respecting its close handler, use ",(0,s.jsx)(n.code,{children:"requestClose()"}),":"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-jsx",children:"const wasClosed = await bottomPanel.requestClose();\n"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"best-practices",children:"Best Practices"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:'Always use unique, package-style IDs (e.g., "yourextension.panel-name") to avoid conflicts with other extensions.'}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Save panel state (e.g., visibility, size) in preferences if needed, to restore state when the extension is reloaded."}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.blockquote,{children:["\n",(0,s.jsxs)(n.p,{children:["For more information about the WorkSpace Manager API, refer to the ",(0,s.jsx)(n.a,{href:"https://docs.phcode.dev/api/API-Reference/view/WorkspaceManager",children:"Phoenix Code API documentation"}),"."]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},12053:(e,n,a)=>{a.d(n,{A:()=>t});const t=a.p+"assets/images/bottom-panel-example-d7b102fe2a72cdf87672dde01cf97705.png"},89880:(e,n,a)=>{a.d(n,{A:()=>t});const t=a.p+"assets/images/bottom-panel-84e2d0bb50feeac59a7f228347e97015.png"},97925:(e,n,a)=>{a.d(n,{A:()=>t});const t=a.p+"assets/images/plugin-panel-example-cdf9fbb9ccd3db750380862996b1d82c.png"},16968:(e,n,a)=>{a.d(n,{A:()=>t});const t=a.p+"assets/images/plugin-panel-ffdc0e6edeff5e1b9c10db5957ee911b.png"},28453:(e,n,a)=>{a.d(n,{R:()=>i,x:()=>o});var t=a(96540);const s={},l=t.createContext(s);function i(e){const n=t.useContext(l);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),t.createElement(l.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0dbd8ed0.3fc59dd5.js b/assets/js/0dbd8ed0.3fc59dd5.js
new file mode 100644
index 00000000..2ce09c9b
--- /dev/null
+++ b/assets/js/0dbd8ed0.3fc59dd5.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3316],{87237:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>o,frontMatter:()=>t,metadata:()=>r,toc:()=>h});const r=JSON.parse('{"id":"API-Reference/view/Pane","title":"Pane","description":"Import :","source":"@site/api/API-Reference/view/Pane.md","sourceDirName":"API-Reference/view","slug":"/API-Reference/view/Pane","permalink":"/api/API-Reference/view/Pane","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"MainViewManager","permalink":"/api/API-Reference/view/MainViewManager"},"next":{"title":"PanelView","permalink":"/api/API-Reference/view/PanelView"}}');var d=i(74848),s=i(28453);const t={},l=void 0,a={},h=[{value:"Import :",id:"import-",level:3},{value:"view/Pane",id:"viewpane",level:2},{value:"view/Pane.Pane",id:"viewpanepane",level:3},{value:"new Pane(id, $container)",id:"new-paneid-container",level:4},{value:"pane.id : string",id:"paneid--string",level:4},{value:"pane.$container : JQuery",id:"panecontainer--jquery",level:4},{value:"pane.$el : JQuery",id:"paneel--jquery",level:4},{value:"pane.$header : JQuery",id:"paneheader--jquery",level:4},{value:"pane.$headerText : JQuery",id:"paneheadertext--jquery",level:4},{value:"pane.$headerFlipViewBtn : JQuery",id:"paneheaderflipviewbtn--jquery",level:4},{value:"pane.$headerCloseBtn : JQuery",id:"paneheaderclosebtn--jquery",level:4},{value:"pane.$content : JQuery",id:"panecontent--jquery",level:4},{value:"pane.ITEM_NOT_FOUND",id:"paneitem_not_found",level:4},{value:"pane.ITEM_FOUND_NO_SORT",id:"paneitem_found_no_sort",level:4},{value:"pane.ITEM_FOUND_NEEDS_SORT",id:"paneitem_found_needs_sort",level:4},{value:"pane.mergeFrom(other)",id:"panemergefromother",level:4},{value:"pane.destroy()",id:"panedestroy",level:4},{value:"pane.getViewList() \u21d2 Array.<File>",id:"panegetviewlist--arrayfile",level:4},{value:"pane.getViewListSize() \u21d2 number",id:"panegetviewlistsize--number",level:4},{value:"pane.findInViewList(fullPath) \u21d2 number",id:"panefindinviewlistfullpath--number",level:4},{value:"pane.findInViewListAddedOrder(fullPath) \u21d2 number",id:"panefindinviewlistaddedorderfullpath--number",level:4},{value:"pane.findInViewListMRUOrder(fullPath) \u21d2 number",id:"panefindinviewlistmruorderfullpath--number",level:4},{value:"pane.reorderItem(file, [index], [force]) \u21d2 number",id:"panereorderitemfile-index-force--number",level:4},{value:"pane.addToViewList(file, [index]) \u21d2 number",id:"paneaddtoviewlistfile-index--number",level:4},{value:"pane.addListToViewList(fileList) \u21d2 Array.<File>",id:"paneaddlisttoviewlistfilelist--arrayfile",level:4},{value:"pane.makeViewMostRecent(file)",id:"panemakeviewmostrecentfile",level:4},{value:"pane.sortViewList(compareFn)",id:"panesortviewlistcomparefn",level:4},{value:"pane.swapViewListIndexes(index1, index2) \u21d2 boolean",id:"paneswapviewlistindexesindex1-index2--boolean",level:4},{value:"pane.traverseViewListByMRU(direction, [current]) \u21d2 File",id:"panetraverseviewlistbymrudirection-current--file",level:4},{value:"pane.showInterstitial(show)",id:"paneshowinterstitialshow",level:4},{value:"pane.getViewForPath(path) \u21d2 boolean",id:"panegetviewforpathpath--boolean",level:4},{value:"pane.addView(view, show)",id:"paneaddviewview-show",level:4},{value:"pane.showView(view)",id:"paneshowviewview",level:4},{value:"pane.updateLayout(forceRefresh)",id:"paneupdatelayoutforcerefresh",level:4},{value:"pane.getCurrentlyViewedFile() \u21d2 File",id:"panegetcurrentlyviewedfile--file",level:4},{value:"pane.getCurrentlyViewedEditor() \u21d2 File",id:"panegetcurrentlyviewededitor--file",level:4},{value:"pane.getCurrentlyViewedPath() \u21d2 string",id:"panegetcurrentlyviewedpath--string",level:4},{value:"pane.destroyViewIfNotNeeded(view)",id:"panedestroyviewifnotneededview",level:4},{value:"pane.removeView(file, suppressOpenNextFile, preventViewChange) \u21d2 boolean",id:"paneremoveviewfile-suppressopennextfile-preventviewchange--boolean",level:4},{value:"pane.removeViews(list) \u21d2 Array.<File>",id:"paneremoveviewslist--arrayfile",level:4},{value:"pane.focus()",id:"panefocus",level:4},{value:"pane.loadState(state) \u21d2 jQuery.Promise",id:"paneloadstatestate--jquerypromise",level:4},{value:"pane.saveState() \u21d2 Object",id:"panesavestate--object",level:4},{value:"pane.getScrollState() \u21d2 Object",id:"panegetscrollstate--object",level:4},{value:"pane.restoreAndAdjustScrollState([state], [heightDelta])",id:"panerestoreandadjustscrollstatestate-heightdelta",level:4}];function c(e){const n={a:"a",br:"br",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.h3,{id:"import-",children:"Import :"}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-js",children:'const Pane = brackets.getModule("view/Pane")\n'})}),"\n",(0,d.jsx)("a",{name:"module_view/Pane"}),"\n",(0,d.jsx)(n.h2,{id:"viewpane",children:"view/Pane"}),"\n",(0,d.jsx)(n.p,{children:"Pane objects host views of files, editors, etc... Clients cannot access\nPane objects directly. Instead the implementation is protected by the\nMainViewManager -- however View Factories are given a Pane object which\nthey can use to add views. References to Pane objects should not be kept\nas they may be destroyed and removed from the DOM."}),"\n",(0,d.jsx)(n.p,{children:"To get a custom view, there are two components:"}),"\n",(0,d.jsxs)(n.ol,{children:["\n",(0,d.jsx)(n.li,{children:"A View Factory"}),"\n",(0,d.jsx)(n.li,{children:"A View Object"}),"\n"]}),"\n",(0,d.jsx)(n.p,{children:"View objects are anonymous object that have a particular interface."}),"\n",(0,d.jsx)(n.p,{children:'Views can be added to a pane but do not have to exist in the Pane object\'s view list.\nSuch views are "temporary views". Temporary views are not serialized with the Pane state\nor reconstituted when the pane is serialized from disk. They are destroyed at the earliest\nopportunity.'}),"\n",(0,d.jsxs)(n.p,{children:["Temporary views are added by calling ",(0,d.jsx)(n.code,{children:"Pane.showView()"}),' and passing it the view object. The view\nwill be destroyed when the next view is shown, the pane is mereged with another pane or the "Close All"\ncommand is exectuted on the Pane. Temporary Editor Views do not contain any modifications and are\nadded to the workingset (and are no longer tempoary views) once the document has been modified. They\nwill remain in the working set until closed from that point on.']}),"\n",(0,d.jsx)(n.p,{children:"Views that have a longer life span are added by calling addView to associate the view with a\nfilename in the _views object. These views are not destroyed until they are removed from the pane\nby calling one of the following: removeView, removeViews, or _reset"}),"\n",(0,d.jsx)(n.p,{children:"Pane Object Events:"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:["viewListChange - Whenever there is a file change to a file in the working set. These 2 events: ",(0,d.jsx)(n.code,{children:"DocumentManager.pathRemove"}),"\nand ",(0,d.jsx)(n.code,{children:"DocumentManager.fileNameChange"})," will cause a ",(0,d.jsx)(n.code,{children:"viewListChange"})," event so the WorkingSetView can update."]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:["currentViewChange - Whenever the current view changes.\n(e, newView",":View",", oldView",":View",")"]}),"\n"]}),"\n",(0,d.jsxs)(n.li,{children:["\n",(0,d.jsxs)(n.p,{children:["viewDestroy - Whenever a view has been destroyed\n(e, view",":View",")"]}),"\n"]}),"\n"]}),"\n",(0,d.jsx)(n.p,{children:"View Interface:"}),"\n",(0,d.jsxs)(n.p,{children:["The view is an anonymous object which has the following method signatures. see ImageViewer for an example or the sample\nprovided with Brackets ",(0,d.jsx)(n.code,{children:"src/extensions/samples/BracketsConfigCentral"})]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-js",children:" {\n $el:jQuery\n getFile: function ():!File\n updateLayout: function(forceRefresh:boolean)\n destroy: function()\n getScrollPos: function():*=\n adjustScrollPos: function(state:Object=, heightDelta:number)=\n notifyContainerChange: function()=\n notifyVisibilityChange: function(boolean)=\n focus:function()=\n }\n"})}),"\n",(0,d.jsxs)(n.p,{children:["When views are created they can be added to the pane by calling ",(0,d.jsx)(n.code,{children:"pane.addView()"}),".\nViews can be created and parented by attaching directly to ",(0,d.jsx)(n.code,{children:"pane.$el"})]}),"\n",(0,d.jsx)(n.p,{children:"this._codeMirror = new CodeMirror(pane.$el, ...)"}),"\n",(0,d.jsxs)(n.p,{children:["Factories can create a view that's initially hidden by calling ",(0,d.jsx)(n.code,{children:"pane.addView(view)"})," and passing ",(0,d.jsx)(n.code,{children:"false"})," for the show parameter.\nHidden views can be later shown by calling ",(0,d.jsx)(n.code,{children:"pane.showView(view)"})]}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.code,{children:"$el:jQuery!"})}),"\n",(0,d.jsxs)(n.p,{children:["property that stores the jQuery wrapped DOM element of the view. All views must have one so pane objects can manipulate the DOM\nelement when necessary (e.g. ",(0,d.jsx)(n.code,{children:"showView"}),", ",(0,d.jsx)(n.code,{children:"_reparent"}),", etc...)"]}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.code,{children:"getFile():File!"})}),"\n",(0,d.jsx)(n.p,{children:"Called throughout the life of a View when the current file is queried by the system."}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.code,{children:"updateLayout(forceRefresh:boolean)"})}),"\n",(0,d.jsxs)(n.p,{children:["Called to notify the view that it should be resized to fit its parent container. This may be called several times\nor only once. Views can ignore the ",(0,d.jsx)(n.code,{children:"forceRefresh"})," flag. It is used for editor views to force a relayout of the editor\nwhich probably isn't necessary for most views. Views should implement their html to be dynamic and not rely on this\nfunction to be called whenever possible."]}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.code,{children:"destroy()"})}),"\n",(0,d.jsx)(n.p,{children:"Views must implement a destroy method to remove their DOM element at the very least. There is no default\nimplementation and views are hidden before this method is called. The Pane object doesn't make assumptions\nabout when it is safe to remove a node. In some instances other cleanup must take place before a the DOM\nnode is destroyed so the implementation details are left to the view."}),"\n",(0,d.jsx)(n.p,{children:"Views can implement a simple destroy by calling"}),"\n",(0,d.jsx)(n.p,{children:"this.$el.remove()"}),"\n",(0,d.jsx)(n.p,{children:"These members are optional and need not be implemented by Views"}),"\n",(0,d.jsx)(n.p,{children:"getScrollPos()\nadjustScrollPos()"}),"\n",(0,d.jsxs)(n.p,{children:["The system at various times will want to save and restore a view's scroll position. The data returned by ",(0,d.jsx)(n.code,{children:"getScrollPos()"}),"\nis specific to the view and will be passed back to ",(0,d.jsx)(n.code,{children:"adjustScrollPos()"})," when the scroll position needs to be restored."]}),"\n",(0,d.jsxs)(n.p,{children:["When Modal Bars are invoked, the system calls ",(0,d.jsx)(n.code,{children:"getScrollPos()"})," so that the current scroll psotion of all visible Views can be cached.\nThat cached scroll position is later passed to ",(0,d.jsx)(n.code,{children:"adjustScrollPos()"}),' along with a height delta. The height delta is used to\nscroll the view so that it doesn\'t appear to have "jumped" when invoking the Modal Bar.']}),"\n",(0,d.jsx)(n.p,{children:"Height delta will be a positive when the Modal Bar is being shown and negative number when the Modal Bar is being hidden."}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.code,{children:"getViewState()"})," is another optional member that is used to cache a view's state when hiding or destroying a view or closing the project.\nThe data returned by this member is stored in ",(0,d.jsx)(n.code,{children:"ViewStateManager"})," and is saved with the project."]}),"\n",(0,d.jsx)(n.p,{children:"Views or View Factories are responsible for restoring the view state when the view of that file is created by recalling the cached state"}),"\n",(0,d.jsx)(n.p,{children:"var view = createIconView(file, pane);\nview.restoreViewState(ViewStateManager.getViewState(file.fullPath));"}),"\n",(0,d.jsx)(n.p,{children:"Notifications\nThe following optional methods receive notifications from the Pane object when certain events take place which affect the view:"}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.code,{children:"notifyContainerChange()"})}),"\n",(0,d.jsx)(n.p,{children:"Optional Notification callback called when the container changes. The view can perform any synchronization or state update\nit needs to do when its parent container changes."}),"\n",(0,d.jsx)(n.p,{children:(0,d.jsx)(n.code,{children:"notifyVisiblityChange()"})}),"\n",(0,d.jsx)(n.p,{children:"Optional Notification callback called when the view's vsibility changes. The view can perform any synchronization or\nstate update it needs to do when its visiblity state changes."}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane",children:"view/Pane"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:".Pane"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#new_module_view/Pane..Pane_new",children:"new Pane(id, $container)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+id",children:".id"})," : ",(0,d.jsx)("code",{children:"string"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$container",children:".$container"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$el",children:".$el"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$header",children:".$header"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$headerText",children:".$headerText"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$headerFlipViewBtn",children:".$headerFlipViewBtn"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$headerCloseBtn",children:".$headerCloseBtn"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$content",children:".$content"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+ITEM_NOT_FOUND",children:".ITEM_NOT_FOUND"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+ITEM_FOUND_NO_SORT",children:".ITEM_FOUND_NO_SORT"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+ITEM_FOUND_NEEDS_SORT",children:".ITEM_FOUND_NEEDS_SORT"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+mergeFrom",children:".mergeFrom(other)"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+destroy",children:".destroy()"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getViewList",children:".getViewList()"})," \u21d2 ",(0,d.jsx)("code",{children:"Array."})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getViewListSize",children:".getViewListSize()"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+findInViewList",children:".findInViewList(fullPath)"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+findInViewListAddedOrder",children:".findInViewListAddedOrder(fullPath)"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+findInViewListMRUOrder",children:".findInViewListMRUOrder(fullPath)"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+reorderItem",children:".reorderItem(file, [index], [force])"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+addToViewList",children:".addToViewList(file, [index])"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+addListToViewList",children:".addListToViewList(fileList)"})," \u21d2 ",(0,d.jsx)("code",{children:"Array."})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+makeViewMostRecent",children:".makeViewMostRecent(file)"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+sortViewList",children:".sortViewList(compareFn)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+swapViewListIndexes",children:".swapViewListIndexes(index1, index2)"})," \u21d2 ",(0,d.jsx)("code",{children:"boolean"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+traverseViewListByMRU",children:".traverseViewListByMRU(direction, [current])"})," \u21d2 ",(0,d.jsx)("code",{children:"File"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+showInterstitial",children:".showInterstitial(show)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getViewForPath",children:".getViewForPath(path)"})," \u21d2 ",(0,d.jsx)("code",{children:"boolean"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+addView",children:".addView(view, show)"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+showView",children:".showView(view)"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+updateLayout",children:".updateLayout(forceRefresh)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getCurrentlyViewedFile",children:".getCurrentlyViewedFile()"})," \u21d2 ",(0,d.jsx)("code",{children:"File"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getCurrentlyViewedEditor",children:".getCurrentlyViewedEditor()"})," \u21d2 ",(0,d.jsx)("code",{children:"File"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getCurrentlyViewedPath",children:".getCurrentlyViewedPath()"})," \u21d2 ",(0,d.jsx)("code",{children:"string"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+destroyViewIfNotNeeded",children:".destroyViewIfNotNeeded(view)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+removeView",children:".removeView(file, suppressOpenNextFile, preventViewChange)"})," \u21d2 ",(0,d.jsx)("code",{children:"boolean"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+removeViews",children:".removeViews(list)"})," \u21d2 ",(0,d.jsx)("code",{children:"Array."})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+focus",children:".focus()"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+loadState",children:".loadState(state)"})," \u21d2 ",(0,d.jsx)("code",{children:"jQuery.Promise"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+saveState",children:".saveState()"})," \u21d2 ",(0,d.jsx)("code",{children:"Object"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getScrollState",children:".getScrollState()"})," \u21d2 ",(0,d.jsx)("code",{children:"Object"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+restoreAndAdjustScrollState",children:".restoreAndAdjustScrollState([state], [heightDelta])"})}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane"}),"\n",(0,d.jsx)(n.h3,{id:"viewpanepane",children:"view/Pane.Pane"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": inner class of ",(0,d.jsx)(n.a,{href:"#module_view/Pane",children:(0,d.jsx)("code",{children:"view/Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"See"}),": ",(0,d.jsx)(n.a,{href:"MainViewManager",children:"MainViewManager"})," for more information"]}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:".Pane"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#new_module_view/Pane..Pane_new",children:"new Pane(id, $container)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+id",children:".id"})," : ",(0,d.jsx)("code",{children:"string"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$container",children:".$container"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$el",children:".$el"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$header",children:".$header"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$headerText",children:".$headerText"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$headerFlipViewBtn",children:".$headerFlipViewBtn"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$headerCloseBtn",children:".$headerCloseBtn"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+$content",children:".$content"})," : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+ITEM_NOT_FOUND",children:".ITEM_NOT_FOUND"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+ITEM_FOUND_NO_SORT",children:".ITEM_FOUND_NO_SORT"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+ITEM_FOUND_NEEDS_SORT",children:".ITEM_FOUND_NEEDS_SORT"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+mergeFrom",children:".mergeFrom(other)"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+destroy",children:".destroy()"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getViewList",children:".getViewList()"})," \u21d2 ",(0,d.jsx)("code",{children:"Array."})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getViewListSize",children:".getViewListSize()"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+findInViewList",children:".findInViewList(fullPath)"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+findInViewListAddedOrder",children:".findInViewListAddedOrder(fullPath)"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+findInViewListMRUOrder",children:".findInViewListMRUOrder(fullPath)"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+reorderItem",children:".reorderItem(file, [index], [force])"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+addToViewList",children:".addToViewList(file, [index])"})," \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+addListToViewList",children:".addListToViewList(fileList)"})," \u21d2 ",(0,d.jsx)("code",{children:"Array."})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+makeViewMostRecent",children:".makeViewMostRecent(file)"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+sortViewList",children:".sortViewList(compareFn)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+swapViewListIndexes",children:".swapViewListIndexes(index1, index2)"})," \u21d2 ",(0,d.jsx)("code",{children:"boolean"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+traverseViewListByMRU",children:".traverseViewListByMRU(direction, [current])"})," \u21d2 ",(0,d.jsx)("code",{children:"File"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+showInterstitial",children:".showInterstitial(show)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getViewForPath",children:".getViewForPath(path)"})," \u21d2 ",(0,d.jsx)("code",{children:"boolean"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+addView",children:".addView(view, show)"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+showView",children:".showView(view)"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+updateLayout",children:".updateLayout(forceRefresh)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getCurrentlyViewedFile",children:".getCurrentlyViewedFile()"})," \u21d2 ",(0,d.jsx)("code",{children:"File"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getCurrentlyViewedEditor",children:".getCurrentlyViewedEditor()"})," \u21d2 ",(0,d.jsx)("code",{children:"File"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getCurrentlyViewedPath",children:".getCurrentlyViewedPath()"})," \u21d2 ",(0,d.jsx)("code",{children:"string"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+destroyViewIfNotNeeded",children:".destroyViewIfNotNeeded(view)"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+removeView",children:".removeView(file, suppressOpenNextFile, preventViewChange)"})," \u21d2 ",(0,d.jsx)("code",{children:"boolean"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+removeViews",children:".removeViews(list)"})," \u21d2 ",(0,d.jsx)("code",{children:"Array."})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+focus",children:".focus()"})}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+loadState",children:".loadState(state)"})," \u21d2 ",(0,d.jsx)("code",{children:"jQuery.Promise"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+saveState",children:".saveState()"})," \u21d2 ",(0,d.jsx)("code",{children:"Object"})]}),"\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+getScrollState",children:".getScrollState()"})," \u21d2 ",(0,d.jsx)("code",{children:"Object"})]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane+restoreAndAdjustScrollState",children:".restoreAndAdjustScrollState([state], [heightDelta])"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,d.jsx)("a",{name:"new_module_view/Pane..Pane_new"}),"\n",(0,d.jsx)(n.h4,{id:"new-paneid-container",children:"new Pane(id, $container)"}),"\n",(0,d.jsx)(n.p,{children:"Pane Objects are constructed by the MainViewManager object when a Pane view is needed."}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"id"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"string"})}),(0,d.jsx)(n.td,{children:"The id to use to identify this pane."})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"$container"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"jQuery"})}),(0,d.jsx)(n.td,{children:"The parent jQuery container to place the pane view."})]})]})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+id"}),"\n",(0,d.jsxs)(n.h4,{id:"paneid--string",children:["pane.id : ",(0,d.jsx)("code",{children:"string"})]}),"\n",(0,d.jsx)(n.p,{children:"id of the pane"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance property of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Read only"}),": true"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+$container"}),"\n",(0,d.jsxs)(n.h4,{id:"panecontainer--jquery",children:["pane.$container : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsx)(n.p,{children:"container where the pane lives"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance property of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Read only"}),": true"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+$el"}),"\n",(0,d.jsxs)(n.h4,{id:"paneel--jquery",children:["pane.$el : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsx)(n.p,{children:"the wrapped DOM node of this pane"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance property of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Read only"}),": true"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+$header"}),"\n",(0,d.jsxs)(n.h4,{id:"paneheader--jquery",children:["pane.$header : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsx)(n.p,{children:"the wrapped DOM node container that contains name of current view and the switch view button, or informational string if there is no view"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance property of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Read only"}),": true"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+$headerText"}),"\n",(0,d.jsxs)(n.h4,{id:"paneheadertext--jquery",children:["pane.$headerText : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsx)(n.p,{children:"the wrapped DOM node that contains name of current view, or informational string if there is no view"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance property of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Read only"}),": true"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+$headerFlipViewBtn"}),"\n",(0,d.jsxs)(n.h4,{id:"paneheaderflipviewbtn--jquery",children:["pane.$headerFlipViewBtn : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsx)(n.p,{children:"the wrapped DOM node that is used to flip the view to another pane"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance property of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Read only"}),": true"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+$headerCloseBtn"}),"\n",(0,d.jsxs)(n.h4,{id:"paneheaderclosebtn--jquery",children:["pane.$headerCloseBtn : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsx)(n.p,{children:"close button of the pane"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance property of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Read only"}),": true"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+$content"}),"\n",(0,d.jsxs)(n.h4,{id:"panecontent--jquery",children:["pane.$content : ",(0,d.jsx)("code",{children:"JQuery"})]}),"\n",(0,d.jsx)(n.p,{children:"the wrapped DOM node that contains views"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance property of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Read only"}),": true"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+ITEM_NOT_FOUND"}),"\n",(0,d.jsx)(n.h4,{id:"paneitem_not_found",children:"pane.ITEM_NOT_FOUND"}),"\n",(0,d.jsx)(n.p,{children:"Return value from reorderItem when the Item was not found"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance constant of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"See"}),": ",(0,d.jsx)(n.a,{href:"Pane#reorderItem",children:"Pane#reorderItem"})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+ITEM_FOUND_NO_SORT"}),"\n",(0,d.jsx)(n.h4,{id:"paneitem_found_no_sort",children:"pane.ITEM_FOUND_NO_SORT"}),"\n",(0,d.jsx)(n.p,{children:"Return value from reorderItem when the Item was found at its natural index\nand the workingset does not need to be resorted"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance constant of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"See"}),": ",(0,d.jsx)(n.a,{href:"Pane#reorderItem",children:"Pane#reorderItem"})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+ITEM_FOUND_NEEDS_SORT"}),"\n",(0,d.jsx)(n.h4,{id:"paneitem_found_needs_sort",children:"pane.ITEM_FOUND_NEEDS_SORT"}),"\n",(0,d.jsx)(n.p,{children:"Return value from reorderItem when the Item was found and reindexed\nand the workingset needs to be resorted"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance constant of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"See"}),": ",(0,d.jsx)(n.a,{href:"Pane#reorderItem",children:"Pane#reorderItem"})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+mergeFrom"}),"\n",(0,d.jsx)(n.h4,{id:"panemergefromother",children:"pane.mergeFrom(other)"}),"\n",(0,d.jsx)(n.p,{children:"Merges the another Pane object's contents into this Pane"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"other"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.td,{children:"Pane from which to copy"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+destroy"}),"\n",(0,d.jsx)(n.h4,{id:"panedestroy",children:"pane.destroy()"}),"\n",(0,d.jsx)(n.p,{children:"Removes the DOM node for the Pane, removes all\nevent handlers and _resets all internal data structures"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+getViewList"}),"\n",(0,d.jsxs)(n.h4,{id:"panegetviewlist--arrayfile",children:["pane.getViewList() \u21d2 ",(0,d.jsx)("code",{children:"Array."})]}),"\n",(0,d.jsx)(n.p,{children:"Returns a copy of the view file list"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+getViewListSize"}),"\n",(0,d.jsxs)(n.h4,{id:"panegetviewlistsize--number",children:["pane.getViewListSize() \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsx)(n.p,{children:"Returns the number of entries in the view file list"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+findInViewList"}),"\n",(0,d.jsxs)(n.h4,{id:"panefindinviewlistfullpath--number",children:["pane.findInViewList(fullPath) \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsx)(n.p,{children:"Returns the index of the item in the view file list"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"number"})," - index of the item or -1 if not found"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"fullPath"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"string"})}),(0,d.jsx)(n.td,{children:"the full path of the item to look for"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+findInViewListAddedOrder"}),"\n",(0,d.jsxs)(n.h4,{id:"panefindinviewlistaddedorderfullpath--number",children:["pane.findInViewListAddedOrder(fullPath) \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsx)(n.p,{children:"Returns the order in which the item was added"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"number"})," - order of the item or -1 if not found"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"fullPath"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"string"})}),(0,d.jsx)(n.td,{children:"the full path of the item to look for"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+findInViewListMRUOrder"}),"\n",(0,d.jsxs)(n.h4,{id:"panefindinviewlistmruorderfullpath--number",children:["pane.findInViewListMRUOrder(fullPath) \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsx)(n.p,{children:"Returns the order in which the item was last used"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"number"})," - order of the item or -1 if not found.\n0 indicates most recently used, followed by 1 and so on..."]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"fullPath"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"string"})}),(0,d.jsx)(n.td,{children:"the full path of the item to look for"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+reorderItem"}),"\n",(0,d.jsxs)(n.h4,{id:"panereorderitemfile-index-force--number",children:["pane.reorderItem(file, [index], [force]) \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsx)(n.p,{children:"reorders the specified file in the view list to the desired position"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"number"})," - this function returns one of the following manifest constants:\nITEM_NOT_FOUND : The request file object was not found\nITEM_FOUND_NO_SORT : The request file object was found but it was already at the requested index\nITEM_FOUND_NEEDS_SORT : The request file object was found and moved to a new index and the list should be resorted"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"file"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"File"})}),(0,d.jsx)(n.td,{children:"the file object of the item to reorder"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"[index]"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"number"})}),(0,d.jsx)(n.td,{children:"the new position of the item"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"[force]"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"boolean"})}),(0,d.jsx)(n.td,{children:"true to force the item into that position, false otherwise. (Requires an index be requested)"})]})]})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+addToViewList"}),"\n",(0,d.jsxs)(n.h4,{id:"paneaddtoviewlistfile-index--number",children:["pane.addToViewList(file, [index]) \u21d2 ",(0,d.jsx)("code",{children:"number"})]}),"\n",(0,d.jsx)(n.p,{children:"Adds the given file to the end of the workingset, if it is not already in the list\nDoes not change which document is currently open in the editor. Completes synchronously."}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"number"})," - index of where the item was added"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"file"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"File"})}),(0,d.jsx)(n.td,{children:"file to add"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"[index]"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"number"})}),(0,d.jsx)(n.td,{children:"position where to add the item"})]})]})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+addListToViewList"}),"\n",(0,d.jsxs)(n.h4,{id:"paneaddlisttoviewlistfilelist--arrayfile",children:["pane.addListToViewList(fileList) \u21d2 ",(0,d.jsx)("code",{children:"Array."})]}),"\n",(0,d.jsx)(n.p,{children:"Adds the given file list to the end of the workingset."}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"Array."})," - list of files added to the list"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"fileList"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"Array."})})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+makeViewMostRecent"}),"\n",(0,d.jsx)(n.h4,{id:"panemakeviewmostrecentfile",children:"pane.makeViewMostRecent(file)"}),"\n",(0,d.jsx)(n.p,{children:"Moves the specified file to the front of the MRU (Most Recently Used) list."}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"file"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"File"})}),(0,d.jsx)(n.td,{children:"The file to move to the front of the MRU list."})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+sortViewList"}),"\n",(0,d.jsx)(n.h4,{id:"panesortviewlistcomparefn",children:"pane.sortViewList(compareFn)"}),"\n",(0,d.jsx)(n.p,{children:"Sorts items in the pane's view list."}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"compareFn"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"function"})}),(0,d.jsx)(n.td,{children:"The function used to compare items in the view list."})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+swapViewListIndexes"}),"\n",(0,d.jsxs)(n.h4,{id:"paneswapviewlistindexesindex1-index2--boolean",children:["pane.swapViewListIndexes(index1, index2) \u21d2 ",(0,d.jsx)("code",{children:"boolean"})]}),"\n",(0,d.jsx)(n.p,{children:"Swaps two items in the file view list (used while dragging items in the working set view)"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"boolean"})," - } true"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"index1"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"number"})}),(0,d.jsx)(n.td,{children:"the index of the first item to swap"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"index2"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"number"})}),(0,d.jsx)(n.td,{children:"the index of the second item to swap"})]})]})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+traverseViewListByMRU"}),"\n",(0,d.jsxs)(n.h4,{id:"panetraverseviewlistbymrudirection-current--file",children:["pane.traverseViewListByMRU(direction, [current]) \u21d2 ",(0,d.jsx)("code",{children:"File"})]}),"\n",(0,d.jsx)(n.p,{children:"Traverses the list and returns the File object of the next item in the MRU order"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"File"})," - The File object of the next item in the travesal order or null if there isn't one."]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"direction"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"number"})}),(0,d.jsx)(n.td,{children:"Must be 1 or -1 to traverse forward or backward"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"[current]"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"string"})}),(0,d.jsx)(n.td,{children:"the fullPath of the item where traversal is to start. If this parameter is omitted then the path of the current view is used. If the current view is a temporary view then the first item in the MRU list is returned"})]})]})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+showInterstitial"}),"\n",(0,d.jsx)(n.h4,{id:"paneshowinterstitialshow",children:"pane.showInterstitial(show)"}),"\n",(0,d.jsx)(n.p,{children:"Shows the pane's interstitial page"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"show"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"boolean"})}),(0,d.jsx)(n.td,{children:"show or hide the interstitial page"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+getViewForPath"}),"\n",(0,d.jsxs)(n.h4,{id:"panegetviewforpathpath--boolean",children:["pane.getViewForPath(path) \u21d2 ",(0,d.jsx)("code",{children:"boolean"})]}),"\n",(0,d.jsx)(n.p,{children:"retrieves the view object for the given path"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"boolean"})," - show - show or hide the interstitial page"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"path"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"string"})}),(0,d.jsx)(n.td,{children:"the fullPath of the view to retrieve"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+addView"}),"\n",(0,d.jsx)(n.h4,{id:"paneaddviewview-show",children:"pane.addView(view, show)"}),"\n",(0,d.jsx)(n.p,{children:"Adds a view to the pane"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"view"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"View"})}),(0,d.jsx)(n.td,{children:"the View object to add"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"show"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"boolean"})}),(0,d.jsx)(n.td,{children:"true to show the view right away, false otherwise"})]})]})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+showView"}),"\n",(0,d.jsx)(n.h4,{id:"paneshowviewview",children:"pane.showView(view)"}),"\n",(0,d.jsx)(n.p,{children:"Swaps the current view with the requested view.\nIf the interstitial page is shown, it is hidden.\nIf the currentView is a temporary view, it is destroyed."}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"view"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"View"})}),(0,d.jsx)(n.td,{children:"the to show"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+updateLayout"}),"\n",(0,d.jsx)(n.h4,{id:"paneupdatelayoutforcerefresh",children:"pane.updateLayout(forceRefresh)"}),"\n",(0,d.jsx)(n.p,{children:"Sets pane content height. Updates the layout causing the current view to redraw itself"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"forceRefresh"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"boolean"})}),(0,d.jsx)(n.td,{children:"true to force a resize and refresh of the current view, false if just to resize forceRefresh is only used by Editor views to force a relayout of all editor DOM elements. Custom View implementations should just ignore this flag."})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+getCurrentlyViewedFile"}),"\n",(0,d.jsxs)(n.h4,{id:"panegetcurrentlyviewedfile--file",children:["pane.getCurrentlyViewedFile() \u21d2 ",(0,d.jsx)("code",{children:"File"})]}),"\n",(0,d.jsx)(n.p,{children:"Retrieves the File object of the current view"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"File"})," - the File object of the current view or null if there isn't one"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+getCurrentlyViewedEditor"}),"\n",(0,d.jsxs)(n.h4,{id:"panegetcurrentlyviewededitor--file",children:["pane.getCurrentlyViewedEditor() \u21d2 ",(0,d.jsx)("code",{children:"File"})]}),"\n",(0,d.jsx)(n.p,{children:"Retrieves the File object of the current view"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"File"})," - the File object of the current view or null if there isn't one"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+getCurrentlyViewedPath"}),"\n",(0,d.jsxs)(n.h4,{id:"panegetcurrentlyviewedpath--string",children:["pane.getCurrentlyViewedPath() \u21d2 ",(0,d.jsx)("code",{children:"string"})]}),"\n",(0,d.jsx)(n.p,{children:"Retrieves the path of the current view"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"string"})," - the path of the current view or null if there isn't one"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+destroyViewIfNotNeeded"}),"\n",(0,d.jsx)(n.h4,{id:"panedestroyviewifnotneededview",children:"pane.destroyViewIfNotNeeded(view)"}),"\n",(0,d.jsx)(n.p,{children:"destroys the view if it isn't needed"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"view"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"View"})}),(0,d.jsx)(n.td,{children:"the view to destroy"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+removeView"}),"\n",(0,d.jsxs)(n.h4,{id:"paneremoveviewfile-suppressopennextfile-preventviewchange--boolean",children:["pane.removeView(file, suppressOpenNextFile, preventViewChange) \u21d2 ",(0,d.jsx)("code",{children:"boolean"})]}),"\n",(0,d.jsx)(n.p,{children:"Removes the view and opens the next view"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"boolean"})," - true if the file was removed from the working set\nThis function will remove a temporary view of a file but will return false in that case"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"file"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"File"})}),(0,d.jsx)(n.td,{children:"the file to close"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"suppressOpenNextFile"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"boolean"})}),(0,d.jsx)(n.td,{children:"suppresses opening the next file in MRU order"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"preventViewChange"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"boolean"})}),(0,d.jsx)(n.td,{children:"if suppressOpenNextFile is truthy, this flag can be used to prevent the current view from being destroyed. Ignored if suppressOpenNextFile is falsy"})]})]})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+removeViews"}),"\n",(0,d.jsxs)(n.h4,{id:"paneremoveviewslist--arrayfile",children:["pane.removeViews(list) \u21d2 ",(0,d.jsx)("code",{children:"Array."})]}),"\n",(0,d.jsx)(n.p,{children:"Removes the specifed file from all internal lists, destroys the view of the file (if there is one)\nand shows the interstitial page if the current view is destroyed."}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"Array."})," - Array of File objects removed from the working set.\nThis function will remove temporary views but the file objects for those views will not be found\nin the result set. Only the file objects removed from the working set are returned."]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"list"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"Array."})}),(0,d.jsx)(n.td,{children:"Array of files to remove"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+focus"}),"\n",(0,d.jsx)(n.h4,{id:"panefocus",children:"pane.focus()"}),"\n",(0,d.jsx)(n.p,{children:"Gives focus to the last thing that had focus, the current view or the pane in that order"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+loadState"}),"\n",(0,d.jsxs)(n.h4,{id:"paneloadstatestate--jquerypromise",children:["pane.loadState(state) \u21d2 ",(0,d.jsx)("code",{children:"jQuery.Promise"})]}),"\n",(0,d.jsx)(n.p,{children:"serializes the pane state from JSON"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"jQuery.Promise"})," - A promise which resolves to {fullPath",":string",", paneId",":string","} which can be passed as command data to FILE_OPEN"]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsx)(n.tbody,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"state"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"Object"})}),(0,d.jsx)(n.td,{children:"the state to load"})]})})]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+saveState"}),"\n",(0,d.jsxs)(n.h4,{id:"panesavestate--object",children:["pane.saveState() \u21d2 ",(0,d.jsx)("code",{children:"Object"})]}),"\n",(0,d.jsx)(n.p,{children:"Returns the JSON-ified state of the object so it can be serialize"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"Object"})," - state - the state to save"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+getScrollState"}),"\n",(0,d.jsxs)(n.h4,{id:"panegetscrollstate--object",children:["pane.getScrollState() \u21d2 ",(0,d.jsx)("code",{children:"Object"})]}),"\n",(0,d.jsx)(n.p,{children:"gets the current view's scroll state data"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})}),(0,d.jsx)(n.br,{}),"\n",(0,d.jsx)(n.strong,{children:"Returns"}),": ",(0,d.jsx)("code",{children:"Object"})," - scroll state - the current scroll state"]}),"\n",(0,d.jsx)("a",{name:"module_view/Pane..Pane+restoreAndAdjustScrollState"}),"\n",(0,d.jsx)(n.h4,{id:"panerestoreandadjustscrollstatestate-heightdelta",children:"pane.restoreAndAdjustScrollState([state], [heightDelta])"}),"\n",(0,d.jsx)(n.p,{children:"tells the current view to restore its scroll state from cached data and apply a height delta"}),"\n",(0,d.jsxs)(n.p,{children:[(0,d.jsx)(n.strong,{children:"Kind"}),": instance method of ",(0,d.jsx)(n.a,{href:"#module_view/Pane..Pane",children:(0,d.jsx)("code",{children:"Pane"})})]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{children:"Param"}),(0,d.jsx)(n.th,{children:"Type"}),(0,d.jsx)(n.th,{children:"Description"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"[state]"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"Object"})}),(0,d.jsx)(n.td,{children:"the current scroll state"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{children:"[heightDelta]"}),(0,d.jsx)(n.td,{children:(0,d.jsx)("code",{children:"number"})}),(0,d.jsx)(n.td,{children:"the amount to add or subtract from the state"})]})]})]})]})}function o(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(c,{...e})}):c(e)}},28453:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>l});var r=i(96540);const d={},s=r.createContext(d);function t(e){const n=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:t(e.components),r.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0ec2da41.5cf6ffc2.js b/assets/js/0ec2da41.5cf6ffc2.js
new file mode 100644
index 00000000..42f599bb
--- /dev/null
+++ b/assets/js/0ec2da41.5cf6ffc2.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[661],{94125:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"API-Reference/utils/EventManager","title":"EventManager","description":"Import :","source":"@site/api/API-Reference/utils/EventManager.md","sourceDirName":"API-Reference/utils","slug":"/API-Reference/utils/EventManager","permalink":"/api/API-Reference/utils/EventManager","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"EventDispatcher","permalink":"/api/API-Reference/utils/EventDispatcher"},"next":{"title":"ExtensionInterface","permalink":"/api/API-Reference/utils/ExtensionInterface"}}');var s=t(74848),a=t(28453);const i={},l=void 0,d={},o=[{value:"Import :",id:"import-",level:3},{value:"utils/EventManager",id:"utilseventmanager",level:2},{value:"Usage",id:"usage",level:2},{value:"utils/EventManager.registerEventHandler(handlerName, eventDispatcher) \u21d2 boolean",id:"utilseventmanagerregistereventhandlerhandlername-eventdispatcher--boolean",level:3},{value:"utils/EventManager.isExistsEventHandler(handlerName) \u21d2 boolean",id:"utilseventmanagerisexistseventhandlerhandlername--boolean",level:3},{value:"utils/EventManager.triggerEvent(handlerName, eventName, ...eventParams) : function",id:"utilseventmanagertriggereventhandlername-eventname-eventparams--function",level:3},{value:"utils/EventManager.setTrustedOrigin(origin, isTrusted)",id:"utilseventmanagersettrustedoriginorigin-istrusted",level:3}];function h(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h3,{id:"import-",children:"Import :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:'const EventManager = brackets.getModule("utils/EventManager")\n'})}),"\n",(0,s.jsx)("a",{name:"module_utils/EventManager"}),"\n",(0,s.jsx)(n.h2,{id:"utilseventmanager",children:"utils/EventManager"}),"\n",(0,s.jsxs)(n.p,{children:["The global EventManager can be used to register named EventDispatchers so that events\ncan be triggered from anywhere without using require context. This should also be used to handle custom\n",(0,s.jsx)(n.code,{children:"window.onmessage"})," handlers."]}),"\n",(0,s.jsxs)(n.p,{children:["A global ",(0,s.jsx)(n.code,{children:"window.EventManager"})," object is made available in phoenix that can be called anytime after AppStart."]}),"\n",(0,s.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,s.jsxs)(n.p,{children:["For Eg. Let's say we have an extension ",(0,s.jsx)(n.code,{children:"drawImage"})," installed that wants to expose custom functionality to phoenix.\nThe Extension will first register named EventHandler like this:"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:'// in drawImage/someExtensionModule.js module within the extension, do the following:\nconst EventDispatcher = brackets.getModule("utils/EventDispatcher"),\nEventManager = brackets.getModule("utils/EventManager");\nEventDispatcher.makeEventDispatcher(exports);\n\nEventManager.registerEventHandler("drawImage-Handler", exports);\n'})}),"\n",(0,s.jsxs)(n.p,{children:["Once the event handler is registered, we can trigger events on the named handler anywhere in phoenix\n(inside or outside the extension) by using:\n",(0,s.jsx)(n.strong,{children:"Example"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:'EventManager.triggerEvent("drawImage-Handler", "someEventName", "param1", "param2", ...);\n'})}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#module_utils/EventManager",children:"utils/EventManager"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#module_utils/EventManager..registerEventHandler",children:".registerEventHandler(handlerName, eventDispatcher)"})," \u21d2 ",(0,s.jsx)("code",{children:"boolean"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#module_utils/EventManager..isExistsEventHandler",children:".isExistsEventHandler(handlerName)"})," \u21d2 ",(0,s.jsx)("code",{children:"boolean"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#module_utils/EventManager..triggerEvent",children:".triggerEvent(handlerName, eventName, ...eventParams)"})," : ",(0,s.jsx)("code",{children:"function"})]}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"#module_utils/EventManager..setTrustedOrigin",children:".setTrustedOrigin(origin, isTrusted)"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)("a",{name:"module_utils/EventManager..registerEventHandler"}),"\n",(0,s.jsxs)(n.h3,{id:"utilseventmanagerregistereventhandlerhandlername-eventdispatcher--boolean",children:["utils/EventManager.registerEventHandler(handlerName, eventDispatcher) \u21d2 ",(0,s.jsx)("code",{children:"boolean"})]}),"\n",(0,s.jsxs)(n.p,{children:["Registers a named EventHandler. Event handlers are created using the call:\n",(0,s.jsx)(n.code,{children:"EventDispatcher.makeEventDispatcher(Command.prototype);"})]}),"\n",(0,s.jsx)(n.p,{children:'To register a close dialogue event handler in an extension:\n// in close-dialogue.js module winthin the extension, do the following:\nconst EventDispatcher = brackets.getModule("utils/EventDispatcher"),\nEventDispatcher.makeEventDispatcher(exports);\nconst EventManager = brackets.getModule("utils/EventManager");'}),"\n",(0,s.jsxs)(n.p,{children:["// Note: for event handler names, please change the ",(0,s.jsx)(n.code,{children:"extensionName"})," to your extension name\n// to prevent collisions. EventHandlers starting with ",(0,s.jsx)(n.code,{children:"ph-"})," and ",(0,s.jsx)(n.code,{children:"br-"}),' are reserved as system handlers\n// and not available for use in extensions.\nEventManager.registerEventHandler("',(0,s.jsx)(n.code,{children:"extensionName"}),'-closeDialogueHandler", exports);\n// Once the event handler is registered, see triggerEvent API on how to raise events']}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,s.jsx)(n.a,{href:"#module_utils/EventManager",children:(0,s.jsx)("code",{children:"utils/EventManager"})})]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"handlerName"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"string"})}),(0,s.jsx)(n.td,{children:"a unique name of the handler."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"eventDispatcher"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"object"})}),(0,s.jsx)(n.td,{children:"An EventDispatcher that will be used to trigger events."})]})]})]}),"\n",(0,s.jsx)("a",{name:"module_utils/EventManager..isExistsEventHandler"}),"\n",(0,s.jsxs)(n.h3,{id:"utilseventmanagerisexistseventhandlerhandlername--boolean",children:["utils/EventManager.isExistsEventHandler(handlerName) \u21d2 ",(0,s.jsx)("code",{children:"boolean"})]}),"\n",(0,s.jsx)(n.p,{children:"Returns true is an EventHandler of the given name exists."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,s.jsx)(n.a,{href:"#module_utils/EventManager",children:(0,s.jsx)("code",{children:"utils/EventManager"})})]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Type"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"handlerName"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"string"})})]})})]}),"\n",(0,s.jsx)("a",{name:"module_utils/EventManager..triggerEvent"}),"\n",(0,s.jsxs)(n.h3,{id:"utilseventmanagertriggereventhandlername-eventname-eventparams--function",children:["utils/EventManager.triggerEvent(handlerName, eventName, ...eventParams) : ",(0,s.jsx)("code",{children:"function"})]}),"\n",(0,s.jsx)(n.p,{children:"Triggers an event on the named event handler."}),"\n",(0,s.jsxs)(n.p,{children:["To trigger an event to the ",(0,s.jsx)(n.code,{children:"closeDialogue"}),' event handler registered above\n// anywhere in code, do the following:\nconst EventManager = brackets.getModule("utils/EventManager");\nEventManager.triggerEvent("closeDialogueHandler", "someEvent", "param1", "param2", ...);']}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,s.jsx)(n.a,{href:"#module_utils/EventManager",children:(0,s.jsx)("code",{children:"utils/EventManager"})})]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"handlerName"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"string"})}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"eventName"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"the event name as recognised by the handler. this is usually a string."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"...eventParams"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{children:"Can be a comma seperated list of args or a single argument."})]})]})]}),"\n",(0,s.jsx)("a",{name:"module_utils/EventManager..setTrustedOrigin"}),"\n",(0,s.jsx)(n.h3,{id:"utilseventmanagersettrustedoriginorigin-istrusted",children:"utils/EventManager.setTrustedOrigin(origin, isTrusted)"}),"\n",(0,s.jsx)(n.p,{children:"add or remove a domain, in the list of trusted origin"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,s.jsx)(n.a,{href:"#module_utils/EventManager",children:(0,s.jsx)("code",{children:"utils/EventManager"})})]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"origin"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"string"})}),(0,s.jsx)(n.td,{children:"the origin to be added or removed"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"isTrusted"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"boolean"})}),(0,s.jsxs)(n.td,{children:["if ",(0,s.jsx)(n.code,{children:"true"})," adds the origin to the list, else removes it."]})]})]})]})]})}function c(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var r=t(96540);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/0fffd3f5.55e3f1f3.js b/assets/js/0fffd3f5.55e3f1f3.js
new file mode 100644
index 00000000..ce3d3395
--- /dev/null
+++ b/assets/js/0fffd3f5.55e3f1f3.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8705],{80389:e=>{e.exports=JSON.parse('{"tag":{"label":"Emmet","permalink":"/blog/tags/emmet","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/emmet","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/1000.88313b7b.js b/assets/js/1000.88313b7b.js
new file mode 100644
index 00000000..3137c2e9
--- /dev/null
+++ b/assets/js/1000.88313b7b.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1e3],{91e3:(e,s,c)=>{c.d(s,{createRadarServices:()=>a.f});var a=c(87846);c(87960)}}]);
\ No newline at end of file
diff --git a/assets/js/10b52b5f.22c76b47.js b/assets/js/10b52b5f.22c76b47.js
new file mode 100644
index 00000000..f7ea66f8
--- /dev/null
+++ b/assets/js/10b52b5f.22c76b47.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8470],{15401:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>o,contentTitle:()=>d,default:()=>h,frontMatter:()=>l,metadata:()=>a,toc:()=>c});const a=JSON.parse('{"id":"API-Reference/view/WorkspaceManager","title":"WorkspaceManager","description":"Import :","source":"@site/api/API-Reference/view/WorkspaceManager.md","sourceDirName":"API-Reference/view","slug":"/API-Reference/view/WorkspaceManager","permalink":"/api/API-Reference/view/WorkspaceManager","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"ViewStateManager","permalink":"/api/API-Reference/view/ViewStateManager"},"next":{"title":"DefaultDialogs","permalink":"/api/API-Reference/widgets/DefaultDialogs"}}');var i=r(74848),s=r(28453);const l={},d=void 0,o={},c=[{value:"Import :",id:"import-",level:3},{value:"view/WorkspaceManager",id:"viewworkspacemanager",level:2},{value:"view/WorkspaceManager.PANEL_TYPE_BOTTOM_PANEL : string",id:"viewworkspacemanagerpanel_type_bottom_panel--string",level:3},{value:"view/WorkspaceManager.PANEL_TYPE_PLUGIN_PANEL : string",id:"viewworkspacemanagerpanel_type_plugin_panel--string",level:3},{value:"view/WorkspaceManager.$bottomPanelContainer : jQueryObject",id:"viewworkspacemanagerbottompanelcontainer--jqueryobject",level:3},{value:"view/WorkspaceManager.$statusBarPanelToggle : jQueryObject",id:"viewworkspacemanagerstatusbarpaneltoggle--jqueryobject",level:3},{value:"view/WorkspaceManager._statusBarToggleInProgress : boolean",id:"viewworkspacemanager_statusbartoggleinprogress--boolean",level:3},{value:"view/WorkspaceManager.EVENT_WORKSPACE_UPDATE_LAYOUT",id:"viewworkspacemanagerevent_workspace_update_layout",level:3},{value:"view/WorkspaceManager.EVENT_WORKSPACE_PANEL_SHOWN",id:"viewworkspacemanagerevent_workspace_panel_shown",level:3},{value:"view/WorkspaceManager.EVENT_WORKSPACE_PANEL_HIDDEN",id:"viewworkspacemanagerevent_workspace_panel_hidden",level:3},{value:"view/WorkspaceManager.EVENT_WORKSPACE_DESIGN_MODE_CHANGE",id:"viewworkspacemanagerevent_workspace_design_mode_change",level:3},{value:"view/WorkspaceManager.createBottomPanel(id, $panel, [minSize], [title], [options]) \u21d2 Panel",id:"viewworkspacemanagercreatebottompanelid-panel-minsize-title-options--panel",level:3},{value:"view/WorkspaceManager.destroyBottomPanel(id)",id:"viewworkspacemanagerdestroybottompanelid",level:3},{value:"view/WorkspaceManager.createPluginPanel(id, $panel, [minSize], $toolbarIcon, [initialSize]) \u21d2 Panel",id:"viewworkspacemanagercreatepluginpanelid-panel-minsize-toolbaricon-initialsize--panel",level:3},{value:"view/WorkspaceManager.getAllPanelIDs() \u21d2 Array",id:"viewworkspacemanagergetallpanelids--array",level:3},{value:"view/WorkspaceManager.getPanelForID(panelID) \u21d2 Object",id:"viewworkspacemanagergetpanelforidpanelid--object",level:3},{value:"view/WorkspaceManager.recomputeLayout(refreshHint)",id:"viewworkspacemanagerrecomputelayoutrefreshhint",level:3},{value:"view/WorkspaceManager.isPanelVisible(panelID) \u21d2 boolean",id:"viewworkspacemanagerispanelvisiblepanelid--boolean",level:3},{value:"view/WorkspaceManager.setPluginPanelWidth(width)",id:"viewworkspacemanagersetpluginpanelwidthwidth",level:3},{value:"view/WorkspaceManager.isInDesignMode() \u21d2 boolean",id:"viewworkspacemanagerisindesignmode--boolean",level:3},{value:"view/WorkspaceManager.setDesignMode(active)",id:"viewworkspacemanagersetdesignmodeactive",level:3},{value:"view/WorkspaceManager.addEscapeKeyEventHandler(consumerName, eventHandler) \u21d2 boolean",id:"viewworkspacemanageraddescapekeyeventhandlerconsumername-eventhandler--boolean",level:3},{value:"view/WorkspaceManager.removeEscapeKeyEventHandler(consumerName) \u21d2 boolean",id:"viewworkspacemanagerremoveescapekeyeventhandlerconsumername--boolean",level:3}];function t(e){const n={a:"a",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h3,{id:"import-",children:"Import :"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-js",children:'const WorkspaceManager = brackets.getModule("view/WorkspaceManager")\n'})}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager"}),"\n",(0,i.jsx)(n.h2,{id:"viewworkspacemanager",children:"view/WorkspaceManager"}),"\n",(0,i.jsx)(n.p,{children:"Manages layout of panels surrounding the editor area, and size of the editor area (but not its contents)."}),"\n",(0,i.jsx)(n.p,{children:"Updates panel sizes when the window is resized. Maintains the max resizing limits for panels, based on\ncurrently available window size."}),"\n",(0,i.jsxs)(n.p,{children:["Events:\n",(0,i.jsx)(n.code,{children:"workspaceUpdateLayout"})," When workspace size changes for any reason (including panel show/hide panel resize, or the window resize).\nThe 2nd arg is the available workspace height.\nThe 3rd arg is a refreshHint flag for internal use (passed in to recomputeLayout)"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:"view/WorkspaceManager"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"static"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager.PANEL_TYPE_BOTTOM_PANEL",children:".PANEL_TYPE_BOTTOM_PANEL"})," : ",(0,i.jsx)("code",{children:"string"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager.PANEL_TYPE_PLUGIN_PANEL",children:".PANEL_TYPE_PLUGIN_PANEL"})," : ",(0,i.jsx)("code",{children:"string"})]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.em,{children:"inner"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..$bottomPanelContainer",children:".$bottomPanelContainer"})," : ",(0,i.jsx)("code",{children:"jQueryObject"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..$statusBarPanelToggle",children:".$statusBarPanelToggle"})," : ",(0,i.jsx)("code",{children:"jQueryObject"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager.._statusBarToggleInProgress",children:"._statusBarToggleInProgress"})," : ",(0,i.jsx)("code",{children:"boolean"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..EVENT_WORKSPACE_UPDATE_LAYOUT",children:".EVENT_WORKSPACE_UPDATE_LAYOUT"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..EVENT_WORKSPACE_PANEL_SHOWN",children:".EVENT_WORKSPACE_PANEL_SHOWN"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..EVENT_WORKSPACE_PANEL_HIDDEN",children:".EVENT_WORKSPACE_PANEL_HIDDEN"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..EVENT_WORKSPACE_DESIGN_MODE_CHANGE",children:".EVENT_WORKSPACE_DESIGN_MODE_CHANGE"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..createBottomPanel",children:".createBottomPanel(id, $panel, [minSize], [title], [options])"})," \u21d2 ",(0,i.jsx)("code",{children:"Panel"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..destroyBottomPanel",children:".destroyBottomPanel(id)"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..createPluginPanel",children:".createPluginPanel(id, $panel, [minSize], $toolbarIcon, [initialSize])"})," \u21d2 ",(0,i.jsx)("code",{children:"Panel"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..getAllPanelIDs",children:".getAllPanelIDs()"})," \u21d2 ",(0,i.jsx)("code",{children:"Array"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..getPanelForID",children:".getPanelForID(panelID)"})," \u21d2 ",(0,i.jsx)("code",{children:"Object"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..recomputeLayout",children:".recomputeLayout(refreshHint)"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..isPanelVisible",children:".isPanelVisible(panelID)"})," \u21d2 ",(0,i.jsx)("code",{children:"boolean"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..setPluginPanelWidth",children:".setPluginPanelWidth(width)"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..isInDesignMode",children:".isInDesignMode()"})," \u21d2 ",(0,i.jsx)("code",{children:"boolean"})]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..setDesignMode",children:".setDesignMode(active)"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..addEscapeKeyEventHandler",children:".addEscapeKeyEventHandler(consumerName, eventHandler)"})," \u21d2 ",(0,i.jsx)("code",{children:"boolean"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager..removeEscapeKeyEventHandler",children:".removeEscapeKeyEventHandler(consumerName)"})," \u21d2 ",(0,i.jsx)("code",{children:"boolean"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager.PANEL_TYPE_BOTTOM_PANEL"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagerpanel_type_bottom_panel--string",children:["view/WorkspaceManager.PANEL_TYPE_BOTTOM_PANEL : ",(0,i.jsx)("code",{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:"Constant representing the type of bottom panel"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": static property of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager.PANEL_TYPE_PLUGIN_PANEL"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagerpanel_type_plugin_panel--string",children:["view/WorkspaceManager.PANEL_TYPE_PLUGIN_PANEL : ",(0,i.jsx)("code",{children:"string"})]}),"\n",(0,i.jsx)(n.p,{children:"Constant representing the type of plugin panel"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": static property of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..$bottomPanelContainer"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagerbottompanelcontainer--jqueryobject",children:["view/WorkspaceManager.$bottomPanelContainer : ",(0,i.jsx)("code",{children:"jQueryObject"})]}),"\n",(0,i.jsx)(n.p,{children:"The single container wrapping all bottom panels"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner property of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..$statusBarPanelToggle"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagerstatusbarpaneltoggle--jqueryobject",children:["view/WorkspaceManager.$statusBarPanelToggle : ",(0,i.jsx)("code",{children:"jQueryObject"})]}),"\n",(0,i.jsx)(n.p,{children:"Chevron toggle in the status bar"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner property of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager.._statusBarToggleInProgress"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanager_statusbartoggleinprogress--boolean",children:["view/WorkspaceManager._statusBarToggleInProgress : ",(0,i.jsx)("code",{children:"boolean"})]}),"\n",(0,i.jsx)(n.p,{children:"True while the status bar toggle button is handling a click"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner property of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..EVENT_WORKSPACE_UPDATE_LAYOUT"}),"\n",(0,i.jsx)(n.h3,{id:"viewworkspacemanagerevent_workspace_update_layout",children:"view/WorkspaceManager.EVENT_WORKSPACE_UPDATE_LAYOUT"}),"\n",(0,i.jsx)(n.p,{children:"Event triggered when the workspace layout updates."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner constant of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..EVENT_WORKSPACE_PANEL_SHOWN"}),"\n",(0,i.jsx)(n.h3,{id:"viewworkspacemanagerevent_workspace_panel_shown",children:"view/WorkspaceManager.EVENT_WORKSPACE_PANEL_SHOWN"}),"\n",(0,i.jsx)(n.p,{children:"Event triggered when a panel is shown."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner constant of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..EVENT_WORKSPACE_PANEL_HIDDEN"}),"\n",(0,i.jsx)(n.h3,{id:"viewworkspacemanagerevent_workspace_panel_hidden",children:"view/WorkspaceManager.EVENT_WORKSPACE_PANEL_HIDDEN"}),"\n",(0,i.jsx)(n.p,{children:"Event triggered when a panel is hidden."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner constant of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..EVENT_WORKSPACE_DESIGN_MODE_CHANGE"}),"\n",(0,i.jsx)(n.h3,{id:"viewworkspacemanagerevent_workspace_design_mode_change",children:"view/WorkspaceManager.EVENT_WORKSPACE_DESIGN_MODE_CHANGE"}),"\n",(0,i.jsxs)(n.p,{children:["Event triggered when design mode (editor collapsed, full live preview) is\nentered or exited. Payload: ",(0,i.jsx)(n.code,{children:"(active: boolean)"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner constant of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..createBottomPanel"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagercreatebottompanelid-panel-minsize-title-options--panel",children:["view/WorkspaceManager.createBottomPanel(id, $panel, [minSize], [title], [options]) \u21d2 ",(0,i.jsx)("code",{children:"Panel"})]}),"\n",(0,i.jsx)(n.p,{children:"Creates a new resizable panel beneath the editor area and above the status bar footer. Panel is initially invisible.\nThe panel's size & visibility are automatically saved & restored as a view-state preference."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"id"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:'Unique id for this panel. Use package-style naming, e.g. "myextension.feature.panelname"'})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"$panel"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"jQueryObject"})}),(0,i.jsx)(n.td,{children:"DOM content to use as the panel. Need not be in the document yet. Must have an id attribute, for use as a preferences key."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[minSize]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"number"})}),(0,i.jsxs)(n.td,{children:["@deprecated No longer used. Pass ",(0,i.jsx)(n.code,{children:"undefined"}),"."]})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[title]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"Display title shown in the bottom panel tab bar."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[options]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"Object"})}),(0,i.jsxs)(n.td,{children:["Optional settings: - ",(0,i.jsx)(n.code,{children:"iconSvg"}),' (string): Path to an SVG icon for the panel tab (e.g. "styles/images/icon.svg"). If omitted, a generic default icon is used.']})]})]})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..destroyBottomPanel"}),"\n",(0,i.jsx)(n.h3,{id:"viewworkspacemanagerdestroybottompanelid",children:"view/WorkspaceManager.destroyBottomPanel(id)"}),"\n",(0,i.jsx)(n.p,{children:"Destroys a bottom panel, removing it from internal registries, the tab bar, and the DOM.\nAfter calling this, the panel ID is no longer valid and the Panel instance should not be reused."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"id"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"The panel ID that was passed to createBottomPanel."})]})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..createPluginPanel"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagercreatepluginpanelid-panel-minsize-toolbaricon-initialsize--panel",children:["view/WorkspaceManager.createPluginPanel(id, $panel, [minSize], $toolbarIcon, [initialSize]) \u21d2 ",(0,i.jsx)("code",{children:"Panel"})]}),"\n",(0,i.jsx)(n.p,{children:"Creates a new resizable plugin panel associated with the given toolbar icon. Panel is initially invisible.\nThe panel's size & visibility are automatically saved & restored. Only one panel can be associated with a\ntoolbar icon."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"id"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:'Unique id for this panel. Use package-style naming, e.g. "myextension.panelname". will overwrite an existing panel id if present.'})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"$panel"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"jQueryObject"})}),(0,i.jsx)(n.td,{children:"DOM content to use as the panel. Need not be in the document yet. Must have an id attribute, for use as a preferences key."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[minSize]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"number"})}),(0,i.jsx)(n.td,{children:"Minimum height of panel in px."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"$toolbarIcon"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"jQueryObject"})}),(0,i.jsx)(n.td,{children:"An icon that should be present in main-toolbar to associate this panel to. The panel will be shown only if the icon is visible on the toolbar and the user clicks on the icon."})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"[initialSize]"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"number"})}),(0,i.jsx)(n.td,{children:"Optional Initial size of panel in px. If not given, panel will use minsize or current size."})]})]})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..getAllPanelIDs"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagergetallpanelids--array",children:["view/WorkspaceManager.getAllPanelIDs() \u21d2 ",(0,i.jsx)("code",{children:"Array"})]}),"\n",(0,i.jsx)(n.p,{children:"Returns an array of all panel ID's"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})}),(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.strong,{children:"Returns"}),": ",(0,i.jsx)("code",{children:"Array"})," - List of ID's of all bottom panels"]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..getPanelForID"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagergetpanelforidpanelid--object",children:["view/WorkspaceManager.getPanelForID(panelID) \u21d2 ",(0,i.jsx)("code",{children:"Object"})]}),"\n",(0,i.jsx)(n.p,{children:"Gets the Panel interface for the given ID. Can return undefined if no panel with the ID is found."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})}),(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.strong,{children:"Returns"}),": ",(0,i.jsx)("code",{children:"Object"})," - Panel object for the ID or undefined"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"panelID"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})})]})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..recomputeLayout"}),"\n",(0,i.jsx)(n.h3,{id:"viewworkspacemanagerrecomputelayoutrefreshhint",children:"view/WorkspaceManager.recomputeLayout(refreshHint)"}),"\n",(0,i.jsx)(n.p,{children:"Called when an external widget has appeared and needs some of the space occupied\nby the mainview manager"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"refreshHint"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"boolean"})}),(0,i.jsx)(n.td,{children:"true to refresh the editor, false if not"})]})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..isPanelVisible"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagerispanelvisiblepanelid--boolean",children:["view/WorkspaceManager.isPanelVisible(panelID) \u21d2 ",(0,i.jsx)("code",{children:"boolean"})]}),"\n",(0,i.jsx)(n.p,{children:"Responsible to check if the panel is visible or not.\nReturns true if visible else false."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsx)(n.tr,{children:(0,i.jsx)(n.th,{children:"Param"})})}),(0,i.jsx)(n.tbody,{children:(0,i.jsx)(n.tr,{children:(0,i.jsx)(n.td,{children:"panelID"})})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..setPluginPanelWidth"}),"\n",(0,i.jsx)(n.h3,{id:"viewworkspacemanagersetpluginpanelwidthwidth",children:"view/WorkspaceManager.setPluginPanelWidth(width)"}),"\n",(0,i.jsx)(n.p,{children:"Programmatically sets the plugin panel content width to the given value in pixels.\nThe total toolbar width is adjusted to account for the plugin icons bar.\nIf the requested width doesn't fit, the sidebar is progressively shrunk\n(and collapsed if necessary) before clamping.\nNo-op if no panel is currently visible."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"width"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"number"})}),(0,i.jsx)(n.td,{children:"Desired content width in pixels"})]})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..isInDesignMode"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagerisindesignmode--boolean",children:["view/WorkspaceManager.isInDesignMode() \u21d2 ",(0,i.jsx)("code",{children:"boolean"})]}),"\n",(0,i.jsx)(n.p,{children:"Returns true while the workspace is in design mode (editor collapsed and\nlive preview expanded to fill the editor area)."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..setDesignMode"}),"\n",(0,i.jsx)(n.h3,{id:"viewworkspacemanagersetdesignmodeactive",children:"view/WorkspaceManager.setDesignMode(active)"}),"\n",(0,i.jsx)(n.p,{children:"Sets the design-mode flag and fires EVENT_WORKSPACE_DESIGN_MODE_CHANGE when\nthe value actually changes. Intended to be called by the control bar; other\ncallers should use the dedicated toggle command instead."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})})]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"active"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"boolean"})})]})})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..addEscapeKeyEventHandler"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanageraddescapekeyeventhandlerconsumername-eventhandler--boolean",children:["view/WorkspaceManager.addEscapeKeyEventHandler(consumerName, eventHandler) \u21d2 ",(0,i.jsx)("code",{children:"boolean"})]}),"\n",(0,i.jsx)(n.p,{children:"If any widgets related to the editor needs to handle the escape key event, add it here. returning true from the\nregistered handler will prevent primary escape key toggle panel behavior of phoenix. Note that returning true\nwill no stop the event bubbling, that has to be controlled with the event parameter forwarded to the handler."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})}),(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.strong,{children:"Returns"}),": ",(0,i.jsx)("code",{children:"boolean"})," - true if added"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"consumerName"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"a unique name for your consumer"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"eventHandler"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"function"})}),(0,i.jsx)(n.td,{children:"If the eventHandler returns true for this callback, the escape key event will not lead to panel toggle default behavior."})]})]})]}),"\n",(0,i.jsx)("a",{name:"module_view/WorkspaceManager..removeEscapeKeyEventHandler"}),"\n",(0,i.jsxs)(n.h3,{id:"viewworkspacemanagerremoveescapekeyeventhandlerconsumername--boolean",children:["view/WorkspaceManager.removeEscapeKeyEventHandler(consumerName) \u21d2 ",(0,i.jsx)("code",{children:"boolean"})]}),"\n",(0,i.jsx)(n.p,{children:"Removing the escape key event consumer."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Kind"}),": inner method of ",(0,i.jsx)(n.a,{href:"#module_view/WorkspaceManager",children:(0,i.jsx)("code",{children:"view/WorkspaceManager"})}),(0,i.jsx)(n.br,{}),"\n",(0,i.jsx)(n.strong,{children:"Returns"}),": ",(0,i.jsx)("code",{children:"boolean"})," - true if removed"]}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Param"}),(0,i.jsx)(n.th,{children:"Type"}),(0,i.jsx)(n.th,{children:"Description"})]})}),(0,i.jsx)(n.tbody,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:"consumerName"}),(0,i.jsx)(n.td,{children:(0,i.jsx)("code",{children:"string"})}),(0,i.jsx)(n.td,{children:"used to register the consumer."})]})})]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(t,{...e})}):t(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>d});var a=r(96540);const i={},s=a.createContext(i);function l(e){const n=a.useContext(s);return a.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:l(e.components),a.createElement(s.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1149e606.272e1b68.js b/assets/js/1149e606.272e1b68.js
new file mode 100644
index 00000000..36493a53
--- /dev/null
+++ b/assets/js/1149e606.272e1b68.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3199],{92657:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>h,frontMatter:()=>o,metadata:()=>r,toc:()=>l});const r=JSON.parse('{"id":"API-Reference/widgets/PopUpManager","title":"PopUpManager","description":"Import :","source":"@site/api/API-Reference/widgets/PopUpManager.md","sourceDirName":"API-Reference/widgets","slug":"/API-Reference/widgets/PopUpManager","permalink":"/api/API-Reference/widgets/PopUpManager","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"NotificationUI","permalink":"/api/API-Reference/widgets/NotificationUI"},"next":{"title":"StatusBar","permalink":"/api/API-Reference/widgets/StatusBar"}}');var s=t(74848),i=t(28453);const o={},d=void 0,p={},l=[{value:"Import :",id:"import-",level:3},{value:"AppInit",id:"appinit",level:2},{value:"addPopUp($popUp, removeHandler, autoRemove, options)",id:"addpopuppopup-removehandler-autoremove-options",level:2},{value:"removePopUp($popUp)",id:"removepopuppopup",level:2},{value:"_filterDropdown($popup, searchString)",id:"_filterdropdownpopup-searchstring",level:2},{value:"selectNextItem(direction, $popUp)",id:"selectnextitemdirection-popup",level:2},{value:"listenToContextMenu(contextMenu)",id:"listentocontextmenucontextmenu",level:2}];function c(e){const n={code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h3,{id:"import-",children:"Import :"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:'const PopUpManager = brackets.getModule("widgets/PopUpManager")\n'})}),"\n",(0,s.jsx)("a",{name:"AppInit"}),"\n",(0,s.jsx)(n.h2,{id:"appinit",children:"AppInit"}),"\n",(0,s.jsx)(n.p,{children:"Utilities for managing pop-ups."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": global variable"]}),"\n",(0,s.jsx)("a",{name:"addPopUp"}),"\n",(0,s.jsx)(n.h2,{id:"addpopuppopup-removehandler-autoremove-options",children:"addPopUp($popUp, removeHandler, autoRemove, options)"}),"\n",(0,s.jsx)(n.p,{children:"Add Esc key handling for a popup DOM element."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"$popUp"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"jQuery"})}),(0,s.jsx)(n.td,{children:"jQuery object for the DOM element pop-up"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"removeHandler"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"function"})}),(0,s.jsxs)(n.td,{children:["Pop-up specific remove (e.g. display",":none"," or DOM removal)"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"autoRemove"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"Boolean"})}),(0,s.jsx)(n.td,{children:"Specify true to indicate the PopUpManager should remove the popup from the _popUps array when the popup is closed. Specify false when the popup is always persistant in the _popUps array."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"options"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"object"})}),(0,s.jsx)(n.td,{})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"[options.popupManagesFocus]"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"boolean"})}),(0,s.jsx)(n.td,{children:"set to true if the popup manages focus restore on close"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"[options.closeCurrentPopups]"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"boolean"})}),(0,s.jsx)(n.td,{children:"set to true if you want to dismiss all exiting popups before adding this. Useful when this should be the only popup visible."})]})]})]}),"\n",(0,s.jsx)("a",{name:"removePopUp"}),"\n",(0,s.jsx)(n.h2,{id:"removepopuppopup",children:"removePopUp($popUp)"}),"\n",(0,s.jsx)(n.p,{children:"Remove Esc key handling for a pop-up. Removes the pop-up from the DOM\nif the pop-up is currently visible and was not originally attached."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Type"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"$popUp"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"jQuery"})})]})})]}),"\n",(0,s.jsx)("a",{name:"_filterDropdown"}),"\n",(0,s.jsx)(n.h2,{id:"_filterdropdownpopup-searchstring",children:"_filterDropdown($popup, searchString)"}),"\n",(0,s.jsx)(n.p,{children:"hides all elements in popup that doesn't match the given search string, also shows the search bar in popup"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsx)(n.tr,{children:(0,s.jsx)(n.th,{children:"Param"})})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsx)(n.tr,{children:(0,s.jsx)(n.td,{children:"$popup"})}),(0,s.jsx)(n.tr,{children:(0,s.jsx)(n.td,{children:"searchString"})})]})]}),"\n",(0,s.jsx)("a",{name:"selectNextItem"}),"\n",(0,s.jsx)(n.h2,{id:"selectnextitemdirection-popup",children:"selectNextItem(direction, $popUp)"}),"\n",(0,s.jsx)(n.p,{children:"Selects the next or previous item in the popup."}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"direction"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"number"})}),(0,s.jsx)(n.td,{children:"+1 for next, -1 for prev"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"$popUp"}),(0,s.jsx)(n.td,{}),(0,s.jsx)(n.td,{})]})]})]}),"\n",(0,s.jsx)("a",{name:"listenToContextMenu"}),"\n",(0,s.jsx)(n.h2,{id:"listentocontextmenucontextmenu",children:"listenToContextMenu(contextMenu)"}),"\n",(0,s.jsx)(n.p,{children:"Context menus are also created in AppInit.htmlReady(), so they may not\nyet have been created when we get our AppInit.htmlReady() callback, so\nwe provide this method to tell us when to start listening for their events"}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Param"}),(0,s.jsx)(n.th,{children:"Type"})]})}),(0,s.jsx)(n.tbody,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"contextMenu"}),(0,s.jsx)(n.td,{children:(0,s.jsx)("code",{children:"ContextMenu"})})]})})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>d});var r=t(96540);const s={},i=r.createContext(s);function o(e){const n=r.useContext(i);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),r.createElement(i.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/11bab730.6acd3738.js b/assets/js/11bab730.6acd3738.js
new file mode 100644
index 00000000..0fcc5ba9
--- /dev/null
+++ b/assets/js/11bab730.6acd3738.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2922],{10677:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>o,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>i,toc:()=>c});const i=JSON.parse('{"id":"API-Reference/filesystem/FileSystemStats","title":"FileSystemStats","description":"Import :","source":"@site/api/API-Reference/filesystem/FileSystemStats.md","sourceDirName":"API-Reference/filesystem","slug":"/API-Reference/filesystem/FileSystemStats","permalink":"/api/API-Reference/filesystem/FileSystemStats","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"FileSystemError","permalink":"/api/API-Reference/filesystem/FileSystemError"},"next":{"title":"RemoteFile","permalink":"/api/API-Reference/filesystem/RemoteFile"}}');var n=s(74848),l=s(28453);const r={},a=void 0,o={},c=[{value:"Import :",id:"import-",level:3},{value:"FileSystemStats",id:"filesystemstats",level:2},{value:"new FileSystemStats(options)",id:"new-filesystemstatsoptions",level:3},{value:"isFile : boolean",id:"isfile--boolean",level:2},{value:"isDirectory : boolean",id:"isdirectory--boolean",level:2},{value:"mtime : Date",id:"mtime--date",level:2},{value:"size : Number",id:"size--number",level:2},{value:"realPath : string",id:"realpath--string",level:2}];function d(e){const t={code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,l.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h3,{id:"import-",children:"Import :"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-js",children:'const FileSystemStats = brackets.getModule("filesystem/FileSystemStats")\n'})}),"\n",(0,n.jsx)("a",{name:"FileSystemStats"}),"\n",(0,n.jsx)(t.h2,{id:"filesystemstats",children:"FileSystemStats"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": global class"]}),"\n",(0,n.jsx)("a",{name:"new_FileSystemStats_new"}),"\n",(0,n.jsx)(t.h3,{id:"new-filesystemstatsoptions",children:"new FileSystemStats(options)"}),"\n",(0,n.jsx)(t.p,{children:"The FileSystemStats represents a particular FileSystemEntry's stats."}),"\n",(0,n.jsxs)(t.table,{children:[(0,n.jsx)(t.thead,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.th,{children:"Param"}),(0,n.jsx)(t.th,{children:"Type"})]})}),(0,n.jsx)(t.tbody,{children:(0,n.jsxs)(t.tr,{children:[(0,n.jsx)(t.td,{children:"options"}),(0,n.jsx)(t.td,{children:(0,n.jsx)("code",{children:"Object"})})]})})]}),"\n",(0,n.jsx)("a",{name:"isFile"}),"\n",(0,n.jsxs)(t.h2,{id:"isfile--boolean",children:["isFile : ",(0,n.jsx)("code",{children:"boolean"})]}),"\n",(0,n.jsx)(t.p,{children:"Whether or not this is a stats object for a file"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": global variable"]}),"\n",(0,n.jsx)("a",{name:"isDirectory"}),"\n",(0,n.jsxs)(t.h2,{id:"isdirectory--boolean",children:["isDirectory : ",(0,n.jsx)("code",{children:"boolean"})]}),"\n",(0,n.jsx)(t.p,{children:"Whether or not this is a stats object for a directory"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": global variable"]}),"\n",(0,n.jsx)("a",{name:"mtime"}),"\n",(0,n.jsxs)(t.h2,{id:"mtime--date",children:["mtime : ",(0,n.jsx)("code",{children:"Date"})]}),"\n",(0,n.jsx)(t.p,{children:"Modification time for a file"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": global variable"]}),"\n",(0,n.jsx)("a",{name:"size"}),"\n",(0,n.jsxs)(t.h2,{id:"size--number",children:["size : ",(0,n.jsx)("code",{children:"Number"})]}),"\n",(0,n.jsx)(t.p,{children:"Size in bytes of a file"}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": global variable"]}),"\n",(0,n.jsx)("a",{name:"realPath"}),"\n",(0,n.jsxs)(t.h2,{id:"realpath--string",children:["realPath : ",(0,n.jsx)("code",{children:"string"})]}),"\n",(0,n.jsx)(t.p,{children:"The canonical path of this file or directory ONLY if it is a symbolic link,\nand null otherwise."}),"\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:"Kind"}),": global variable"]})]})}function h(e={}){const{wrapper:t}={...(0,l.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},28453:(e,t,s)=>{s.d(t,{R:()=>r,x:()=>a});var i=s(96540);const n={},l=i.createContext(n);function r(e){const t=i.useContext(l);return i.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:r(e.components),i.createElement(l.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/1203.2ab4f907.js b/assets/js/1203.2ab4f907.js
new file mode 100644
index 00000000..50cd9bb2
--- /dev/null
+++ b/assets/js/1203.2ab4f907.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1203],{51203:(t,e,i)=>{i.d(e,{diagram:()=>I});var a=i(67633),n=i(40797),s=i(70451),r=function(){var t=(0,n.K2)((function(t,e,i,a){for(i=i||{},a=t.length;a--;i[t[a]]=e);return i}),"o"),e=[1,3],i=[1,4],a=[1,5],s=[1,6],r=[1,7],o=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],l=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],h=[55,56,57],c=[2,36],d=[1,37],u=[1,36],x=[1,38],g=[1,35],f=[1,43],p=[1,41],y=[1,14],T=[1,23],m=[1,18],q=[1,19],A=[1,20],_=[1,21],b=[1,22],S=[1,24],k=[1,25],F=[1,26],P=[1,27],C=[1,28],L=[1,29],v=[1,32],I=[1,33],E=[1,34],D=[1,39],z=[1,40],w=[1,42],K=[1,44],U=[1,62],N=[1,61],R=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],B=[1,65],W=[1,66],$=[1,67],Q=[1,68],O=[1,69],X=[1,70],H=[1,71],M=[1,72],Y=[1,73],j=[1,74],G=[1,75],V=[1,76],Z=[4,5,6,7,8,9,10,11,12,13,14,15,18],J=[1,90],tt=[1,91],et=[1,92],it=[1,99],at=[1,93],nt=[1,96],st=[1,94],rt=[1,95],ot=[1,97],lt=[1,98],ht=[1,102],ct=[10,55,56,57],dt=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],ut={trace:(0,n.K2)((function(){}),"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:(0,n.K2)((function(t,e,i,a,n,s,r){var o=s.length-1;switch(n){case 23:case 68:this.$=s[o];break;case 24:case 69:this.$=s[o-1]+""+s[o];break;case 26:this.$=s[o-1]+s[o];break;case 27:this.$=[s[o].trim()];break;case 28:s[o-2].push(s[o].trim()),this.$=s[o-2];break;case 29:this.$=s[o-4],a.addClass(s[o-2],s[o]);break;case 37:this.$=[];break;case 42:this.$=s[o].trim(),a.setDiagramTitle(this.$);break;case 43:this.$=s[o].trim(),a.setAccTitle(this.$);break;case 44:case 45:this.$=s[o].trim(),a.setAccDescription(this.$);break;case 46:a.addSection(s[o].substr(8)),this.$=s[o].substr(8);break;case 47:a.addPoint(s[o-3],"",s[o-1],s[o],[]);break;case 48:a.addPoint(s[o-4],s[o-3],s[o-1],s[o],[]);break;case 49:a.addPoint(s[o-4],"",s[o-2],s[o-1],s[o]);break;case 50:a.addPoint(s[o-5],s[o-4],s[o-2],s[o-1],s[o]);break;case 51:a.setXAxisLeftText(s[o-2]),a.setXAxisRightText(s[o]);break;case 52:s[o-1].text+=" \u27f6 ",a.setXAxisLeftText(s[o-1]);break;case 53:a.setXAxisLeftText(s[o]);break;case 54:a.setYAxisBottomText(s[o-2]),a.setYAxisTopText(s[o]);break;case 55:s[o-1].text+=" \u27f6 ",a.setYAxisBottomText(s[o-1]);break;case 56:a.setYAxisBottomText(s[o]);break;case 57:a.setQuadrant1Text(s[o]);break;case 58:a.setQuadrant2Text(s[o]);break;case 59:a.setQuadrant3Text(s[o]);break;case 60:a.setQuadrant4Text(s[o]);break;case 64:case 66:this.$={text:s[o],type:"text"};break;case 65:this.$={text:s[o-1].text+""+s[o],type:s[o-1].type};break;case 67:this.$={text:s[o],type:"markdown"}}}),"anonymous"),table:[{18:e,26:1,27:2,28:i,55:a,56:s,57:r},{1:[3]},{18:e,26:8,27:2,28:i,55:a,56:s,57:r},{18:e,26:9,27:2,28:i,55:a,56:s,57:r},t(o,[2,33],{29:10}),t(l,[2,61]),t(l,[2,62]),t(l,[2,63]),{1:[2,30]},{1:[2,31]},t(h,c,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:d,5:u,10:x,12:g,13:f,14:p,18:y,25:T,35:m,37:q,39:A,41:_,42:b,48:S,50:k,51:F,52:P,53:C,54:L,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),t(o,[2,34]),{27:45,55:a,56:s,57:r},t(h,[2,37]),t(h,c,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:d,5:u,10:x,12:g,13:f,14:p,18:y,25:T,35:m,37:q,39:A,41:_,42:b,48:S,50:k,51:F,52:P,53:C,54:L,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),t(h,[2,39]),t(h,[2,40]),t(h,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(h,[2,45]),t(h,[2,46]),{18:[1,50]},{4:d,5:u,10:x,12:g,13:f,14:p,43:51,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:52,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:53,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:54,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:55,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:56,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,44:[1,57],47:[1,58],58:60,59:59,63:E,64:D,65:z,66:w,67:K},t(R,[2,64]),t(R,[2,66]),t(R,[2,67]),t(R,[2,70]),t(R,[2,71]),t(R,[2,72]),t(R,[2,73]),t(R,[2,74]),t(R,[2,75]),t(R,[2,76]),t(R,[2,77]),t(R,[2,78]),t(R,[2,79]),t(R,[2,80]),t(o,[2,35]),t(h,[2,38]),t(h,[2,42]),t(h,[2,43]),t(h,[2,44]),{3:64,4:B,5:W,6:$,7:Q,8:O,9:X,10:H,11:M,12:Y,13:j,14:G,15:V,21:63},t(h,[2,53],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,49:[1,77],63:E,64:D,65:z,66:w,67:K}),t(h,[2,56],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,49:[1,78],63:E,64:D,65:z,66:w,67:K}),t(h,[2,57],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,58],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,59],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,60],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),{45:[1,79]},{44:[1,80]},t(R,[2,65]),t(R,[2,81]),t(R,[2,82]),t(R,[2,83]),{3:82,4:B,5:W,6:$,7:Q,8:O,9:X,10:H,11:M,12:Y,13:j,14:G,15:V,18:[1,81]},t(Z,[2,23]),t(Z,[2,1]),t(Z,[2,2]),t(Z,[2,3]),t(Z,[2,4]),t(Z,[2,5]),t(Z,[2,6]),t(Z,[2,7]),t(Z,[2,8]),t(Z,[2,9]),t(Z,[2,10]),t(Z,[2,11]),t(Z,[2,12]),t(h,[2,52],{58:31,43:83,4:d,5:u,10:x,12:g,13:f,14:p,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),t(h,[2,55],{58:31,43:84,4:d,5:u,10:x,12:g,13:f,14:p,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),{46:[1,85]},{45:[1,86]},{4:J,5:tt,6:et,8:it,11:at,13:nt,16:89,17:st,18:rt,19:ot,20:lt,22:88,23:87},t(Z,[2,24]),t(h,[2,51],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,54],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,47],{22:88,16:89,23:100,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt}),{46:[1,101]},t(h,[2,29],{10:ht}),t(ct,[2,27],{16:103,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt}),t(dt,[2,25]),t(dt,[2,13]),t(dt,[2,14]),t(dt,[2,15]),t(dt,[2,16]),t(dt,[2,17]),t(dt,[2,18]),t(dt,[2,19]),t(dt,[2,20]),t(dt,[2,21]),t(dt,[2,22]),t(h,[2,49],{10:ht}),t(h,[2,48],{22:88,16:89,23:104,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt}),{4:J,5:tt,6:et,8:it,11:at,13:nt,16:89,17:st,18:rt,19:ot,20:lt,22:105},t(dt,[2,26]),t(h,[2,50],{10:ht}),t(ct,[2,28],{16:103,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt})],defaultActions:{8:[2,30],9:[2,31]},parseError:(0,n.K2)((function(t,e){if(!e.recoverable){var i=new Error(t);throw i.hash=e,i}this.trace(t)}),"parseError"),parse:(0,n.K2)((function(t){var e=this,i=[0],a=[],s=[null],r=[],o=this.table,l="",h=0,c=0,d=0,u=r.slice.call(arguments,1),x=Object.create(this.lexer),g={yy:{}};for(var f in this.yy)Object.prototype.hasOwnProperty.call(this.yy,f)&&(g.yy[f]=this.yy[f]);x.setInput(t,g.yy),g.yy.lexer=x,g.yy.parser=this,void 0===x.yylloc&&(x.yylloc={});var p=x.yylloc;r.push(p);var y=x.options&&x.options.ranges;function T(){var t;return"number"!=typeof(t=a.pop()||x.lex()||1)&&(t instanceof Array&&(t=(a=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,n.K2)((function(t){i.length=i.length-2*t,s.length=s.length-t,r.length=r.length-t}),"popStack"),(0,n.K2)(T,"lex");for(var m,q,A,_,b,S,k,F,P,C={};;){if(A=i[i.length-1],this.defaultActions[A]?_=this.defaultActions[A]:(null==m&&(m=T()),_=o[A]&&o[A][m]),void 0===_||!_.length||!_[0]){var L="";for(S in P=[],o[A])this.terminals_[S]&&S>2&&P.push("'"+this.terminals_[S]+"'");L=x.showPosition?"Parse error on line "+(h+1)+":\n"+x.showPosition()+"\nExpecting "+P.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(h+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(L,{text:x.match,token:this.terminals_[m]||m,line:x.yylineno,loc:p,expected:P})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+A+", token: "+m);switch(_[0]){case 1:i.push(m),s.push(x.yytext),r.push(x.yylloc),i.push(_[1]),m=null,q?(m=q,q=null):(c=x.yyleng,l=x.yytext,h=x.yylineno,p=x.yylloc,d>0&&d--);break;case 2:if(k=this.productions_[_[1]][1],C.$=s[s.length-k],C._$={first_line:r[r.length-(k||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(k||1)].first_column,last_column:r[r.length-1].last_column},y&&(C._$.range=[r[r.length-(k||1)].range[0],r[r.length-1].range[1]]),void 0!==(b=this.performAction.apply(C,[l,c,h,g.yy,_[1],s,r].concat(u))))return b;k&&(i=i.slice(0,-1*k*2),s=s.slice(0,-1*k),r=r.slice(0,-1*k)),i.push(this.productions_[_[1]][0]),s.push(C.$),r.push(C._$),F=o[i[i.length-2]][i[i.length-1]],i.push(F);break;case 3:return!0}}return!0}),"parse")},xt=function(){return{EOF:1,parseError:(0,n.K2)((function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)}),"parseError"),setInput:(0,n.K2)((function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this}),"setInput"),input:(0,n.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,n.K2)((function(t){var e=t.length,i=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var a=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),i.length-1&&(this.yylineno-=i.length-1);var n=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:i?(i.length===a.length?this.yylloc.first_column:0)+a[a.length-i.length].length-i[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,n.K2)((function(){return this._more=!0,this}),"more"),reject:(0,n.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"reject"),less:(0,n.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,n.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,n.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,n.K2)((function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"}),"showPosition"),test_match:(0,n.K2)((function(t,e){var i,a,n;if(this.options.backtrack_lexer&&(n={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(n.yylloc.range=this.yylloc.range.slice(0))),(a=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=a.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:a?a[a.length-1].length-a[a.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],i=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),i)return i;if(this._backtrack){for(var s in n)this[s]=n[s];return!1}return!1}),"test_match"),next:(0,n.K2)((function(){if(this.done)return this.EOF;var t,e,i,a;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),s=0;se[0].length)){if(e=i,a=s,this.options.backtrack_lexer){if(!1!==(t=this.test_match(i,n[s])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[a]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,n.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,n.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,n.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,n.K2)((function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules}),"_currentRules"),topState:(0,n.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,n.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,n.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,n.K2)((function(t,e,i,a){switch(i){case 0:case 1:case 3:break;case 2:return 55;case 4:return this.begin("title"),35;case 5:return this.popState(),"title_value";case 6:return this.begin("acc_title"),37;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),39;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 23:case 25:case 31:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 24:this.begin("string");break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;case 29:return this.begin("point_start"),44;case 30:return this.begin("point_x"),45;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}}),"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}}}();function gt(){this.yy={}}return ut.lexer=xt,(0,n.K2)(gt,"Parser"),gt.prototype=ut,ut.Parser=gt,new gt}();r.parser=r;var o=r,l=(0,a.P$)(),h=class{constructor(){this.classes=new Map,this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{(0,n.K2)(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:a.UI.quadrantChart?.chartWidth||500,chartWidth:a.UI.quadrantChart?.chartHeight||500,titlePadding:a.UI.quadrantChart?.titlePadding||10,titleFontSize:a.UI.quadrantChart?.titleFontSize||20,quadrantPadding:a.UI.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:a.UI.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:a.UI.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:a.UI.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:a.UI.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:a.UI.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:a.UI.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:a.UI.quadrantChart?.pointTextPadding||5,pointLabelFontSize:a.UI.quadrantChart?.pointLabelFontSize||12,pointRadius:a.UI.quadrantChart?.pointRadius||5,xAxisPosition:a.UI.quadrantChart?.xAxisPosition||"top",yAxisPosition:a.UI.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:a.UI.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:a.UI.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:l.quadrant1Fill,quadrant2Fill:l.quadrant2Fill,quadrant3Fill:l.quadrant3Fill,quadrant4Fill:l.quadrant4Fill,quadrant1TextFill:l.quadrant1TextFill,quadrant2TextFill:l.quadrant2TextFill,quadrant3TextFill:l.quadrant3TextFill,quadrant4TextFill:l.quadrant4TextFill,quadrantPointFill:l.quadrantPointFill,quadrantPointTextFill:l.quadrantPointTextFill,quadrantXAxisTextFill:l.quadrantXAxisTextFill,quadrantYAxisTextFill:l.quadrantYAxisTextFill,quadrantTitleFill:l.quadrantTitleFill,quadrantInternalBorderStrokeFill:l.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:l.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,n.Rm.info("clear called")}setData(t){this.data={...this.data,...t}}addPoints(t){this.data.points=[...t,...this.data.points]}addClass(t,e){this.classes.set(t,e)}setConfig(t){n.Rm.trace("setConfig called with: ",t),this.config={...this.config,...t}}setThemeConfig(t){n.Rm.trace("setThemeConfig called with: ",t),this.themeConfig={...this.themeConfig,...t}}calculateSpace(t,e,i,a){const n=2*this.config.xAxisLabelPadding+this.config.xAxisLabelFontSize,s={top:"top"===t&&e?n:0,bottom:"bottom"===t&&e?n:0},r=2*this.config.yAxisLabelPadding+this.config.yAxisLabelFontSize,o={left:"left"===this.config.yAxisPosition&&i?r:0,right:"right"===this.config.yAxisPosition&&i?r:0},l=this.config.titleFontSize+2*this.config.titlePadding,h={top:a?l:0},c=this.config.quadrantPadding+o.left,d=this.config.quadrantPadding+s.top+h.top,u=this.config.chartWidth-2*this.config.quadrantPadding-o.left-o.right,x=this.config.chartHeight-2*this.config.quadrantPadding-s.top-s.bottom-h.top;return{xAxisSpace:s,yAxisSpace:o,titleSpace:h,quadrantSpace:{quadrantLeft:c,quadrantTop:d,quadrantWidth:u,quadrantHalfWidth:u/2,quadrantHeight:x,quadrantHalfHeight:x/2}}}getAxisLabels(t,e,i,a){const{quadrantSpace:n,titleSpace:s}=a,{quadrantHalfHeight:r,quadrantHeight:o,quadrantLeft:l,quadrantHalfWidth:h,quadrantTop:c,quadrantWidth:d}=n,u=Boolean(this.data.xAxisRightText),x=Boolean(this.data.yAxisTopText),g=[];return this.data.xAxisLeftText&&e&&g.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:l+(u?h/2:0),y:"top"===t?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+c+o+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:u?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&e&&g.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:l+h+(u?h/2:0),y:"top"===t?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+c+o+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:u?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&i&&g.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:"left"===this.config.yAxisPosition?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+l+d+this.config.quadrantPadding,y:c+o-(x?r/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:x?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&i&&g.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:"left"===this.config.yAxisPosition?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+l+d+this.config.quadrantPadding,y:c+r-(x?r/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:x?"center":"left",horizontalPos:"top",rotation:-90}),g}getQuadrants(t){const{quadrantSpace:e}=t,{quadrantHalfHeight:i,quadrantLeft:a,quadrantHalfWidth:n,quadrantTop:s}=e,r=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:a+n,y:s,width:n,height:i,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:a,y:s,width:n,height:i,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:a,y:s+i,width:n,height:i,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:a+n,y:s+i,width:n,height:i,fill:this.themeConfig.quadrant4Fill}];for(const o of r)o.text.x=o.x+o.width/2,0===this.data.points.length?(o.text.y=o.y+o.height/2,o.text.horizontalPos="middle"):(o.text.y=o.y+this.config.quadrantTextTopPadding,o.text.horizontalPos="top");return r}getQuadrantPoints(t){const{quadrantSpace:e}=t,{quadrantHeight:i,quadrantLeft:a,quadrantTop:n,quadrantWidth:r}=e,o=(0,s.m4Y)().domain([0,1]).range([a,r+a]),l=(0,s.m4Y)().domain([0,1]).range([i+n,n]);return this.data.points.map((t=>{const e=this.classes.get(t.className);e&&(t={...e,...t});return{x:o(t.x),y:l(t.y),fill:t.color??this.themeConfig.quadrantPointFill,radius:t.radius??this.config.pointRadius,text:{text:t.text,fill:this.themeConfig.quadrantPointTextFill,x:o(t.x),y:l(t.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:t.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:t.strokeWidth??"0px"}}))}getBorders(t){const e=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:i}=t,{quadrantHalfHeight:a,quadrantHeight:n,quadrantLeft:s,quadrantHalfWidth:r,quadrantTop:o,quadrantWidth:l}=i;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-e,y1:o,x2:s+l+e,y2:o},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s+l,y1:o+e,x2:s+l,y2:o+n-e},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-e,y1:o+n,x2:s+l+e,y2:o+n},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s,y1:o+e,x2:s,y2:o+n-e},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+r,y1:o+e,x2:s+r,y2:o+n-e},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+e,y1:o+a,x2:s+l-e,y2:o+a}]}getTitle(t){if(t)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){const t=this.config.showXAxis&&!(!this.data.xAxisLeftText&&!this.data.xAxisRightText),e=this.config.showYAxis&&!(!this.data.yAxisTopText&&!this.data.yAxisBottomText),i=this.config.showTitle&&!!this.data.titleText,a=this.data.points.length>0?"bottom":this.config.xAxisPosition,n=this.calculateSpace(a,t,e,i);return{points:this.getQuadrantPoints(n),quadrants:this.getQuadrants(n),axisLabels:this.getAxisLabels(a,t,e,n),borderLines:this.getBorders(n),title:this.getTitle(i)}}},c=class extends Error{static{(0,n.K2)(this,"InvalidStyleError")}constructor(t,e,i){super(`value for ${t} ${e} is invalid, please use a valid ${i}`),this.name="InvalidStyleError"}};function d(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function u(t){return!/^\d+$/.test(t)}function x(t){return!/^\d+px$/.test(t)}(0,n.K2)(d,"validateHexCode"),(0,n.K2)(u,"validateNumber"),(0,n.K2)(x,"validateSizeInPixels");var g=(0,a.D7)();function f(t){return(0,a.jZ)(t.trim(),g)}(0,n.K2)(f,"textSanitizer");var p=new h;function y(t){p.setData({quadrant1Text:f(t.text)})}function T(t){p.setData({quadrant2Text:f(t.text)})}function m(t){p.setData({quadrant3Text:f(t.text)})}function q(t){p.setData({quadrant4Text:f(t.text)})}function A(t){p.setData({xAxisLeftText:f(t.text)})}function _(t){p.setData({xAxisRightText:f(t.text)})}function b(t){p.setData({yAxisTopText:f(t.text)})}function S(t){p.setData({yAxisBottomText:f(t.text)})}function k(t){const e={};for(const i of t){const[t,a]=i.trim().split(/\s*:\s*/);if("radius"===t){if(u(a))throw new c(t,a,"number");e.radius=parseInt(a)}else if("color"===t){if(d(a))throw new c(t,a,"hex code");e.color=a}else if("stroke-color"===t){if(d(a))throw new c(t,a,"hex code");e.strokeColor=a}else{if("stroke-width"!==t)throw new Error(`style named ${t} is not supported.`);if(x(a))throw new c(t,a,"number of pixels (eg. 10px)");e.strokeWidth=a}}return e}function F(t,e,i,a,n){const s=k(n);p.addPoints([{x:i,y:a,text:f(t.text),className:e,...s}])}function P(t,e){p.addClass(t,k(e))}function C(t){p.setConfig({chartWidth:t})}function L(t){p.setConfig({chartHeight:t})}function v(){const t=(0,a.D7)(),{themeVariables:e,quadrantChart:i}=t;return i&&p.setConfig(i),p.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),p.setData({titleText:(0,a.ab)()}),p.build()}(0,n.K2)(y,"setQuadrant1Text"),(0,n.K2)(T,"setQuadrant2Text"),(0,n.K2)(m,"setQuadrant3Text"),(0,n.K2)(q,"setQuadrant4Text"),(0,n.K2)(A,"setXAxisLeftText"),(0,n.K2)(_,"setXAxisRightText"),(0,n.K2)(b,"setYAxisTopText"),(0,n.K2)(S,"setYAxisBottomText"),(0,n.K2)(k,"parseStyles"),(0,n.K2)(F,"addPoint"),(0,n.K2)(P,"addClass"),(0,n.K2)(C,"setWidth"),(0,n.K2)(L,"setHeight"),(0,n.K2)(v,"getQuadrantData");var I={parser:o,db:{setWidth:C,setHeight:L,setQuadrant1Text:y,setQuadrant2Text:T,setQuadrant3Text:m,setQuadrant4Text:q,setXAxisLeftText:A,setXAxisRightText:_,setYAxisTopText:b,setYAxisBottomText:S,parseStyles:k,addPoint:F,addClass:P,getQuadrantData:v,clear:(0,n.K2)((function(){p.clear(),(0,a.IU)()}),"clear"),setAccTitle:a.SV,getAccTitle:a.iN,setDiagramTitle:a.ke,getDiagramTitle:a.ab,getAccDescription:a.m7,setAccDescription:a.EI},renderer:{draw:(0,n.K2)(((t,e,i,r)=>{function o(t){return"top"===t?"hanging":"middle"}function l(t){return"left"===t?"start":"middle"}function h(t){return`translate(${t.x}, ${t.y}) rotate(${t.rotation||0})`}(0,n.K2)(o,"getDominantBaseLine"),(0,n.K2)(l,"getTextAnchor"),(0,n.K2)(h,"getTransformation");const c=(0,a.D7)();n.Rm.debug("Rendering quadrant chart\n"+t);const d=c.securityLevel;let u;"sandbox"===d&&(u=(0,s.Ltv)("#i"+e));const x=("sandbox"===d?(0,s.Ltv)(u.nodes()[0].contentDocument.body):(0,s.Ltv)("body")).select(`[id="${e}"]`),g=x.append("g").attr("class","main"),f=c.quadrantChart?.chartWidth??500,p=c.quadrantChart?.chartHeight??500;(0,a.a$)(x,p,f,c.quadrantChart?.useMaxWidth??!0),x.attr("viewBox","0 0 "+f+" "+p),r.db.setHeight(p),r.db.setWidth(f);const y=r.db.getQuadrantData(),T=g.append("g").attr("class","quadrants"),m=g.append("g").attr("class","border"),q=g.append("g").attr("class","data-points"),A=g.append("g").attr("class","labels"),_=g.append("g").attr("class","title");y.title&&_.append("text").attr("x",0).attr("y",0).attr("fill",y.title.fill).attr("font-size",y.title.fontSize).attr("dominant-baseline",o(y.title.horizontalPos)).attr("text-anchor",l(y.title.verticalPos)).attr("transform",h(y.title)).text(y.title.text),y.borderLines&&m.selectAll("line").data(y.borderLines).enter().append("line").attr("x1",(t=>t.x1)).attr("y1",(t=>t.y1)).attr("x2",(t=>t.x2)).attr("y2",(t=>t.y2)).style("stroke",(t=>t.strokeFill)).style("stroke-width",(t=>t.strokeWidth));const b=T.selectAll("g.quadrant").data(y.quadrants).enter().append("g").attr("class","quadrant");b.append("rect").attr("x",(t=>t.x)).attr("y",(t=>t.y)).attr("width",(t=>t.width)).attr("height",(t=>t.height)).attr("fill",(t=>t.fill)),b.append("text").attr("x",0).attr("y",0).attr("fill",(t=>t.text.fill)).attr("font-size",(t=>t.text.fontSize)).attr("dominant-baseline",(t=>o(t.text.horizontalPos))).attr("text-anchor",(t=>l(t.text.verticalPos))).attr("transform",(t=>h(t.text))).text((t=>t.text.text));A.selectAll("g.label").data(y.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text((t=>t.text)).attr("fill",(t=>t.fill)).attr("font-size",(t=>t.fontSize)).attr("dominant-baseline",(t=>o(t.horizontalPos))).attr("text-anchor",(t=>l(t.verticalPos))).attr("transform",(t=>h(t)));const S=q.selectAll("g.data-point").data(y.points).enter().append("g").attr("class","data-point");S.append("circle").attr("cx",(t=>t.x)).attr("cy",(t=>t.y)).attr("r",(t=>t.radius)).attr("fill",(t=>t.fill)).attr("stroke",(t=>t.strokeColor)).attr("stroke-width",(t=>t.strokeWidth)),S.append("text").attr("x",0).attr("y",0).text((t=>t.text.text)).attr("fill",(t=>t.text.fill)).attr("font-size",(t=>t.text.fontSize)).attr("dominant-baseline",(t=>o(t.text.horizontalPos))).attr("text-anchor",(t=>l(t.text.verticalPos))).attr("transform",(t=>h(t.text)))}),"draw")},styles:(0,n.K2)((()=>""),"styles")}}}]);
\ No newline at end of file
diff --git a/assets/js/133732ba.b191e4e7.js b/assets/js/133732ba.b191e4e7.js
new file mode 100644
index 00000000..7923dda6
--- /dev/null
+++ b/assets/js/133732ba.b191e4e7.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5489],{79990:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>d,metadata:()=>o,toc:()=>i});const o=JSON.parse('{"id":"API-Reference/command/KeyboardOverlayMode","title":"KeyboardOverlayMode","description":"Import :","source":"@site/api/API-Reference/command/KeyboardOverlayMode.md","sourceDirName":"API-Reference/command","slug":"/API-Reference/command/KeyboardOverlayMode","permalink":"/api/API-Reference/command/KeyboardOverlayMode","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{},"sidebar":"tutorialSidebar","previous":{"title":"KeyBindingManager","permalink":"/api/API-Reference/command/KeyBindingManager"},"next":{"title":"Keys","permalink":"/api/API-Reference/command/Keys"}}');var t=r(74848),a=r(28453);const d={},s=void 0,l={},i=[{value:"Import :",id:"import-",level:3},{value:"EditorManager",id:"editormanager",level:2},{value:"startOverlayMode()",id:"startoverlaymode",level:2},{value:"exitOverlayMode()",id:"exitoverlaymode",level:2},{value:"processOverlayKeyboardEvent(event)",id:"processoverlaykeyboardeventevent",level:2},{value:"isInOverlayMode() \u21d2 boolean",id:"isinoverlaymode--boolean",level:2}];function c(e){const n={br:"br",code:"code",h2:"h2",h3:"h3",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h3,{id:"import-",children:"Import :"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-js",children:'const KeyboardOverlayMode = brackets.getModule("command/KeyboardOverlayMode")\n'})}),"\n",(0,t.jsx)("a",{name:"EditorManager"}),"\n",(0,t.jsx)(n.h2,{id:"editormanager",children:"EditorManager"}),"\n",(0,t.jsx)(n.p,{children:"This handles the overlay mode"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Kind"}),": global constant"]}),"\n",(0,t.jsx)("a",{name:"startOverlayMode"}),"\n",(0,t.jsx)(n.h2,{id:"startoverlaymode",children:"startOverlayMode()"}),"\n",(0,t.jsx)(n.p,{children:"Responsible to start the overlay mode"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,t.jsx)("a",{name:"exitOverlayMode"}),"\n",(0,t.jsx)(n.h2,{id:"exitoverlaymode",children:"exitOverlayMode()"}),"\n",(0,t.jsx)(n.p,{children:"Responsible to exit the overlay mode.\nrestores focus to previously active pane"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,t.jsx)("a",{name:"processOverlayKeyboardEvent"}),"\n",(0,t.jsx)(n.h2,{id:"processoverlaykeyboardeventevent",children:"processOverlayKeyboardEvent(event)"}),"\n",(0,t.jsx)(n.p,{children:"Handles the keyboard navigation in overlay mode\nProcess the arrow keys to move between panes, Enter to select a pane, and Escape to exit overlay mode"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Kind"}),": global function"]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Param"}),(0,t.jsx)(n.th,{children:"Type"})]})}),(0,t.jsx)(n.tbody,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"event"}),(0,t.jsx)(n.td,{children:(0,t.jsx)("code",{children:"KeyboardEvent"})})]})})]}),"\n",(0,t.jsx)("a",{name:"isInOverlayMode"}),"\n",(0,t.jsxs)(n.h2,{id:"isinoverlaymode--boolean",children:["isInOverlayMode() \u21d2 ",(0,t.jsx)("code",{children:"boolean"})]}),"\n",(0,t.jsx)(n.p,{children:"to check whether in overlay mode or not"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Kind"}),": global function",(0,t.jsx)(n.br,{}),"\n",(0,t.jsx)(n.strong,{children:"Returns"}),": ",(0,t.jsx)("code",{children:"boolean"})," - returns true if in overlay mode otherwise false"]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(c,{...e})}):c(e)}},28453:(e,n,r)=>{r.d(n,{R:()=>d,x:()=>s});var o=r(96540);const t={},a=o.createContext(t);function d(e){const n=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/13ef489d.e01cda37.js b/assets/js/13ef489d.e01cda37.js
new file mode 100644
index 00000000..4347039d
--- /dev/null
+++ b/assets/js/13ef489d.e01cda37.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7185],{9010:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>v,frontMatter:()=>c,metadata:()=>n,toc:()=>p});const n=JSON.parse('{"id":"Live Preview/php-live-preview","title":"PHP Live Preview Setup","description":"Setting up Live Preview for PHP projects is straightforward with Apache and XAMPP. Below are the installation and configuration steps for each operating system:","source":"@site/docs/02-Live Preview/07-php-live-preview.md","sourceDirName":"02-Live Preview","slug":"/Features/Live Preview/php-live-preview","permalink":"/docs/Features/Live Preview/php-live-preview","draft":false,"unlisted":false,"editUrl":"https://github.com/phcode-dev/docs/blob/main/docs/02-Live Preview/07-php-live-preview.md","tags":[],"version":"current","sidebarPosition":7,"frontMatter":{"title":"PHP Live Preview Setup","slug":"/Features/Live Preview/php-live-preview"},"sidebar":"tutorialSidebar","previous":{"title":"Markdown Editor","permalink":"/docs/Pro Features/markdown-editor"},"next":{"title":"Custom Live Preview Server","permalink":"/docs/Features/Live Preview/live-preview-settings"}}');var i=r(74848),o=r(28453),a=(r(96540),r(56399)),s=r(11470),l=r(19365);const c={title:"PHP Live Preview Setup",slug:"/Features/Live Preview/php-live-preview"},u=void 0,d={},p=[{value:"Steps for Windows",id:"steps-for-windows",level:3},{value:"Steps for Linux",id:"steps-for-linux",level:3},{value:"Steps for macOS",id:"steps-for-macos",level:3},{value:"PHP Live Preview in Action",id:"php-live-preview-in-action",level:2}];function h(e){const t={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(t.p,{children:["Setting up Live Preview for PHP projects is straightforward with ",(0,i.jsx)(t.em,{children:"Apache"})," and ",(0,i.jsx)(t.em,{children:"XAMPP"}),". Below are the installation and configuration steps for each operating system:"]}),"\n",(0,i.jsxs)(s.A,{defaultValue:"windows",values:[{label:"Windows",value:"windows"},{label:"Linux",value:"linux"},{label:"macOS",value:"macos"}],children:[(0,i.jsxs)(l.A,{value:"windows",children:[(0,i.jsx)(t.h3,{id:"steps-for-windows",children:"Steps for Windows"}),(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Download and install XAMPP from ",(0,i.jsx)(t.a,{href:"https://www.apachefriends.org/",children:"Apache Friends"}),"."]}),"\n",(0,i.jsx)(t.li,{children:"Open the XAMPP Control Panel."}),"\n",(0,i.jsxs)(t.li,{children:["Modify the ",(0,i.jsx)(t.code,{children:"httpd.conf"})," file located at ",(0,i.jsx)(t.code,{children:"C:\\xampp\\apache\\conf\\httpd.conf"}),":","\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:'DocumentRoot "C:/path/to/your/project"\n\n\n'})}),"\n"]}),"\n",(0,i.jsx)(t.li,{children:"Save the updated configuration."}),"\n",(0,i.jsx)(t.li,{children:"Restart the Apache server through the XAMPP Control Panel."}),"\n"]})]}),(0,i.jsxs)(l.A,{value:"linux",children:[(0,i.jsx)(t.h3,{id:"steps-for-linux",children:"Steps for Linux"}),(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Download and install XAMPP from ",(0,i.jsx)(t.a,{href:"https://www.apachefriends.org/",children:"Apache Friends"}),"."]}),"\n",(0,i.jsxs)(t.li,{children:["Open the XAMPP Control Panel by running ",(0,i.jsx)(t.code,{children:"sudo /opt/lampp/lampp start"})," in your terminal."]}),"\n",(0,i.jsxs)(t.li,{children:["Modify the ",(0,i.jsx)(t.code,{children:"httpd.conf"})," file located at ",(0,i.jsx)(t.code,{children:"/opt/lampp/etc/httpd.conf"}),":","\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:'DocumentRoot "/path/to/your/project"\n\n\n'})}),"\n"]}),"\n",(0,i.jsx)(t.li,{children:"Save the updated configuration."}),"\n",(0,i.jsx)(t.li,{children:"Restart the Apache server through the XAMPP Control Panel."}),"\n"]})]}),(0,i.jsxs)(l.A,{value:"macos",children:[(0,i.jsx)(t.h3,{id:"steps-for-macos",children:"Steps for macOS"}),(0,i.jsxs)(t.ol,{children:["\n",(0,i.jsxs)(t.li,{children:["Download and install XAMPP from ",(0,i.jsx)(t.a,{href:"https://www.apachefriends.org/",children:"Apache Friends"}),"."]}),"\n",(0,i.jsx)(t.li,{children:"Open the XAMPP manager from your Applications folder."}),"\n",(0,i.jsxs)(t.li,{children:["Modify the ",(0,i.jsx)(t.code,{children:"httpd.conf"})," file located at ",(0,i.jsx)(t.code,{children:"/Applications/XAMPP/xamppfiles/etc/httpd.conf"}),":","\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{children:'DocumentRoot "/path/to/your/project"\n\n\n'})}),"\n"]}),"\n",(0,i.jsx)(t.li,{children:"Save the updated configuration."}),"\n",(0,i.jsx)(t.li,{children:"Restart the Apache server through the XAMPP Control Panel."}),"\n"]})]})]}),"\n",(0,i.jsxs)(t.ol,{start:"6",children:["\n",(0,i.jsxs)(t.li,{children:["Add the following settings to your custom Live Preview:\n",(0,i.jsx)(t.img,{alt:"Custom Live Preview Settings",src:r(2692).A+"",width:"1368",height:"932"}),"\nYour Live Preview should now automatically update to reflect changes whenever PHP files are edited."]}),"\n"]}),"\n",(0,i.jsx)(t.h2,{id:"php-live-preview-in-action",children:"PHP Live Preview in Action"}),"\n",(0,i.jsx)(a.A,{src:"https://docs-images.phcode.dev/videos/phplp/phplivepreview.mp4"})]})}function v(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},19365:(e,t,r)=>{r.d(t,{A:()=>a});r(96540);var n=r(34164);const i={tabItem:"tabItem_Ymn6"};var o=r(74848);function a({children:e,hidden:t,className:r}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,n.A)(i.tabItem,r),hidden:t,children:e})}},11470:(e,t,r)=>{r.d(t,{A:()=>y});var n=r(96540),i=r(34164),o=r(17559),a=r(23104),s=r(56347),l=r(205),c=r(57485),u=r(31682),d=r(70679);function p(e){return n.Children.toArray(e).filter((e=>"\n"!==e)).map((e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)}))?.filter(Boolean)??[]}function h(e){const{values:t,children:r}=e;return(0,n.useMemo)((()=>{const e=t??function(e){return p(e).map((({props:{value:e,label:t,attributes:r,default:n}})=>({value:e,label:t,attributes:r,default:n})))}(r);return function(e){const t=(0,u.XI)(e,((e,t)=>e.value===t.value));if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map((e=>e.value)).join(", ")}" found in . Every value needs to be unique.`)}(e),e}),[t,r])}function v({value:e,tabValues:t}){return t.some((t=>t.value===e))}function f({queryString:e=!1,groupId:t}){const r=(0,s.W6)(),i=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,c.aZ)(i),(0,n.useCallback)((e=>{if(!i)return;const t=new URLSearchParams(r.location.search);t.set(i,e),r.replace({...r.location,search:t.toString()})}),[i,r])]}function m(e){const{defaultValue:t,queryString:r=!1,groupId:i}=e,o=h(e),[a,s]=(0,n.useState)((()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!v({value:e,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map((e=>e.value)).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=t.find((e=>e.default))??t[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:t,tabValues:o}))),[c,u]=f({queryString:r,groupId:i}),[p,m]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,i]=(0,d.Dv)(t);return[r,(0,n.useCallback)((e=>{t&&i.set(e)}),[t,i])]}({groupId:i}),w=(()=>{const e=c??p;return v({value:e,tabValues:o})?e:null})();(0,l.A)((()=>{w&&s(w)}),[w]);return{selectedValue:a,selectValue:(0,n.useCallback)((e=>{if(!v({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),m(e)}),[u,m,o]),tabValues:o}}var w=r(92303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=r(74848);function j({className:e,block:t,selectedValue:r,selectValue:n,tabValues:o}){const s=[],{blockElementScrollPositionUntilNextRender:l}=(0,a.a_)(),c=e=>{const t=e.currentTarget,i=s.indexOf(t),a=o[i].value;a!==r&&(l(t),n(a))},u=e=>{let t=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=s.indexOf(e.currentTarget)+1;t=s[r]??s[0];break}case"ArrowLeft":{const r=s.indexOf(e.currentTarget)-1;t=s[r]??s[s.length-1];break}}t?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,i.A)("tabs",{"tabs--block":t},e),children:o.map((({value:e,label:t,attributes:n})=>(0,b.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{s.push(e)},onKeyDown:u,onClick:c,...n,className:(0,i.A)("tabs__item",x.tabItem,n?.className,{"tabs__item--active":r===e}),children:t??e},e)))})}function g({lazy:e,children:t,selectedValue:r}){const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=o.find((e=>e.props.value===r));return e?(0,n.cloneElement)(e,{className:(0,i.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:o.map(((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==r})))})}function P(e){const t=m(e);return(0,b.jsxs)("div",{className:(0,i.A)(o.G.tabs.container,"tabs-container",x.tabList),children:[(0,b.jsx)(j,{...t,...e}),(0,b.jsx)(g,{...t,...e})]})}function y(e){const t=(0,w.A)();return(0,b.jsx)(P,{...e,children:p(e.children)},String(t))}},56399:(e,t,r)=>{r.d(t,{A:()=>o});var n=r(96540),i=r(74848);const o=({src:e,winLinuxTitle:t,macTitle:r})=>{const[o,a]=(0,n.useState)("");(0,n.useEffect)((()=>{navigator.platform.toLowerCase().includes("mac")?a(r):a(t)}),[t,r]);return(0,i.jsxs)("div",{style:{maxHeight:"68vh",width:"100%",display:"flex",justifyContent:"center",alignItems:"center",flexDirection:"column"},children:[(0,i.jsxs)("video",{style:{height:"90%",width:"100%"},controls:!0,autoPlay:!0,muted:!0,loop:!0,children:[(0,i.jsx)("source",{src:e,type:"video/mp4"}),"Your browser does not support the video tag."]}),(0,i.jsx)("div",{style:{width:"100%",textAlign:"center",fontSize:"1em",marginTop:"10px"},children:o})]})}},2692:(e,t,r)=>{r.d(t,{A:()=>n});const n=r.p+"assets/images/phpCustomServer-23ae891bea40924e86bafd7273ac64b3.png"},28453:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>s});var n=r(96540);const i={},o=n.createContext(i);function a(e){const t=n.useContext(o);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]);
\ No newline at end of file
diff --git a/assets/js/152e41eb.72bc1f42.js b/assets/js/152e41eb.72bc1f42.js
new file mode 100644
index 00000000..dddbae15
--- /dev/null
+++ b/assets/js/152e41eb.72bc1f42.js
@@ -0,0 +1 @@
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4414],{11928:a=>{a.exports=JSON.parse('{"tag":{"label":"Claude Code","permalink":"/blog/tags/claude-code","allTagsPath":"/blog/tags","count":1,"unlisted":false},"listMetadata":{"permalink":"/blog/tags/claude-code","page":1,"postsPerPage":10,"totalPages":1,"totalCount":1,"blogDescription":"Blog","blogTitle":"Blog"}}')}}]);
\ No newline at end of file
diff --git a/assets/js/165.48c76e4e.js b/assets/js/165.48c76e4e.js
new file mode 100644
index 00000000..615fa3da
--- /dev/null
+++ b/assets/js/165.48c76e4e.js
@@ -0,0 +1,2 @@
+/*! For license information please see 165.48c76e4e.js.LICENSE.txt */
+"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[165],{90165:(e,t,n)=>{function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,i=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw i}}}}function s(e,t,n){return(t=c(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,s=[],l=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return s}}(e,t)||h(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||h(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==typeof t?t:t+""}function d(e){return d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},d(e)}function h(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}n.d(t,{A:()=>Hh});var f="undefined"==typeof window?null:window,p=f?f.navigator:null;f&&f.document;var v,g,y,m,b,x,w,E,k,T,C,P,S,B,D,_,A,M,R,I,N,L,z,O,V,F,X,j,Y=d(""),q=d({}),W=d((function(){})),U="undefined"==typeof HTMLElement?"undefined":d(HTMLElement),H=function(e){return e&&e.instanceString&&G(e.instanceString)?e.instanceString():null},K=function(e){return null!=e&&d(e)==Y},G=function(e){return null!=e&&d(e)===W},Z=function(e){return!ee(e)&&(Array.isArray?Array.isArray(e):null!=e&&e instanceof Array)},$=function(e){return null!=e&&d(e)===q&&!Z(e)&&e.constructor===Object},Q=function(e){return null!=e&&d(e)===d(1)&&!isNaN(e)},J=function(e){return"undefined"===U?void 0:null!=e&&e instanceof HTMLElement},ee=function(e){return te(e)||ne(e)},te=function(e){return"collection"===H(e)&&e._private.single},ne=function(e){return"collection"===H(e)&&!e._private.single},re=function(e){return"core"===H(e)},ae=function(e){return"stylesheet"===H(e)},ie=function(e){return null==e||!(""!==e&&!e.match(/^\s+$/))},oe=function(e){return function(e){return null!=e&&d(e)===q}(e)&&G(e.then)},se=function(e,t){t||(t=function(){if(1===arguments.length)return arguments[0];if(0===arguments.length)return"undefined";for(var e=[],t=0;tt?1:0},be=null!=Object.assign?Object.assign.bind(Object):function(e){for(var t=arguments,n=1;n255)return;t.push(Math.floor(i))}var o=r[1]||r[2]||r[3],s=r[1]&&r[2]&&r[3];if(o&&!s)return;var l=n[4];if(void 0!==l){if((l=parseFloat(l))<0||l>1)return;t.push(l)}}return t}(e)||function(e){var t,n,r,a,i,o,s,l;function u(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var c=new RegExp("^"+ge+"$").exec(e);if(c){if((n=parseInt(c[1]))<0?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,(r=parseFloat(c[2]))<0||r>100)return;if(r/=100,(a=parseFloat(c[3]))<0||a>100)return;if(a/=100,void 0!==(i=c[4])&&((i=parseFloat(i))<0||i>1))return;if(0===r)o=s=l=Math.round(255*a);else{var d=a<.5?a*(1+r):a+r-a*r,h=2*a-d;o=Math.round(255*u(h,d,n+1/3)),s=Math.round(255*u(h,d,n)),l=Math.round(255*u(h,d,n-1/3))}t=[o,s,l,i]}return t}(e)},we={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Ee=function(e){for(var t=e.map,n=e.keys,r=n.length,a=0;a=o||t<0||g&&e-p>=c}function x(){var e=t();if(b(e))return w(e);h=setTimeout(x,function(e){var t=o-(e-f);return g?a(t,c-(e-p)):t}(e))}function w(e){return h=void 0,y&&l?m(e):(l=u=void 0,d)}function E(){var e=t(),n=b(e);if(l=arguments,u=this,f=e,n){if(void 0===h)return function(e){return p=e,h=setTimeout(x,o),v?m(e):d}(f);if(g)return clearTimeout(h),h=setTimeout(x,o),m(f)}return void 0===h&&(h=setTimeout(x,o)),d}return o=n(o)||0,e(s)&&(v=!!s.leading,c=(g="maxWait"in s)?r(n(s.maxWait)||0,o):c,y="trailing"in s?!!s.trailing:y),E.cancel=function(){void 0!==h&&clearTimeout(h),p=0,l=f=u=h=void 0},E.flush=function(){return void 0===h?d:w(t())},E}}()),Re=f?f.performance:null,Ie=Re&&Re.now?function(){return Re.now()}:function(){return Date.now()},Ne=function(){if(f){if(f.requestAnimationFrame)return function(e){f.requestAnimationFrame(e)};if(f.mozRequestAnimationFrame)return function(e){f.mozRequestAnimationFrame(e)};if(f.webkitRequestAnimationFrame)return function(e){f.webkitRequestAnimationFrame(e)};if(f.msRequestAnimationFrame)return function(e){f.msRequestAnimationFrame(e)}}return function(e){e&&setTimeout((function(){e(Ie())}),1e3/60)}}(),Le=function(e){return Ne(e)},ze=Ie,Oe=9261,Ve=5381,Fe=function(e){for(var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Oe;!(t=e.next()).done;)n=65599*n+t.value|0;return n},Xe=function(e){return 65599*(arguments.length>1&&void 0!==arguments[1]?arguments[1]:Oe)+e|0},je=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Ve;return(t<<5)+t+e|0},Ye=function(e){return 2097152*e[0]+e[1]},qe=function(e,t){return[Xe(e[0],t[0]),je(e[1],t[1])]},We=function(e,t){var n={value:0,done:!1},r=0,a=e.length;return Fe({next:function(){return r=0;r--)e[r]===t&&e.splice(r,1)},ft=function(e){e.splice(0,e.length)},pt=function(e,t,n){return n&&(t=ce(n,t)),e[t]},vt=function(e,t,n,r){n&&(t=ce(n,t)),e[t]=r},gt="undefined"!=typeof Map?Map:function(){return i((function e(){a(this,e),this._obj={}}),[{key:"set",value:function(e,t){return this._obj[e]=t,this}},{key:"delete",value:function(e){return this._obj[e]=void 0,this}},{key:"clear",value:function(){this._obj={}}},{key:"has",value:function(e){return void 0!==this._obj[e]}},{key:"get",value:function(e){return this._obj[e]}}])}(),yt=function(){return i((function e(t){if(a(this,e),this._obj=Object.create(null),this.size=0,null!=t){var n;n=null!=t.instanceString&&t.instanceString()===this.instanceString()?t.toArray():t;for(var r=0;r2&&void 0!==arguments[2])||arguments[2];if(void 0!==e&&void 0!==t&&re(e)){var r=t.group;if(null==r&&(r=t.data&&null!=t.data.source&&null!=t.data.target?"edges":"nodes"),"nodes"===r||"edges"===r){this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:t.data||{},position:t.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:r,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:void 0===t.selectable||!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:void 0===t.grabbable||!!t.grabbable,pannable:void 0===t.pannable?"edges"===r:!!t.pannable,active:!1,classes:new mt,animation:{current:[],queue:[]},rscratch:{},scratch:t.scratch||{},edges:[],children:[],parent:t.parent&&t.parent.isNode()?t.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(null==a.position.x&&(a.position.x=0),null==a.position.y&&(a.position.y=0),t.renderedPosition){var i=t.renderedPosition,o=e.pan(),s=e.zoom();a.position={x:(i.x-o.x)/s,y:(i.y-o.y)/s}}var l=[];Z(t.classes)?l=t.classes:K(t.classes)&&(l=t.classes.split(/\s+/));for(var u=0,c=l.length;ut?1:0},u=function(e,t,a,i,o){var s;if(null==a&&(a=0),null==o&&(o=n),a<0)throw new Error("lo must be non-negative");for(null==i&&(i=e.length);an;0<=n?t++:t--)u.push(t);return u}.apply(this).reverse()).length;iv;0<=v?++h:--h)g.push(i(e,r));return g},p=function(e,t,r,a){var i,o,s;for(null==a&&(a=n),i=e[r];r>t&&a(i,o=e[s=r-1>>1])<0;)e[r]=o,r=s;return e[r]=i},v=function(e,t,r){var a,i,o,s,l;for(null==r&&(r=n),i=e.length,l=t,o=e[t],a=2*t+1;a0;){var w=y.pop(),E=v(w),k=w.id();if(d[k]=E,E!==1/0)for(var T=w.neighborhood().intersect(f),C=0;C0)for(n.unshift(t);c[a];){var i=c[a];n.unshift(i.edge),n.unshift(i.node),a=(r=i.node).id()}return o.spawn(n)}}}},Mt={kruskal:function(e){e=e||function(e){return 1};for(var t=this.byGroup(),n=t.nodes,r=t.edges,a=n.length,i=new Array(a),o=n,s=function(e){for(var t=0;t0;){if(l=v.pop(),u=l.id(),g.delete(u),w++,u===d){for(var E=[],k=a,T=d,C=m[T];E.unshift(k),null!=C&&E.unshift(C),null!=(k=y[T]);)C=m[T=k.id()];return{found:!0,distance:h[u],path:this.spawn(E),steps:w}}p[u]=!0;for(var P=l._private.edges,S=0;SP&&(f[C]=P,y[C]=T,m[C]=x),!a){var S=T*u+k;!a&&f[S]>P&&(f[S]=P,y[S]=k,m[S]=x)}}}for(var B=0;B1&&void 0!==arguments[1]?arguments[1]:i,r=[],a=m(e);;){if(null==a)return t.spawn();var o=y(a),l=o.edge,u=o.pred;if(r.unshift(a[0]),a.same(n)&&r.length>0)break;null!=l&&r.unshift(l),a=u}return s.spawn(r)},hasNegativeWeightCycle:p,negativeWeightCycles:v}}},Vt=Math.sqrt(2),Ft=function(e,t,n){0===n.length&&at("Karger-Stein must be run on a connected (sub)graph");for(var r=n[e],a=r[1],i=r[2],o=t[a],s=t[i],l=n,u=l.length-1;u>=0;u--){var c=l[u],d=c[1],h=c[2];(t[d]===o&&t[h]===s||t[d]===s&&t[h]===o)&&l.splice(u,1)}for(var f=0;fr;){var a=Math.floor(Math.random()*t.length);t=Ft(a,e,t),n--}return t},jt={kargerStein:function(){var e=this,t=this.byGroup(),n=t.nodes,r=t.edges;r.unmergeBy((function(e){return e.isLoop()}));var a=n.length,i=r.length,o=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),s=Math.floor(a/Vt);if(!(a<2)){for(var l=[],u=0;u0?1:e<0?-1:0},Gt=function(e,t){return Math.sqrt(Zt(e,t))},Zt=function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},$t=function(e){for(var t=e.length,n=0,r=0;r=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},nn=function(e,t,n){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},rn=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},an=function(e){var t,n,r,a,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0];if(1===i.length)t=n=r=a=i[0];else if(2===i.length)t=r=i[0],a=n=i[1];else if(4===i.length){var o=l(i,4);t=o[0],n=o[1],r=o[2],a=o[3]}return e.x1-=a,e.x2+=n,e.y1-=t,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},on=function(e,t){e.x1=t.x1,e.y1=t.y1,e.x2=t.x2,e.y2=t.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},sn=function(e,t){return!(e.x1>t.x2)&&(!(t.x1>e.x2)&&(!(e.x2t.y2)&&!(t.y1>e.y2)))))))},ln=function(e,t,n){return e.x1<=t&&t<=e.x2&&e.y1<=n&&n<=e.y2},un=function(e,t){return ln(e,t.x,t.y)},cn=function(e,t){return ln(e,t.x1,t.y1)&&ln(e,t.x2,t.y2)},dn=null!==(Bt=Math.hypot)&&void 0!==Bt?Bt:function(e,t){return Math.sqrt(e*e+t*t)};function hn(e,t,n,r,a,i){var o=function(e,t){if(e.length<3)throw new Error("Need at least 3 vertices");var n=function(e,t){return{x:e.x+t.x,y:e.y+t.y}},r=function(e,t){return{x:e.x-t.x,y:e.y-t.y}},a=function(e,t){return{x:e.x*t,y:e.y*t}},i=function(e,t){return e.x*t.y-e.y*t.x},o=function(e,t,o,s){var l=r(t,e),u=r(s,o),c=i(l,u);if(Math.abs(c)<1e-9)return n(e,a(l,.5));var d=i(r(o,e),u)/c;return n(e,a(l,d))},s=e.map((function(e){return{x:e.x,y:e.y}}));(function(e){for(var t=0,n=0;n7&&void 0!==arguments[7]?arguments[7]:"auto",c="auto"===u?Mn(a,i):u,d=a/2,h=i/2,f=(c=Math.min(c,d,h))!==d,p=c!==h;if(f){var v=r-h-o;if((s=Cn(e,t,n,r,n-d+c-o,v,n+d-c+o,v,!1)).length>0)return s}if(p){var g=n+d+o;if((s=Cn(e,t,n,r,g,r-h+c-o,g,r+h-c+o,!1)).length>0)return s}if(f){var y=r+h+o;if((s=Cn(e,t,n,r,n-d+c-o,y,n+d-c+o,y,!1)).length>0)return s}if(p){var m=n-d-o;if((s=Cn(e,t,n,r,m,r-h+c-o,m,r+h-c+o,!1)).length>0)return s}var b=n-d+c,x=r-h+c;if((l=kn(e,t,n,r,b,x,c+o)).length>0&&l[0]<=b&&l[1]<=x)return[l[0],l[1]];var w=n+d-c,E=r-h+c;if((l=kn(e,t,n,r,w,E,c+o)).length>0&&l[0]>=w&&l[1]<=E)return[l[0],l[1]];var k=n+d-c,T=r+h-c;if((l=kn(e,t,n,r,k,T,c+o)).length>0&&l[0]>=k&&l[1]>=T)return[l[0],l[1]];var C=n-d+c,P=r+h-c;return(l=kn(e,t,n,r,C,P,c+o)).length>0&&l[0]<=C&&l[1]>=P?[l[0],l[1]]:[]},pn=function(e,t,n,r,a,i,o){var s=o,l=Math.min(n,a),u=Math.max(n,a),c=Math.min(r,i),d=Math.max(r,i);return l-s<=e&&e<=u+s&&c-s<=t&&t<=d+s},vn=function(e,t,n,r,a,i,o,s,l){var u=Math.min(n,o,a)-l,c=Math.max(n,o,a)+l,d=Math.min(r,s,i)-l,h=Math.max(r,s,i)+l;return!(ec||th)},gn=function(e,t,n,r,a,i,o,s){var l=[];!function(e,t,n,r,a){var i,o,s,l,u,c,d,h;0===e&&(e=1e-5),s=-27*(r/=e)+(t/=e)*(9*(n/=e)-t*t*2),i=(o=(3*n-t*t)/9)*o*o+(s/=54)*s,a[1]=0,d=t/3,i>0?(u=(u=s+Math.sqrt(i))<0?-Math.pow(-u,1/3):Math.pow(u,1/3),c=(c=s-Math.sqrt(i))<0?-Math.pow(-c,1/3):Math.pow(c,1/3),a[0]=-d+u+c,d+=(u+c)/2,a[4]=a[2]=-d,d=Math.sqrt(3)*(-c+u)/2,a[3]=d,a[5]=-d):(a[5]=a[3]=0,0===i?(h=s<0?-Math.pow(-s,1/3):Math.pow(s,1/3),a[0]=2*h-d,a[4]=a[2]=-(h+d)):(l=(o=-o)*o*o,l=Math.acos(s/Math.sqrt(l)),h=2*Math.sqrt(o),a[0]=-d+h*Math.cos(l/3),a[2]=-d+h*Math.cos((l+2*Math.PI)/3),a[4]=-d+h*Math.cos((l+4*Math.PI)/3)))}(1*n*n-4*n*a+2*n*o+4*a*a-4*a*o+o*o+r*r-4*r*i+2*r*s+4*i*i-4*i*s+s*s,9*n*a-3*n*n-3*n*o-6*a*a+3*a*o+9*r*i-3*r*r-3*r*s-6*i*i+3*i*s,3*n*n-6*n*a+n*o-n*e+2*a*a+2*a*e-o*e+3*r*r-6*r*i+r*s-r*t+2*i*i+2*i*t-s*t,1*n*a-n*n+n*e-a*e+r*i-r*r+r*t-i*t,l);for(var u=[],c=0;c<6;c+=2)Math.abs(l[c+1])<1e-7&&l[c]>=0&&l[c]<=1&&u.push(l[c]);u.push(1),u.push(0);for(var d,h,f,p=-1,v=0;v=0?f