From 8b7ed8c1c53a8b10a3bdcc2a505944b1efbc7b7f Mon Sep 17 00:00:00 2001 From: u239230 Date: Mon, 17 Nov 2025 13:44:58 +0100 Subject: [PATCH 1/4] feat: Data Center support, visual fidelity upgrade, and offline navigation Major refactoring to support Confluence Data Center and improve export quality. Key Changes: - **Platform Support:** Added support for Confluence Data Center using Personal Access Tokens (PAT), including VPN/Intranet connectivity checks and specific error messages. - **Visual Fidelity:** Switched API retrieval from `storage` to `export_view` format to correctly render macros, emoticons, and layouts. - **Offline Capability:** Integrated `BeautifulSoup` to parse HTML, download embedded images/attachments, and rewrite internal links to relative local paths. - **Styling:** Implemented a two-layer CSS strategy (Standard + Custom) and automatic CSS discovery. - **Navigation:** Added automatic generation of a global `index.html` for easier navigation of the exported structure. - **UX:** Added `tqdm` for progress tracking and improved output directory management (timestamped folders). - **Configuration:** Externalized platform-specific API paths to `confluence_products.ini`. Fixes authentication issues and ensures robust handling of pages that cannot be downloaded. --- .idea/.gitignore | 8 + CHANGELOG.md | 122 + CONTRIBUTING.md | 76 + README.md | 215 +- confluenceDumpWithPython.py | 724 ++- confluence_dump/myModules.py | 764 ++- confluence_products.ini | 27 + requirements.txt | 3 +- styles/site.css | 10242 +++++++++++++++++++++++++++++++++ 9 files changed, 11376 insertions(+), 805 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 confluence_products.ini create mode 100644 styles/site.css diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3ff6d3a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,122 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://www.google.com/search?q=https://keepachangelom.com/en/1.0.0/ "null"), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html "null"). + +# Changelog + +## \[2.1.0\] - 2025-11-19 + +Major functionality restore and improvement ("Visual Copy" release). + +### Added + +- **HTML Processing with BeautifulSoup:** + + - Re-introduced intelligent HTML parsing. + + - **Image Downloading:** Automatically detects embedded images/emoticons, downloads them, and rewrites HTML links to local paths (`../attachments/`). + + - **Link Sanitizing:** Attempts to rewrite Confluence internal links. + + - **Metadata Injection:** Injects Title, Page ID, and Labels into the HTML ``. + +- **Export View:** Switched API fetch from `storage` format to `export_view` (or `view`) to get rendered HTML (resolves macros like TOC). + +- **Attachment Downloading:** Downloads _all_ attachments of a page, not just those embedded in the text. + + +### Changed + +- **HTML is now the primary output:** The script always generates a standalone, browsable `.html` file linked to the CSS. + +- **Dependencies:** Added `beautifulsoup4` to requirements. + +- **CSS handling:** Improved relative pathing for robust offline viewing. + +## \[2.0.0\] - 2025-11-17 + +This version introduces a major architectural refactoring to support both Confluence Cloud and Data Center, and replaces the CLI mode logic with a robust sub-command architecture. All original functionality (all modes, all formats) is preserved and extended. + +### Added + +- **Confluence Data Center Support:** The script now supports both Confluence Cloud (`--profile cloud`) and Data Center (`--profile dc`). + +- **Configuration File (`confluence_products.ini`):** All platform-specific values (API URL templates, auth methods, base paths) are now defined in this external INI file. + +- **Data Center Authentication:** Added support for Bearer Token (Personal Access Token) authentication. + +- **New `label` Command:** Added support for dumping all pages with a specific label via the `label` sub-command (previously missing from refactoring). + +- **Custom CSS Support:** Added `--css-file` argument to supply a custom CSS stylesheet, ensuring properly styled HTML exports. + +- **Troubleshooting Hints:** Added specific error messages for Data Center users when authentication fails (Intranet/VPN warning). + +- **`CONTRIBUTING.md`:** A new file explaining the new architecture. + +- **`CHANGELOG.md`:** This file. + + +### Changed + +- **\[BREAKING CHANGE\] CLI Architecture (Sub-Commands):** The script's interface has been completely modernized, replacing the `-m`/`--mode` flag with sub-commands (like `git`). + + - **REMOVED:** The `-m`/`--mode` flag. + + - **REMOVED:** The `-s`/`--site` argument. + + - **ADDED:** Sub-commands: `single`, `tree`, `space`, `all-spaces`, and `label` to select the mode. + + - **CHANGED:** The `-p`/`--pageid` and `-sp`/`--space-key` (formerly `--space`) arguments are now context-specific arguments for their respective commands (e.g., `single --pageid ...`). + + - **ADDED (Global, Required):** `--base-url` argument for the instance URL. + + - **ADDED (Global, Required):** `--profile` argument to select 'cloud' or 'dc'. + + - **ADDED (Global, Optional):** `--context-path` argument for Data Center. + + - **PRESERVED (Global):** `-o`/`--outdir`, `-H`/`--html`, `-R`/`--rst` are now global options. + +- **Refactored `myModules.py`:** + + - All API functions (e.g., `get_page_full`) are now platform-agnostic, driven by the `.ini` file. + + - All hardcoded URLs (e.g., `.atlassian.net`) have been removed. + + - Added helper functions (`_build_api_url`, `_execute_get_request`, `load_platform_config`, `get_auth_config`). + + - Added `get_pages_by_label` to support label-based dumping. + + - Improved directory creation logic (`setup_output_directories`) to be robust against re-runs. + +- **Refactored `confluenceDumpWithPython.py`:** + + - Re-implemented all modes (`single`, `tree`, `space`, `all-spaces`, `label`) using the new sub-command architecture. + + - Preserved all original output logic (JSON, HTML, RST). + + - Improved HTML generation: now produces standalone HTML files linked to a custom CSS stylesheet if provided. + + - Replaced `if/elif` "spaghetti code" with clean, dedicated handler functions for each mode. + +- **Updated `README.md`:** The README now reflects the new sub-command architecture, provides examples for all major use cases, documents the `--css-file` option, and includes a troubleshooting section for Data Center VPN issues. + +- **Internationalization:** All code comments, docstrings, and user-facing error messages have been translated to English. + + +_History below this line is from the original author (jgoldin-skillz)._ + +## \[1.0.2\] - 2022-03-03 + +- Bugfixes + + +## \[1.0.1\] - 2022-03-03 + +- Added `confluenceDumpWithPython.py` + + +## \[1.0.0\] - 2022-03-01 + +- Initial version \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..17875ac --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,76 @@ +# Contributing Guide + +This document explains the internal architecture of this script, primarily for future contributors or the original author when reviewing pull requests. + +## Refactoring Goal + +The main goal of the 2024 refactoring was to decouple the script from a specific Confluence platform (Confluence Cloud) and enable robust support for **Confluence Data Center (DC)**. + +The original code had hardcoded URLs (e.g., `f"https://{site}.atlassian.net/wiki/..."`) which made it impossible to use with self-hosted instances. + +## Core Architecture: `confluence_products.ini` + +The core of this new architecture is the `confluence_products.ini` file. + +This file acts as a **platform definition file**. It defines _how_ to talk to a specific platform, not _which_ instance to talk to. + +It contains profiles (e.g., `[cloud]`, `[dc]`) that specify two key things: + +1. `auth_method`: The authentication required (e.g., `basic_api_token` for Cloud, `bearer_pat` for DC). + +2. **URL Templates**: A list of API and view paths for all required functions (e.g., `url_get_page`, `url_view_page`). + + +This approach allows the main script logic to be completely platform-agnostic. + +## How It Works: The Data Flow + +1. The main script (`confluenceDumpWithPython.py`) no longer accepts a "site" name. It now requires the user to specify: + + - `--profile "cloud"`: Selects the `[cloud]` section from the `.ini`. + + - `--base-url "https://myteam.atlassian.net"`: Provides the specific instance URL. + +2. At startup, the script calls `myModules.load_platform_config(profile)` to load all URL templates and settings for the chosen profile into a `platform_config` dictionary. + +3. It then calls `myModules.get_auth_config(platform_config)` to get the correct `requests` auth object or header (based on `auth_method` and environment variables). + +4. All API functions in `myModules.py` (e.g., `get_page_full`) are no longer hardcoded. They now receive the `base_url`, `platform_config`, and `auth_info` as arguments. + +5. Inside `myModules.py`, a helper function (`_build_api_url`) dynamically constructs the correct, full URL by combining the `base_url`, the `context_path` (for DC), and the appropriate URL template from the `platform_config` dictionary. + + +## How to Add a New Feature (e.g., "Add Comment") + +If you want to add a new function that calls a new API endpoint, the process is simple and clean: + +1. **Add Templates to `.ini`**: Open `confluence_products.ini` and add the new URL template to _both_ profiles: + + ``` + [cloud] + ... + url_add_comment = /rest/api/content/{pageId}/child/comment + + [dc] + ... + url_add_comment = {context_path}/rest/api/content/{pageId}/child/comment + ``` + +2. **Add Function to `myModules.py`**: Create your new function (e.g., `add_comment`). Inside it, use the new config key by calling the internal helpers: + + ``` + def add_comment(pageId, comment_body, base_url, platform_config, auth_info, context_path_override): + path_params = {'pageId': pageId} + url = _build_api_url( + base_url, + platform_config, + context_path_override, + 'url_add_comment', # This key must match the .ini + path_params + ) + + payload = {"body": {"storage": {"value": comment_body, "representation": "storage"}}} + + # Use _execute_post_request (or similar) + # ... + ``` \ No newline at end of file diff --git a/README.md b/README.md index 207040a..51ed0cf 100644 --- a/README.md +++ b/README.md @@ -1,142 +1,145 @@ -# Confluence Dump With Python - -Dump Confluence pages using Python (requests) in HTML and RST format, including embedded pictures and attachments. -References to downloaded files will be updated to their local relative path. - -## Description - -Nonetheless, the refactoring will require only 2 files and accept command-line args: -* `myModules.py`: Contains all the required functions. -* `confluenceDumpWithPython.py`: Script to use with the following command line args: - * `-m, --mode`: The export mode, `single`, `space`, `bylabel`, `pageprops` (required). - * Note: Only `single`, `pageprops` and `space` have been implemented so far. - * `-S, --site`: The Atlassian Site (required). - * `-s, --space`: The Space Key (if needed). - * `-p, --page`: The Page ID (if needed). - * `-l, --label`: The Page label (if needed). - * `-x, --sphinx`: The `_images` and `_static` folders are placed at the root of the export folder, instead of together with the exported HTML files. - * `--notags`: Does not add the tags directives to the rst files (when the `sphinx-tags` addon is not used). -* `updatePageLinks.py`: Update online confluence links to the local files that have been downloaded so far. - * `--folder`: Folder containing the files to update. - * `--test`: Instead of overwriting the original .rst files, it will create updated ones with `zout_` as a prefix. -* `getPageEditorVersion.py`: Get the editor version from single pages or all pages in a space. - * `--site`: The Atlassian Site (required). - * `--page`: Page ID (either/or) - * `--space`: Space Key (either/or) - -For CSS Styling, it uses the `confluence.css` from Confluence that can be obtained by using the Workaround described in: https://jira.atlassian.com/browse/CONFSERVER-40907. -The `site.css` file included with Confluence UI HTML exports is not as complete as the one above. - -### Folder and file structure: - -* The default output folder is `output/` under the same path as the script. -* A folder with the Space name, Page Properties report page, single page name or Page Label name will be created under the output folder. -* By default, the `_images/` and `_static/` folders will be placed in the page|space|pageprops|label folder. - * The `--sphinx` command line option will put those folder directly under the output folder -* The file `styles/confluence.css` will be copied into the defined `_static/` - -## What it does - -* Leverages the Confluence Cloud API -* Puts Confluence meta data like Page ID and Page Labels, in the HTML headers and RST fields. -* beautifulsoup is used to parse HTML to get and update content, ie. change remote links to local links. -* Download for every page, all attachments, emoticons and embedded files. +# Confluence Dump with Python -## Requirements +This script exports content from a Confluence instance (Cloud or Data Center) using various modes (single page, page tree, full space, all spaces, or by label). + +**Key Features:** -* declare system variables: - * `atlassianAPIToken` - * `atlassianUserEmail` +- **Visual Copy:** Fetches the rendered HTML (`export_view`) to preserve macros, tables, and formatting. + +- **Offline Browsing:** Downloads embedded images/emoticons and rewrites links to be relative, creating a self-contained offline HTML archive. + +- **Metadata:** Injects Confluence metadata (Page ID, Labels, Title) directly into the HTML headers. + +- **Complete Archive:** Downloads _all_ page attachments, not just those displayed on the page. + +- **Multi-Format:** Exports as JSON (metadata + raw body), HTML (visual), and optional RST. + -### Dependencies +## Platform Support -* python3 - * requests - * beautifulsoup4 - * Pillow (handle images) - * pandoc & pypandoc (convert to RST) - * re +This script supports both: -### Installing +- **Confluence Cloud** + +- **Confluence Data Center** + -* Clone repo. -* Install dependencies. -* Declare system variables for Atlassian API Token. +The platform-specific API paths and authentication methods are defined in the `confluence_products.ini` file. -### Executing program +## Requirements +- Python 3.x + +- `requests` + +- `beautifulsoup4` (for HTML parsing and link rewriting) + +- `pypandoc` (optional, for RST export or legacy HTML conversion) + -* How to download a single page based on its ID. +## Installation ``` -confluenceDumpWithPython.py -m single -S -p [] [--sphinx] +git clone [https://github.com/jgoldin-skillz/confluenceDumpWithPython.git](https://github.com/jgoldin-skillz/confluenceDumpWithPython.git) +cd confluenceDumpWithPython +pip install -r requirements.txt ``` -* How to download Page Properties and all the contained pages. +## Authentication + +Authentication is handled via environment variables, based on the profile you select. + +### For Confluence Cloud (`--profile cloud`) ``` -confluenceDumpWithPython.py -m pageprops -S -p [] [--sphinx] +export CONFLUENCE_USER="your-email@example.com" +export CONFLUENCE_TOKEN="YourApiTokenHere" ``` -* How to download a whole Space. +### For Confluence Data Center (`--profile dc`) ``` -confluenceDumpWithPython.py -m space -S -s [] +export CONFLUENCE_TOKEN="YourPersonalAccessTokenHere" ``` -## Help +**⚠️ Troubleshooting Note for Data Center:** If authentication fails (Intranet/SSO blocks), ensure you are on VPN and PATs are enabled. + +## Exporting with CSS Styling + +The script uses a robust **Two-Layer Styling Strategy** to ensure the exported HTML looks correct. + +### Layer 1: Standard CSS (Default) + +The project folder contains a `styles/` directory. This should contain a "Best Guess" CSS file (e.g., `site.css`) extracted from a standard Confluence instance. -No special advice other than: -* make sure that your Atlassian API Token is valid. -* the username for the Cloud Atlassian API is the e-mail address. +- **Automatic:** If a CSS file exists in the local `styles/` folder, it is **automatically applied** to every export. + +- **Maintenance:** You can update this file manually if Confluence changes its base layout significantly. + -## Authors +### Layer 2: Custom CSS (Optional) -Contributors names and contact info +If you have specific styles for your Space (logos, colors, custom macros) that override the standard look, you can provide a second CSS file via the command line. -@dernorberto +- **Usage:** Use `--css-file "/path/to/my_custom.css"`. + +- **Behavior:** This file will be loaded **after** the standard CSS, allowing you to override specific styles without losing the basic formatting. + -## Improvements +## Usage -- [ ] Add export based on page label. -- [x] Add links to Downloads for the corresponding pages. -- [x] Update all links from downloaded pages to the local copies. -- [x] Add to headers the parent page and page labels. -- [ ] Create an index of the pages to use as a TOC. -- [ ] Create a page layout to display TOC + articles. -- [x] Copy `styles/site.css` into `output/styles/` if not present. -- [ ] Allow using with Confluence Server. +### General Syntax -## Issues +``` +python3 confluenceDumpWithPython.py [GLOBAL_OPTIONS] [COMMAND_OPTIONS] +``` -* It does not like very long attachment files, you'll need to rename them in Confluence before the dump. -* Pages previously migrated from Confluence Server might have issues with old emoticons. The best is to convert the pages to the New Editor, which will replace the missing emoticons. +### Command-Line Arguments -## Version History -* 1.4 - * Refactoring into a more simple file setup (`confluenceDumpWithPython.py` & `myModules.py`) -* 1.3 - * Added Space export (flat folder structure) -* 1.2 - * Added better HTML header and footer. - * Added page labels to HTML headers. - * Improved output folder argument logic. -* 1.1 - * Added Papge Properties dump and other smaller things -* 1.0 - * Initial Release +Run `python3 confluenceDumpWithPython.py -h` to see all options. -## legacy/ folder with previous version of scripts +``` +usage: confluenceDumpWithPython.py [-h] -o OUTDIR --base-url BASE_URL --profile PROFILE [--context-path CONTEXT_PATH] [-R] [--css-file CSS_FILE] {single,tree,space,all-spaces,label} ... + +Global Options: + -h, --help show this help message and exit + -o OUTDIR, --outdir OUTDIR + The output directory (will be created) + --base-url BASE_URL The full base URL. + --profile PROFILE Platform profile ('cloud' or 'dc'). + --context-path CONTEXT_PATH + (Data Center only) Manually override the context path. + -R, --rst Export pages as RST. + --css-file CSS_FILE Path to a local custom CSS file (applied AFTER standard CSS). +``` -Purpose of the files: -1. `confluenceExportHTMLrequestsByLabel.py`: download a set of pages based on one (or more) page Labels. -2. `confluenceExportHTMLrequestsSingle.py`: download a single page by supplying the page ID as an argument. -3. `confluenceExportHTMLrequestsPagePropertiesReport.py`: download page properties and all the pages in the report by supplying the page ID as an argument. -4. `confluenceExportHTMLrequestsPagesInSpace.py`: download all pages from a space. +### Examples -## License +#### 1\. Standard Dump (Uses default CSS) -This project is licensed under the MIT License - see the LICENSE.txt file for details +Dumps a page tree. Automatically applies `styles/site.css` if present in the script folder. -## Acknowledgments +``` +python3 confluenceDumpWithPython.py \ + --base-url "[https://confluence.mycompany.com](https://confluence.mycompany.com)" \ + --profile "dc" \ + --context-path "/wiki" \ + -o "./tree_dump" \ + tree \ + --pageid "67890" +``` + +#### 2\. Customized Dump (Standard + Custom CSS) +Dumps a page tree. Applies `styles/site.css` (standard) AND `my_overrides.css` (custom). + +``` +python3 confluenceDumpWithPython.py \ + --base-url "[https://confluence.mycompany.com](https://confluence.mycompany.com)" \ + --profile "dc" \ + --context-path "/wiki" \ + -o "./tree_dump" \ + --css-file "./my_overrides.css" \ + tree \ + --pageid "67890" +``` \ No newline at end of file diff --git a/confluenceDumpWithPython.py b/confluenceDumpWithPython.py index 5e68b33..2e74257 100644 --- a/confluenceDumpWithPython.py +++ b/confluenceDumpWithPython.py @@ -1,265 +1,477 @@ -import os.path +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +This script dumps content from a Confluence instance (Cloud or Data Center). +It fetches rendered HTML (export_view), processes it with BeautifulSoup to +localize images and links, downloads attachments, and optionally converts to RST/HTML. +""" + import argparse -import confluence_dump.myModules as myModules +import os +import sys +import json +import shutil +import glob +from confluence_dump import myModules -"""Dump Confluence content using Python +# --- External Libraries --- +try: + import pypandoc +except ImportError: + pypandoc = None -Args: - mode: Download mode - site: Site to export from - space: Space to export from - page: Page to export - outdir: Folder to export to (optional) - sphinx: Sphinx compatible folder structure (optional) - notags: Do not add tags to rst files (optional) +try: + from tqdm import tqdm +except ImportError: + # Fallback if tqdm is not installed: simple iterator that prints nothing extra + print("Info: 'tqdm' not found. Progress bars will be disabled. (pip install tqdm)", file=sys.stderr) -Returns: - HTML and RST files inside the default or custom output folder + def tqdm(iterable, **kwargs): + return iterable + +# --- Global Config & State --- +platform_config = {} +auth_info = {} +all_pages_metadata = [] # Stores dicts: {'id': str, 'title': str, 'parent_id': str} -""" +# --- Processing Helpers --- -parser = argparse.ArgumentParser() -parser.add_argument('--mode', '-m', dest='mode', - choices=['single', 'space', 'bylabel', 'pageprops'], - help='Chose a download mode', required=True) -parser.add_argument('--site', '-S', type=str, - help='Atlassian Site', required=True) -parser.add_argument('--space', '-s', type=str, - help='Space Key') -parser.add_argument('--page', '-p', type=int, - help='Page ID') -parser.add_argument('--label', '-l', type=str, - help='Page label') -parser.add_argument('--outdir', '-o', type=str, default='output', - help='Folder for export', required=False) -parser.add_argument('--sphinx', '-x', action='store_true', default=False, - help='Sphinx compatible folder structure', required=False) -parser.add_argument('--tags', action='store_true', default=False, - help='Add labels as .. tags::', required=False) -parser.add_argument('--html', action='store_true', default=False, - help='Include .html file in export (default is only .rst)', required=False) -parser.add_argument('--no-rst', action='store_false', dest="rst", default=True, - help='Disable .rst file in export', required=False) -parser.add_argument('--showlabels', action='store_true', default=False, - help='Export .rst files with the page labels at the bottom', required=False) - -args = parser.parse_args() -atlassian_site = args.site -if args.mode == 'single': - print(f"Exporting a single page (Sphinx set to {args.sphinx})") - page_id = args.page -elif args.mode == 'space': - print(f"Exporting a whole space (Sphinx set to {args.sphinx})") - space_key = args.space -elif args.mode == 'bylabel': - print(f"Exporting all pages with a common label (Sphinx set to {args.sphinx})") -elif args.mode == 'pageprops': - print(f"Exporting a Page Properties page with all its children (Sphinx set to {args.sphinx})") - -my_attachments = [] -my_embeds = [] -my_embeds_externals = [] -my_emoticons = [] -my_emoticons_list = [] - -user_name = os.environ["atlassianUserEmail"] -api_token = os.environ["atlassianAPIToken"] - -sphinx_compatible = args.sphinx -sphinx_tags = args.tags -print("Sphinx set to " + str(sphinx_compatible)) -atlassian_site = args.site -my_outdir_base = args.outdir -if args.mode == 'single': - ############ - ## SINGLE ## - ############ - page_id = args.page - page_name = myModules.get_page_name(atlassian_site,page_id,user_name,api_token) - - my_body_export_view = myModules.get_body_export_view(atlassian_site,page_id, - user_name,api_token).json() - my_body_export_view_html = my_body_export_view['body']['export_view']['value'] - my_body_export_view_title = my_body_export_view['title'].replace("/","-")\ - .replace(",","").replace("&","And").replace(":","-") - - server_url = f"https://{atlassian_site}.atlassian.net/wiki/api/v2/spaces/?limit=250" - - page_url = f"{my_body_export_view['_links']['base']}{my_body_export_view['_links']['webui']}" - page_parent = myModules.get_page_parent(atlassian_site,page_id,user_name,api_token) - - my_outdir_base = os.path.join(my_outdir_base,f"{page_id}-{my_body_export_view_title}") # sets outdir to path under page_name - my_outdir_content = my_outdir_base - -# if args.sphinx is False: -# my_outdir_base = os.path.join(my_outdir_base,f"{page_id}-{my_body_export_view_title}") # sets outdir to path under page_name -# my_outdir_content = my_outdir_base -# else: -# my_outdir_content = my_outdir_base - my_outdirs = [] - my_outdirs = myModules.mk_outdirs(my_outdir_base) # attachments, embeds, scripts - my_page_labels = myModules.get_page_labels(atlassian_site,page_id,user_name,api_token) - print(f"Base export folder is \"{my_outdir_base}\" and the Content goes to \"{my_outdir_content}\"") - myModules.dump_html(atlassian_site,my_body_export_view_html,my_body_export_view_title,page_id,my_outdir_base, my_outdir_content,my_page_labels,page_parent,user_name,api_token,sphinx_compatible,sphinx_tags,arg_html_output=args.html,arg_rst_output=args.rst) - print("Done!") -elif args.mode == 'space': - ########### - ## SPACE ## - ########### - all_spaces_full = myModules.get_spaces_all(atlassian_site,user_name,api_token) # get a dump of all spaces - all_spaces_short = [] # initialize list for less detailed list of spaces - i = 0 - for n in all_spaces_full: - i = i +1 - all_spaces_short.append({ # append the list of spaces - 'space_key' : n['key'], - 'space_id' : n['id'], - 'space_name' : n['name'], - 'homepage_id' : n['homepageId'], - 'spaceDescription' : n['description'], +def collect_page_metadata(page_full): + """ Collects metadata for the index generation. """ + try: + page_id = page_full.get('id') + title = page_full.get('title') + ancestors = page_full.get('ancestors', []) + parent_id = ancestors[-1]['id'] if ancestors else None + + if page_id: + all_pages_metadata.append({ + 'id': page_id, + 'title': title, + 'parent_id': parent_id }) - if (n['key'] == space_key) or n['key'] == str.upper(space_key) or n['key'] == str.lower(space_key): - print("Found space: " + n['key']) - space_id = n['id'] - space_name = n['name'] - current_parent = n['homepageId'] - my_outdir_content = os.path.join(my_outdir_base,f"{space_id}-{space_name}") - os.makedirs(my_outdir_content, exist_ok=True) - if args.sphinx is False: - my_outdir_base = my_outdir_content - - #print("my_outdir_base: " + my_outdir_base) - #print("my_outdir_content: " + my_outdir_content) - - if space_key == "" or space_key is None: # if the supplied space key can't be found - print("Could not find Space Key in this site") - else: - space_title = myModules.get_space_title(atlassian_site,space_id,user_name,api_token) - # - # get list of pages from space - # - all_pages_full = myModules.get_pages_from_space(atlassian_site,space_id,user_name,api_token) - all_pages_short = [] - i = 0 - for n in all_pages_full: - i = i + 1 - all_pages_short.append({ - 'page_id' : n['id'], - 'pageTitle' : n['title'], - 'parentId' : n['parentId'], - 'space_id' : n['spaceId'], - } - ) - # put it all together - print(f"{len(all_pages_short)} pages to export") - page_counter = 0 - for p in all_pages_short: - page_counter = page_counter + 1 - my_body_export_view = myModules.get_body_export_view(atlassian_site,p['page_id'],user_name,api_token).json() - my_body_export_view_html = my_body_export_view['body']['export_view']['value'] - my_body_export_view_name = p['pageTitle'] - my_body_export_view_title = p['pageTitle'].replace("/","-").replace(",","").replace("&","And").replace(" ","_") # added .replace(" ","_") so that filenames have _ as a separator - print() - print(f"Getting page #{page_counter}/{len(all_pages_short)}, {my_body_export_view_title}, {p['page_id']}") - my_body_export_view_labels = myModules.get_page_labels(atlassian_site,p['page_id'],user_name,api_token) - #my_body_export_view_labels = ",".join(myModules.get_page_labels(atlassian_site,p['page_id'],user_name,api_token)) - mypage_url = f"{my_body_export_view['_links']['base']}{my_body_export_view['_links']['webui']}" - print(f"dump_html arg sphinx_compatible = {sphinx_compatible}") - myModules.dump_html(atlassian_site,my_body_export_view_html,my_body_export_view_title,p['page_id'],my_outdir_base,my_outdir_content,my_body_export_view_labels,p['parentId'],user_name,api_token,sphinx_compatible,sphinx_tags,arg_html_output=args.html,arg_rst_output=args.rst) - print("Done!") -elif args.mode == 'pageprops': - ############### - ## PAGEPROPS ## - ############### - my_page_properties_children = [] - my_page_properties_children_dict = {} - - page_id = args.page - # - # Get Page Properties REPORT - # - print("Getting Page Properties Report Details") - my_report_export_view = myModules.get_body_export_view(atlassian_site,page_id,user_name,api_token).json() - my_report_export_view_title = my_report_export_view['title'].replace("/","-").replace(",","").replace("&","And").replace(":","-") - my_report_export_view_html = my_report_export_view['body']['export_view']['value'] - my_report_export_viewName = myModules.get_page_name(atlassian_site,page_id,user_name,api_token) - my_report_export_view_labels = myModules.get_page_labels(atlassian_site,page_id,user_name,api_token) - my_report_export_page_url = f"{my_report_export_view['_links']['base']}{my_report_export_view['_links']['webui']}" - my_report_export_page_parent = myModules.get_page_parent(atlassian_site,page_id,user_name,api_token) - my_report_export_html_filename = f"{my_report_export_view_title}.html" - # str(my_report_export_view_title) + '.html' - # my outdirs - my_outdir_content = os.path.join(my_outdir_base,str(page_id) + "-" + str(my_report_export_view_title)) - #print("my_outdir_base: " + my_outdir_base) - #print("my_outdir_content: " + my_outdir_content) - if args.sphinx is False: - my_outdir_base = my_outdir_content - - my_outdirs = [] - my_outdirs = myModules.mk_outdirs(my_outdir_base) # attachments, embeds, scripts - # get info abbout children - #my_page_properties_children = myModules.get_page_properties_children(atlassian_site,my_report_export_view_html,my_outdir_content,user_name,api_token)[0] # list - #my_page_properties_children_dict = myModules.get_page_properties_children(atlassian_site,my_report_export_view_html,my_outdir_content,user_name,api_token)[1] # dict - (my_page_properties_children,my_page_properties_children_dict) = myModules.get_page_properties_children(atlassian_site,my_report_export_view_html,my_outdir_content,user_name,api_token) - # - # Get Page Properties CHILDREN - # - page_counter = 0 - for p in my_page_properties_children: - page_counter = page_counter + 1 - #print("Handling child: " + p) - my_child_export_view = myModules.get_body_export_view(atlassian_site,p,user_name,api_token).json() - my_child_export_view_html = my_child_export_view['body']['export_view']['value'] - my_child_export_view_name = my_page_properties_children_dict[p]['Name'] - my_child_export_view_labels = myModules.get_page_labels(atlassian_site,p,user_name,api_token) - my_child_export_view_title = my_child_export_view['title'] ##.replace("/","-").replace(":","-").replace(" ","_") - print(f"Getting Child page #{page_counter}/{len(my_page_properties_children)}, {my_child_export_view_title}, {my_page_properties_children_dict[str(p)]['ID']}") - #print("Getting Child page #" + str(page_counter) + '/' + str(len(my_page_properties_children)) + ', ' + my_child_export_view_title + ', ' + my_page_properties_children_dict[str(p)]['ID']) - my_child_export_page_url = f"{my_child_export_view['_links']['base']}{my_child_export_view['_links']['webui']}" - #my_child_export_page_url = str(my_child_export_view['_links']['base']) + str(my_child_export_view['_links']['webui']) - my_child_export_page_parent = myModules.get_page_parent(atlassian_site,p,user_name,api_token) - html_file_name = (f"{my_page_properties_children_dict[p]['Name']}.html").replace(":","-").replace(" ","_") - #html_file_name = my_page_properties_children_dict[p]['Name'].replace(":","-").replace(" ","_") + '.html' - my_page_properties_children_dict[str(p)].update({"Filename": html_file_name}) - - myModules.dump_html( - arg_site=atlassian_site, - arg_html=my_child_export_view_html, - arg_title=my_child_export_view_title, - arg_page_id=p, - arg_outdir_base=my_outdir_base, - arg_outdir_content=my_outdir_content, - arg_page_labels=my_child_export_view_labels, - arg_page_parent=my_child_export_page_parent, - arg_username=user_name, - arg_api_token=api_token, - arg_sphinx_compatible=sphinx_compatible, - arg_sphinx_tags=sphinx_tags, - arg_type="reportchild", - arg_html_output=args.html, - arg_rst_output=args.rst, - arg_show_labels=args.showlabels - ) # creates html files for every child - myModules.dump_html( - arg_site=atlassian_site, - arg_html=my_report_export_view_html, - arg_title=my_report_export_view_title, - arg_page_id=page_id, - arg_outdir_base=my_outdir_base, - arg_outdir_content=my_outdir_content, - arg_page_labels=my_report_export_view_labels, - arg_page_parent=my_report_export_page_parent, - arg_username=user_name, - arg_api_token=api_token, - arg_sphinx_compatible=sphinx_compatible, - arg_sphinx_tags=sphinx_tags, - arg_type="report", - arg_html_output=args.html, - arg_rst_output=args.rst, - arg_show_labels=args.showlabels - ) # finally creating the HTML for the report page - print("Done!") -else: - print("No script mode defined in the command line") + except Exception as e: + print(f"Warning: Could not collect metadata for index: {e}", file=sys.stderr) + + +def save_page_attachments(page_id, attachments, base_url, auth_info): + """ Downloads all attachments listed in the API response for a page. """ + if not attachments or 'results' not in attachments: + return + + for att in attachments['results']: + download_path = att.get('_links', {}).get('download') + filename = att.get('title') + + if download_path and filename: + if download_path.startswith('/'): + full_url = base_url.rstrip('/') + download_path + else: + full_url = base_url.rstrip('/') + '/' + download_path + + local_path = os.path.join(myModules.outdir_attachments, filename) + myModules.download_file(full_url, local_path, auth_info) + + +def convert_html(page_id, page_title, page_body, outdir_pages, css_filename=None): + """ + Converts Confluence storage HTML to standard HTML via pandoc. + Uses --standalone to create full HTML files with head/body. + """ + if pypandoc is None: return + + page_filename_html = f"{outdir_pages}{page_id}.html" + + # Default CSS path relative to the HTML file + css_path = "../styles/site.css" + if css_filename: + css_path = f"../styles/{os.path.basename(css_filename)}" + + pdoc_args = [ + '--standalone', + f'--css={css_path}', + '--metadata', f'title={page_title}' + ] + + try: + output = pypandoc.convert_text( + page_body, + 'html', + format='html', + outputfile=page_filename_html, + extra_args=pdoc_args + ) + assert output == "" + except Exception as e: + print(f" Error converting HTML for {page_id}: {e}", file=sys.stderr) + + +def convert_rst(page_id, page_body, outdir_pages): + """ Converts processed HTML file to RST via pandoc """ + if pypandoc is None: return + + page_filename_rst = f"{outdir_pages}{page_id}.rst" + # print(f" Converting to RST: {page_filename_rst}") + try: + output = pypandoc.convert_text(page_body, 'rst', format='html', outputfile=page_filename_rst) + assert output == "" + except Exception as e: + print(f" Error converting RST for {page_id}: {e}", file=sys.stderr) + + +# --- Core Logic --- + +def create_error_placeholder(page_id, page_title, html_filename): + """ Creates a minimal HTML file indicating that the download failed. """ + try: + with open(html_filename, 'w', encoding='utf-8') as f: + f.write(f""" + + + + Download Failed: {page_title} + + + +
+

Download Failed

+

The content for page {page_id} could not be retrieved during export.

+

Please check the export logs for details.

+
+ + + """) + print(f" -> Created placeholder for failed page: {page_id}") + except Exception as e: + print(f" Error creating placeholder: {e}", file=sys.stderr) + + +def process_page(page_id, global_args, active_css_files=None, exported_page_ids=None, verbose=True): + """ + Downloads and processes a single page. + :param verbose: If True, prints details to stdout. If False (for progress bars), stays silent except for errors. + """ + if verbose: + print(f"\nProcessing page ID: {page_id}") + + # 1. Get Page (with export_view) + page_full = myModules.get_page_full( + page_id, + global_args.base_url, + platform_config, + auth_info, + global_args.context_path + ) + + # Define filename early + html_filename = os.path.join(myModules.outdir_pages, f"{page_id}.html") + + if not page_full: + # ERROR HANDLING: Create placeholder + print(f" Warning: Could not fetch page {page_id}. Creating placeholder.", file=sys.stderr) + create_error_placeholder(page_id, "Unknown Title", html_filename) + return + + # Collect Metadata for Index + collect_page_metadata(page_full) + + page_title = page_full.get('title', 'Untitled') + if verbose: + print(f" Title: {page_title}") + + # 2. Get Raw HTML + raw_html = page_full.get('body', {}).get('export_view', {}).get('value') + if not raw_html: + raw_html = page_full.get('body', {}).get('view', {}).get('value', '') + + # 3. Process HTML (BeautifulSoup) + processed_html = myModules.process_page_content( + raw_html, + page_full, + global_args.base_url, + auth_info, + active_css_files, + exported_page_ids + ) + + # 4. Save HTML File + html_filename = os.path.join(myModules.outdir_pages, f"{page_id}.html") + with open(html_filename, 'w', encoding='utf-8') as f: + f.write(processed_html) + + # 5. Get & Download Attachments + page_attachments = myModules.get_page_attachments( + page_id, + global_args.base_url, + platform_config, + auth_info, + global_args.context_path + ) + save_page_attachments(page_id, page_attachments, global_args.base_url, auth_info) + + # 6. Save Metadata JSON + json_filename = os.path.join(myModules.outdir_pages, f"{page_id}.json") + page_full['body_processed'] = processed_html + with open(json_filename, 'w', encoding='utf-8') as f: + json.dump(page_full, f, indent=4, ensure_ascii=False) + + # 7. Optional RST Export + if global_args.rst: + convert_rst(page_id, processed_html, myModules.outdir_pages) + + +# --- Index Generation --- + +def build_index_html(output_dir, css_files=None): + """ Generates an index.html file listing all downloaded pages hierarchically. """ + print("\nGenerating index.html...") + tree_map = {} + pages_map = {} + for page in all_pages_metadata: + pid = page['id'] + parent = page['parent_id'] + pages_map[pid] = page + if parent not in tree_map: tree_map[parent] = [] + tree_map[parent].append(pid) + + def build_list_html(parent_id): + if parent_id not in tree_map: return "" + html = "
    " + for child_id in tree_map[parent_id]: + if child_id in pages_map: + child = pages_map[child_id] + html += f'
  • {child["title"]}' + html += build_list_html(child_id) + html += '
  • ' + html += "
" + return html + + downloaded_ids = set(pages_map.keys()) + root_ids = [] + for page in all_pages_metadata: + parent = page['parent_id'] + if parent is None or parent not in downloaded_ids: + root_ids.append(page['id']) + + body_html = "

Confluence Export Index

    " + for rid in root_ids: + page = pages_map[rid] + body_html += f'
  • {page["title"]}' + body_html += build_list_html(rid) + body_html += '
  • ' + body_html += "
" + + css_links = "" + if css_files: + for css in css_files: + clean_css = css.replace('../', '') + css_links += f'' + + full_html = f"""Index{css_links}{body_html}""" + + with open(os.path.join(output_dir, "index.html"), 'w', encoding='utf-8') as f: + f.write(full_html) + + +# --- Handlers --- + +def handle_single(args, active_css_files=None): + target_ids = {args.pageid} + print(f"Starting 'single' dump for {args.pageid}") + # Single page -> No progress bar needed, verbose=True + process_page(args.pageid, args, active_css_files, target_ids, verbose=True) + + +def get_page_tree_recursive(page_id, args): + pids = [page_id] + children = myModules.get_page_children(page_id, args.base_url, platform_config, auth_info, args.context_path) + if children and 'results' in children: + for child in children['results']: + pids.extend(get_page_tree_recursive(child['id'], args)) + return pids + + +def handle_tree(args, active_css_files=None): + print(f"Starting 'tree' dump for {args.pageid} (Inventory Phase)...") + all_ids = get_page_tree_recursive(args.pageid, args) + target_ids = set(all_ids) + + print(f"Found {len(all_ids)} pages in tree. Processing...") + # Progress bar loop + for pid in tqdm(all_ids, desc="Downloading Pages", unit="page"): + process_page(pid, args, active_css_files, target_ids, verbose=False) + + +def handle_space(args, active_css_files=None): + print(f"Starting 'space' dump for {args.space_key}") + print("Phase 1: Inventory Scan (Fetching Page IDs)...") + + target_ids = set() + all_pages_list = [] + start = 0 + + # Phase 1: Scan (Spinner logic could be added here, but simple print is OK) + while True: + res = myModules.get_pages_from_space(args.space_key, start, 200, args.base_url, platform_config, auth_info, + args.context_path) + if not res or not res.get('results'): break + + results = res['results'] + for p in results: + target_ids.add(p['id']) + all_pages_list.append(p['id']) + + print(f" Scanned {len(results)} pages (Total found: {len(target_ids)})...") + start += 200 + + print(f"Phase 2: Downloading & Processing {len(target_ids)} pages...") + # Progress bar loop + for pid in tqdm(all_pages_list, desc="Downloading Pages", unit="page"): + process_page(pid, args, active_css_files, target_ids, verbose=False) + + +def handle_label(args, active_css_files=None): + print(f"Starting 'label' dump for {args.label}") + print("Phase 1: Inventory Scan (Fetching Page IDs)...") + + target_ids = set() + all_pages_list = [] + start = 0 + + while True: + res = myModules.get_pages_by_label(args.label, start, 200, args.base_url, platform_config, auth_info, + args.context_path) + if not res or not res.get('results'): break + + results = res['results'] + for p in results: + target_ids.add(p['id']) + all_pages_list.append(p['id']) + + print(f" Scanned {len(results)} pages (Total found: {len(target_ids)})...") + start += 200 + + print(f"Phase 2: Downloading & Processing {len(target_ids)} pages...") + for pid in tqdm(all_pages_list, desc="Downloading Pages", unit="page"): + process_page(pid, args, active_css_files, target_ids, verbose=False) + + +def handle_all_spaces(args, active_css_files=None): + print("Starting 'all-spaces' dump...") + spaces = myModules.get_all_spaces(args.base_url, platform_config, auth_info, args.context_path) + + if spaces and 'results' in spaces: + for s in spaces['results']: + print(f"\n--- Processing Space: {s['key']} ---") + s_args = argparse.Namespace(**vars(args)) + s_args.space_key = s['key'] + handle_space(s_args, active_css_files) + + +# --- Main --- + +def main(): + parser = argparse.ArgumentParser(description="Confluence Dump (Cloud/DC) with HTML Processing") + + # Global + g = parser.add_argument_group('Global') + g.add_argument('-o', '--outdir', required=True, help="Output directory") + g.add_argument('--base-url', required=True, help="Confluence Base URL") + g.add_argument('--profile', required=True, help="cloud or dc") + g.add_argument('--context-path', default=None, help="Context path (DC only)") + g.add_argument('--css-file', default=None, help="Path to custom CSS file (applied AFTER standard CSS)") + g.add_argument('-R', '--rst', action='store_true', help="Also export RST") + + # Subcommands + subs = parser.add_subparsers(dest='command', required=True) + + p_single = subs.add_parser('single') + p_single.add_argument('-p', '--pageid', required=True) + p_single.set_defaults(func=handle_single) + + p_tree = subs.add_parser('tree') + p_tree.add_argument('-p', '--pageid', required=True) + p_tree.set_defaults(func=handle_tree) + + p_space = subs.add_parser('space') + p_space.add_argument('-sp', '--space-key', required=True) + p_space.set_defaults(func=handle_space) + + p_label = subs.add_parser('label') + p_label.add_argument('-l', '--label', required=True) + p_label.set_defaults(func=handle_label) + + p_all = subs.add_parser('all-spaces') + p_all.set_defaults(func=handle_all_spaces) + + args = parser.parse_args() + + # Setup + global platform_config, auth_info + active_css_files = [] + + try: + platform_config = myModules.load_platform_config(args.profile) + auth_info = myModules.get_auth_config(platform_config) + + myModules.setup_output_directories(args.outdir) + myModules.set_variables() + + # --- CSS Strategy: Standard + Custom --- + local_styles_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'styles') + standard_css_source = None + + if os.path.exists(local_styles_dir): + possible_files = glob.glob(os.path.join(local_styles_dir, "*.css")) + if os.path.join(local_styles_dir, "site.css") in possible_files: + standard_css_source = os.path.join(local_styles_dir, "site.css") + elif possible_files: + standard_css_source = possible_files[0] + + if standard_css_source: + print(f"Found standard CSS: {standard_css_source}") + std_dest_name = os.path.basename(standard_css_source) + target_std = os.path.join(myModules.outdir_styles, std_dest_name) + shutil.copy(standard_css_source, target_std) + active_css_files.append(f"../styles/{std_dest_name}") + else: + print("Info: No standard CSS found in ./styles/. Base styling might be missing.") + + if args.css_file: + if os.path.exists(args.css_file): + print(f"Adding custom CSS: {args.css_file}") + custom_dest_name = os.path.basename(args.css_file) + if standard_css_source and custom_dest_name == os.path.basename(standard_css_source): + name, ext = os.path.splitext(custom_dest_name) + custom_dest_name = f"{name}_custom{ext}" + print(f" -> Renamed to {custom_dest_name} to avoid collision.") + target_custom = os.path.join(myModules.outdir_styles, custom_dest_name) + shutil.copy(args.css_file, target_custom) + active_css_files.append(f"../styles/{custom_dest_name}") + else: + print(f"Warning: Custom CSS file {args.css_file} not found.", file=sys.stderr) + + except Exception as e: + print(f"Init Error: {e}", file=sys.stderr) + sys.exit(1) + + # Run + try: + args.func(args, active_css_files) + build_index_html(args.outdir, active_css_files) + print(f"\nDump Complete. Output in {args.outdir}") + except Exception as e: + print(f"Execution Error: {e}", file=sys.stderr) + import traceback + traceback.print_exc() + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/confluence_dump/myModules.py b/confluence_dump/myModules.py index 056bfe0..cb71a19 100644 --- a/confluence_dump/myModules.py +++ b/confluence_dump/myModules.py @@ -1,459 +1,339 @@ -import shutil -import requests -import os.path -import json -from requests.auth import HTTPBasicAuth -from bs4 import BeautifulSoup as bs +# -*- coding: utf-8 -*- +""" +Module to abstract Confluence API calls and provide local file/directory utilities. +Supports both Confluence Cloud and Data Center platforms. +Includes BeautifulSoup logic for HTML processing (downloading assets, fixing links). +""" + +import os import sys -import pypandoc -from PIL import Image +import requests +import configparser import re +from requests.auth import HTTPBasicAuth +from urllib.parse import unquote, urlparse +from bs4 import BeautifulSoup -""" -Arguments needed to run these functions centrally: -* outdirs: outdir, attach_dir, emoticonDir, styles_dir -* page details: Title, ID, Parent, orig URL, Space -* space details: Title, ID, site -* Confluence API: Username, Password +# --- Globals for output directories --- +outdir_base = "" +outdir_pages = "" +outdir_attachments = "" +outdir_styles = "" +outdir_logs = "" -CURRENT STATE -* fixed getting output folders -* next up: getAttachments -""" -# -# Set path for where script is -# -script_dir = os.path.dirname(os.path.abspath(__file__)) -attach_dir = "_images/" -emoticons_dir = "_images/" -styles_dir = "_static/" +# --- Setup Functions --- def set_variables(): - """Set variables for export folders""" - dict_vars = {} - dict_vars['attach_dir'] = "_images/" - dict_vars['emoticons_dir'] = "_images/" - dict_vars['styles_dir'] = "_static/" - attach_dir = "_images/" - emoticons_dir = "_images/" - styles_dir = "_static/" - return(dict_vars) -# -# Create the output folders, set to match Sphynx structure -# -def set_dirs(arg_outdir="output"): # setting default to output - """Set output folders paths for attachments, emoticons and styles""" - my_vars = set_variables() - outdir_attach = os.path.join(arg_outdir,my_vars['attach_dir']) - outdir_emoticons = os.path.join(arg_outdir,my_vars['emoticons_dir']) - outdir_styles = os.path.join(arg_outdir,my_vars['styles_dir']) - return[outdir_attach, outdir_emoticons, outdir_styles] # returns a list - -def mk_outdirs(arg_outdir="output"): # setting default to output - """Create the output folders""" - my_vars = set_variables() - outdir_list = set_dirs(arg_outdir) - outdir_attach = outdir_list[0] - outdir_emoticons = outdir_list[1] - outdir_styles = outdir_list[2] - os.makedirs(arg_outdir, exist_ok=True) - os.makedirs(outdir_attach, exist_ok=True) - os.makedirs(outdir_emoticons, exist_ok=True) - os.makedirs(outdir_styles, exist_ok=True) - if not os.path.exists(os.path.join(outdir_styles, 'confluence.css')): - shutil.copy(os.path.join(script_dir, "styles", "confluence.css"), os.path.join(outdir_styles, "confluence.css")) - return(outdir_list) - -def get_space_title(arg_site,arg_space_id,arg_username,arg_api_token): - """Get Title of a space - - Args: - arg_site: The site name - arg_space_id: ID of the space - arg_username: Username for auth - arg_api_token: API token for auth + """ Sets and returns global variables. """ + global page_ids_in_space, page_names_in_space, attachments_in_space + page_ids_in_space = [] + page_names_in_space = [] + attachments_in_space = [] + return - Returns: - response (string): The title of the space - """ - server_url = (f"https://{arg_site}.atlassian.net/wiki/api/v2/spaces/{arg_space_id}") - - response = requests.get(server_url, auth=(arg_username, arg_api_token),timeout=30).json()['name'] - return(response) - -def get_spaces_all(arg_site,arg_username,arg_api_token): - server_url = f"https://{arg_site}.atlassian.net/wiki/api/v2/spaces/?limit=250" - response = requests.get(server_url, auth=(arg_username,arg_api_token),timeout=30) - response.raise_for_status() # raises exception when not a 2xx response - space_list = response.json()['results'] - while 'next' in response.json()['_links'].keys(): - cursorserver_url = f"{server_url}&cursor{response.json()['_links']['next'].split('cursor')[1]}" - response = requests.get(cursorserver_url, auth=(arg_username,arg_api_token),timeout=30) - space_list = space_list + response.json()['results'] - return(space_list) - -def get_pages_from_space(arg_site,arg_space_id,arg_username,arg_api_token): - page_list = [] - server_url = f"https://{arg_site}.atlassian.net/wiki/api/v2/spaces/{arg_space_id}/pages?status=current&limit=250" - response = requests.get(server_url, auth=(arg_username,arg_api_token),timeout=30) - page_list = response.json()['results'] - while 'next' in response.json()['_links'].keys(): - cursorserver_url = f"{server_url}&cursor{response.json()['_links']['next'].split('cursor')[1]}" - response = requests.get(cursorserver_url, auth=(arg_username,arg_api_token),timeout=30) - page_list = page_list + response.json()['results'] - return(page_list) - -def get_body_export_view(arg_site,arg_page_id,arg_username,arg_api_token): - server_url = f"https://{arg_site}.atlassian.net/wiki/rest/api/content/{arg_page_id}?expand=body.export_view" - response = requests.get(server_url, auth=(arg_username, arg_api_token)) - return(response) - -def get_page_name(arg_site,arg_page_id,arg_username,arg_api_token): - server_url = f"https://{arg_site}.atlassian.net/wiki/rest/api/content/{arg_page_id}" - r_pagetree = requests.get(server_url, auth=(arg_username, arg_api_token),timeout=30) - return(r_pagetree.json()['id'] + "_" + r_pagetree.json()['title']) - -def get_page_parent(arg_site,arg_page_id,arg_username,arg_api_token): - server_url = f"https://{arg_site}.atlassian.net/wiki/api/v2/pages/{arg_page_id}" - response = requests.get(server_url, auth=(arg_username, arg_api_token),timeout=30) - return(response.json()['parentId']) - -def get_page_last_modified(arg_site,arg_page_id,arg_username,arg_api_token): - server_url = f"https://{arg_site}.atlassian.net/wiki/rest/api/content/{arg_page_id}?expand=history.lastUpdated" - response = requests.get(server_url, auth=(arg_username, arg_api_token),timeout=30) - data = response.json() - # Check if 'lastUpdated' exists and is not empty - last_updated = data.get('history', {}).get('lastUpdated') - if last_updated: - return last_updated['when'] - # Fallback to 'createdDate' if 'lastUpdated' is not available - return data['history']['createdDate'] - -def remove_illegal_characters(input): - return re.sub(r'[^\w_\.\- ]+', '_', input) - -def get_attachments(arg_site,arg_page_id,arg_outdir_attach,arg_username,arg_api_token): - my_attachments_list = [] - server_url = f"https://{arg_site}.atlassian.net/wiki/rest/api/content/{arg_page_id}?expand=children.attachment" - response = requests.get(server_url, auth=(arg_username, arg_api_token),timeout=30) - my_attachments = response.json()['children']['attachment']['results'] - for attachment in my_attachments: - attachment_title = remove_illegal_characters(requests.utils.unquote(attachment['title']).replace(" ","_").replace(":","-")) # I want attachments without spaces - attachment_file_path = os.path.join(arg_outdir_attach,attachment_title) - if not os.path.exists(attachment_file_path): - print(f"Downloading: {attachment_title}") - try: - attachment_url = f"https://{arg_site}.atlassian.net/wiki{attachment['_links']['download']}" - request_attachment = requests.get(attachment_url, auth=(arg_username, arg_api_token),allow_redirects=True,timeout=30) - open(attachment_file_path, 'wb').write(request_attachment.content) - except: - print(f"WARNING: Skipping attachment file {attachment_file_path} due to issues. url: {attachment_url}") - my_attachments_list.append(attachment_title) - return(my_attachments_list) - -# get page labels -def get_page_labels(arg_site,arg_page_id,arg_username,arg_api_token): - html_labels = [] - server_url = f"https://{arg_site}.atlassian.net/wiki/api/v2/pages/{arg_page_id}/labels" - response = requests.get(server_url, auth=(arg_username,arg_api_token),timeout=30).json() - for l in response['results']: - html_labels.append(l['name']) - print(f"Label: {l['name']}") - html_labels = ", ".join(html_labels) - print(f"Page labels: {html_labels}") - return(html_labels) - -def get_page_properties_children(arg_site,arg_html,arg_outdir,arg_username,arg_api_token): - my_page_properties_children = [] - my_page_properties_children_dict = {} - soup = bs(arg_html, "html.parser") - my_page_properties_items = soup.findAll('td',class_="title") - my_page_properties_items_counter = 0 - for n in my_page_properties_items: - my_page_id = str(n['data-content-id']) - my_page_properties_children.append(str(n['data-content-id'])) - my_page_properties_items_counter = my_page_properties_items_counter + 1 - my_page_name = get_page_name(arg_site,int(my_page_id),arg_username,arg_api_token).rsplit('_',1)[1].replace(":","-").replace(" ","_").replace("%20","_") # replace offending characters from file name - my_page_properties_children_dict.update({ my_page_id:{}}) - my_page_properties_children_dict[my_page_id].update({"ID": my_page_id}) - my_page_properties_children_dict[my_page_id].update({"Name": my_page_name}) - print( f"{my_page_properties_items_counter} Page Properties Children Pages") - return[my_page_properties_children,my_page_properties_children_dict] - -def get_editor_version(arg_site,arg_page_id,arg_username,arg_api_token): - server_url = f"https://{arg_site}.atlassian.net/wiki/rest/api/content/{arg_page_id}?expand=metadata.properties.editor" - response = requests.get(server_url, auth=(arg_username, arg_api_token)) - return(response) - -def dump_html( - arg_site, - arg_html, - arg_title, - arg_page_id, - arg_outdir_base, - arg_outdir_content, - arg_page_labels, - arg_page_parent, - arg_username, - arg_api_token, - arg_sphinx_compatible=True, - arg_sphinx_tags=False, - arg_type="", - arg_html_output=False, - arg_rst_output=True, - arg_show_labels=False - ): - """Create HTML and RST files - - Args: - arg_site: Name of the Confluence Site - arg_html: HTML Content to use for page - arg_title: Title of the page - arg_page_id: Page ID - arg_outdir_base: Base output folder - arg_outdir_content: Output folder for Content - arg_page_labels: Labels of the page - arg_page_parent: Parent of the page - arg_username: Username for authentication - arg_api_token: API Token for authentication - arg_sphinx_compatible: Place _static and _images folder at root of output folder - arg_sphinx_tags: Add tags to output RST - arg_type: For Page Properties, the type of page: "report", "child" or "common" if it's not for Page Properties - Returns: - HTML, RST and all attachments, embeds and emoticons - """ - my_vars = set_variables() - my_emoticons_list = [] - my_outdir_content = arg_outdir_content - #my_outdir_content = os.path.join(arg_outdir_base,str(arg_page_id) + "-" + str(arg_title)) # this is for html and rst files - os.makedirs(my_outdir_content, exist_ok=True) - #myOutdir = os.path.join(arg_outdir,str(arg_page_id) + "-" + str(arg_title)) - my_outdirs = mk_outdirs(arg_outdir_base) # this is for everything for _images and _static - my_vars = set_variables() # create a dict with the 3 folder paths: attach, emoticons, styles - - soup = bs(arg_html, "html.parser") - - # - # removing elements we don't need like - # *
\n" - f"\n" - f"{arg_title}\n" - f"\n" - f"\n" - f"\n" - f"\n" - f"\n" - f"\n" - f"\n" - f"\n" - f"

{arg_title}

\n" - f"

Original URL: {arg_title}


\n" - ) - - - myFooter = (f"\n" - f"" - ) - # - # At the end of the page, put a link to all attachments. - # - if arg_sphinx_compatible == True: - attach_dir = "../" + my_vars['attach_dir'] - else: - attach_dir = my_vars['attach_dir'] - if len(my_attachments) > 0: - my_pre_footer = "

Attachments

    " - for attachment in my_attachments: - my_pre_footer += (f"
  1. {attachment}
  2. ") - my_pre_footer += "

" - - # - # Putting HTML together - # - pretty_html = soup.prettify() - html_file = open(html_file_path, 'w', encoding='utf-8') - html_file.write(my_header) - html_file.write(pretty_html) - if len(my_attachments) > 0: - html_file.write(my_pre_footer) - html_file.write(myFooter) - html_file.close() - if arg_html_output == True: - print(f"Exported HTML file {html_file_path}") - # - # convert html to rst - # - if not arg_rst_output: - return page_url, html_file_path - - rst_file_name = f"{html_file_name.replace('html','rst')}" - rst_file_path = os.path.join(my_outdir_content,rst_file_name) + c_path = '' + path_params['context_path'] = c_path + + return f"{base_url.rstrip('/')}{template.format(**path_params)}" + + +def _execute_get_request(url, auth_info, params=None): + headers = {"Accept": "application/json"} + if isinstance(auth_info, dict): headers.update(auth_info) + try: - output_rst = pypandoc.convert_file(str(html_file_path), 'rst', format='html',extra_args=['--standalone','--wrap=none','--list-tables']) + resp = requests.get(url, headers=headers, auth=auth_info if not isinstance(auth_info, dict) else None, + params=params) + resp.raise_for_status() + if 'application/json' not in resp.headers.get('Content-Type', ''): + print("Error: Non-JSON response. Likely Auth/SSO issue.", file=sys.stderr) + if isinstance(auth_info, dict): + print("[Hint]: Check VPN/Intranet connection for Data Center.", file=sys.stderr) + print("Also ensure that Personal Access Tokens are not disabled by an SSO policy.", file=sys.stderr) + print("Please verify your CONFLUENCE_TOKEN environment variable.", file=sys.stderr) + else: + print("\nPlease verify your CONFLUENCE_USER and CONFLUENCE_TOKEN environment variables.", + file=sys.stderr) + return None + return resp.json() except Exception as e: - print("There was an issue generating an RST file from the page.") - print(e) + print(f"Request Error: {e}", file=sys.stderr) + return None + + +def get_page_view_url(base_url, platform_config, context_path_override, spaceKey, pageId): + path_params = {'spaceKey': spaceKey, 'pageId': pageId} + return _build_api_url(base_url, platform_config, context_path_override, 'url_view_page', path_params) + + +# --- Downloader --- + +def download_file(url, local_filename, auth_info): + """ + Downloads a file (image/attachment) from a URL to the local file system. + """ + headers = {} + auth_obj = None + if isinstance(auth_info, dict): + headers.update(auth_info) else: - ## - ## RST Header with Page Metadata - ## - if (arg_sphinx_compatible == True): - rst_page_header = (f":conf_pagetype: {arg_type}\n" - f":conf_pageid: {arg_page_id}\n" - f":conf_parent: {arg_page_parent}\n" - f":conf_labels: {arg_page_labels}\n" - f":doc_title: {arg_title}\n" - f"\n" - ) + auth_obj = auth_info + + try: + with requests.get(url, headers=headers, auth=auth_obj, stream=True) as r: + r.raise_for_status() + with open(local_filename, 'wb') as f: + for chunk in r.iter_content(chunk_size=8192): + f.write(chunk) + return True + except Exception as e: + print(f" Failed to download {url}: {e}", file=sys.stderr) + return False + + +# --- HTML Processor (The Core Logic) --- + +def process_page_content(html_content, page_metadata, base_url, auth_info, css_files=None, exported_page_ids=None): + """ + Parses the HTML content using BeautifulSoup. + 1. Injects Metadata. + 2. Downloads images. + 3. SMART LINK REWRITING: + - If link target IS in exported_page_ids -> Rewrite to ID.html (Offline link) + - If link target is NOT in exported_page_ids -> Keep/Make absolute URL (Online link) + 4. Injects CSS links. + + Returns: + str: The processed, standalone HTML. + """ + if not html_content: + return "" + + soup = BeautifulSoup(html_content, 'html.parser') + + # Ensure exported_page_ids is a set for fast lookup (or empty set if None) + valid_ids = set(exported_page_ids) if exported_page_ids else set() + + # 1. Metadata Injection (Head) + # Create head if missing (export_view usually just gives body fragments) + if not soup.head: + head = soup.new_tag('head') + soup.insert(0, head) + + # Title + title_tag = soup.new_tag('title') + title_tag.string = page_metadata.get('title', 'Untitled') + soup.head.append(title_tag) + + # Meta Tags + meta_id = soup.new_tag('meta', attrs={'name': 'confluence-page-id', 'content': page_metadata.get('id')}) + soup.head.append(meta_id) + + labels = [l['name'] for l in page_metadata.get('metadata', {}).get('labels', {}).get('results', [])] + meta_labels = soup.new_tag('meta', attrs={'name': 'confluence-labels', 'content': ', '.join(labels)}) + soup.head.append(meta_labels) + + # CSS Links (Inject all provided CSS files) + if css_files: + for css_path in css_files: + link_css = soup.new_tag('link', attrs={'rel': 'stylesheet', 'href': css_path, 'type': 'text/css'}) + soup.head.append(link_css) + + # Body wrapper (if missing) + if not soup.body: + body = soup.new_tag('body') + for element in list(soup.children): + if element.name != 'head': + body.append(element) + soup.append(body) + + # 2. Image Downloading & rewriting + for img in soup.find_all('img'): + src = img.get('src') + if not src: + continue + + # Construct full URL if relative + if src.startswith('/'): + full_url = base_url.rstrip('/') + src else: - rst_page_header = (f".. meta::\n" - f" :confluencePageId: {arg_page_id} \n" - f" :confluencePageLabels: {arg_page_labels} \n" - f" :confluencePageParent: {arg_page_parent} \n" - f"\n" - ) - ## Footer with list of page labels - if arg_show_labels == True: - footer_rst = (f"...." - f"\n" - f"\n**Page labels**: {arg_page_labels} \n") + full_url = src + + # Only download Confluence assets + if '/download/' in src or '/images/icons/' in src: + filename = unquote(os.path.basename(urlparse(src).path)) + local_path = os.path.join(outdir_attachments, filename) + + if download_file(full_url, local_path, auth_info): + img['src'] = f"../attachments/{filename}" + else: + print(f" Warning: Could not download image {src}", file=sys.stderr) + + # 3. Link Rewriting (The Smart Logic) + for a in soup.find_all('a'): + href = a.get('href') + if not href: continue + + target_id = None + + # Attempt to extract Page ID from the link + linked_id = a.get('data-linked-resource-id') + resource_type = a.get('data-linked-resource-type') + + if linked_id and (not resource_type or resource_type == 'page'): + target_id = linked_id + elif '/pages/' in href: + # Data Center URL pattern detection + match = re.search(r'/pages/(\d+)', href) + if match: target_id = match.group(1) + elif 'pageId=' in href: + # Query param detection + try: + target_id = re.search(r'pageId=(\d+)', href).group(1) + except: + pass + + # Decision Logic + if target_id and target_id in valid_ids: + # CASE A: Page is in our export -> Make relative offline link + a['href'] = f"{target_id}.html" else: - footer_rst = "" - - rst_file = open(rst_file_path, 'w', encoding='utf-8') - rst_file.write(rst_page_header) - rst_file.write(output_rst) - rst_file.write(footer_rst) - rst_file.close() - print(f"Exported RST file: {rst_file_path}") - if arg_html_output == False: - os.remove(html_file_path) - return page_url, rst_file_path + # CASE B: Page is NOT in export (or external link) -> Ensure absolute online link + # If it's a relative link (starts with /), prepend the base_url + if href.startswith('/'): + a['href'] = base_url.rstrip('/') + href + # If it's already absolute (http...), leave it alone. + + return str(soup) + + +# --- API Calls (Updated for export_view) --- +# Note: Removed print statements to keep output clean for progress bars. + +def get_page_full(pageId, base_url, platform_config, auth_info, context_path_override): + # print(f"Fetching details for page: {pageId}") # DISABLED + params = {'expand': 'body.export_view,version,ancestors,space,metadata.labels'} + path_params = {'pageId': pageId} + + url = _build_api_url(base_url, platform_config, context_path_override, 'url_get_page', path_params) + + data = _execute_get_request(url, auth_info, params=params) + if not data: return None + + spaceKey = data.get('space', {}).get('key') + if spaceKey: + data['view_url'] = get_page_view_url(base_url, platform_config, context_path_override, spaceKey, pageId) + + return data + + +def get_page_basic(pageId, base_url, platform_config, auth_info, context_path_override): + path_params = {'pageId': pageId} + url = _build_api_url(base_url, platform_config, context_path_override, 'url_get_page', path_params) + return _execute_get_request(url, auth_info) + + +def get_page_children(pageId, base_url, platform_config, auth_info, context_path_override): + # print(f"Fetching children for page: {pageId}") # DISABLED + url = _build_api_url(base_url, platform_config, context_path_override, 'url_cql_search') + params = {'cql': f'parent={pageId}', 'limit': 200} + return _execute_get_request(url, auth_info, params=params) + + +def get_page_attachments(pageId, base_url, platform_config, auth_info, context_path_override): + # print(f"Fetching attachment list for page: {pageId}") # DISABLED + path_params = {'pageId': pageId} + url = _build_api_url(base_url, platform_config, context_path_override, 'url_get_attachments', path_params) + params = {'limit': 200} + return _execute_get_request(url, auth_info, params=params) + + +def get_pages_from_space(spaceKey, start, limit, base_url, platform_config, auth_info, context_path_override): + # print(f"Fetching pages for space '{spaceKey}' ({start}-{start+limit})") # DISABLED + url = _build_api_url(base_url, platform_config, context_path_override, 'url_cql_search') + params = {'cql': f'space="{spaceKey}"', 'start': start, 'limit': limit} + return _execute_get_request(url, auth_info, params=params) + + +def get_pages_by_label(label, start, limit, base_url, platform_config, auth_info, context_path_override): + # print(f"Fetching pages with label '{label}' ({start}-{start+limit})") # DISABLED + url = _build_api_url(base_url, platform_config, context_path_override, 'url_cql_search') + params = {'cql': f'label="{label}"', 'start': start, 'limit': limit} + return _execute_get_request(url, auth_info, params=params) + + +def get_all_spaces(base_url, platform_config, auth_info, context_path_override): + # print("Fetching all spaces...") # DISABLED + url = _build_api_url(base_url, platform_config, context_path_override, 'url_get_all_spaces') + params = {'limit': 200} + return _execute_get_request(url, auth_info, params=params) \ No newline at end of file diff --git a/confluence_products.ini b/confluence_products.ini new file mode 100644 index 0000000..21ec98e --- /dev/null +++ b/confluence_products.ini @@ -0,0 +1,27 @@ +[cloud] +platform_type = cloud +# Cloud uses Basic Auth with User (Email) + API Token +auth_method = basic_api_token +# Cloud has a fixed, non-configurable base path +base_path = /wiki +# API / URL Templates +# (We assume the original script uses the v1 REST API) +url_get_page = /rest/api/content/{pageId} +url_get_attachments = /rest/api/content/{pageId}/child/attachment +url_cql_search = /rest/api/content/search +url_get_all_spaces = /rest/api/space +url_view_page = /spaces/{spaceKey}/pages/{pageId} + +[dc] +platform_type = dc +# DC prefers Bearer Auth with a Personal Access Token (PAT) +auth_method = bearer_pat +# DC has a variable context path; this is a sensible default +default_context_path = /wiki +# API / URL Templates +# Note: {context_path} is a placeholder that will be filled in. +url_get_page = {context_path}/rest/api/content/{pageId} +url_get_attachments = {context_path}/rest/api/content/{pageId}/child/attachment +url_cql_search = {context_path}/rest/api/content/search +url_get_all_spaces = {context_path}/rest/api/space +url_view_page = {context_path}/pages/viewpage.action?pageId={pageId} diff --git a/requirements.txt b/requirements.txt index 1486649..19c5b38 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,5 @@ beautifulsoup4 Pillow pandoc pypandoc -requests \ No newline at end of file +requests +tqdm \ No newline at end of file diff --git a/styles/site.css b/styles/site.css new file mode 100644 index 0000000..5201a7e --- /dev/null +++ b/styles/site.css @@ -0,0 +1,10242 @@ +/* module-key = 'com.atlassian.auiplugin:aui-reset', location = 'src/less/aui-reset.less' */ +html, +p, +div, +h1, +h2, +h3, +h4, +h5, +h6, +img, +pre, +form, +fieldset { + margin: 0; + padding: 0 +} + +body { + margin-top: 10px; + margin-right: 30px; + margin-bottom: 50px; + margin-left: 30px; +} + +ul, +ol, +dl { + margin: 0 +} + +img, +fieldset { + border: 0 +} + +@-moz-document url-prefix() { + img { + font-size: 0 + } + + img:-moz-broken { + font-size: inherit + } +} + +details, +main, +summary { + display: block +} + +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline +} + +audio:not([controls]) { + display: none; + height: 0 +} + +[hidden], +template { + display: none +} + +input[type="button"], +input[type="submit"], +input[type="reset"] { + -webkit-appearance: button +} + +/* module-key = 'com.atlassian.auiplugin:aui-page-typography', location = 'src/less/aui-page-typography.less' */ +body { + color: #333; + font-family: Arial, sans-serif; + font-size: 14px; + line-height: 1.42857142857143 +} + +[lang|=en] { + font-family: Arial, sans-serif +} + +[lang|=ja] { + font-family: "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ Pro W3", "メイリオ", Meiryo, "ï¼­ï¼³ Pゴシック", Verdana, Arial, sans-serif +} + +p, +ul, +ol, +dl, +h1, +h2, +h3, +h4, +h5, +h6, +blockquote, +pre, +form.aui, +table.aui, +.aui-tabs, +.aui-panel, +.aui-group { + margin: 10px 0 0 0 +} + +p:first-child, +ul:first-child, +ol:first-child, +dl:first-child, +h1:first-child, +h2:first-child, +h3:first-child, +h4:first-child, +h5:first-child, +h6:first-child, +blockquote:first-child, +pre:first-child, +form.aui:first-child, +table.aui:first-child, +.aui-tabs:first-child, +.aui-panel:first-child, +.aui-group:first-child { + margin-top: 0 +} + +h1, +.aui-page-header-hero .aui-page-header-main h1, +.aui-page-header-hero .aui-page-header-main h2, +.aui-page-header-marketing .aui-page-header-main h1, +.aui-page-header-marketing .aui-page-header-main h2 { + color: #333; + font-size: 32px; + font-weight: normal; + line-height: 1.25; + text-transform: none; + margin: 30px 0 0 0 +} + +h2 { + color: #333; + font-size: 24px; + font-weight: normal; + line-height: 1.25; + text-transform: none; + margin: 30px 0 0 0 +} + +h3, +.aui-page-header-hero .aui-page-header-main p, +.aui-page-header-marketing .aui-page-header-main p { + color: #333; + font-size: 20px; + font-weight: normal; + line-height: 1.5; + text-transform: none; + margin: 30px 0 0 0 +} + +h4 { + color: #333; + font-size: 16px; + font-weight: bold; + line-height: 1.25; + text-transform: none; + margin: 20px 0 0 0 +} + +h5 { + color: #333; + font-size: 14px; + font-weight: bold; + line-height: 1.42857143; + text-transform: none; + margin: 20px 0 0 0 +} + +h6 { + color: #707070; + font-size: 12px; + font-weight: bold; + line-height: 1.66666667; + text-transform: uppercase; + margin: 20px 0 0 0 +} + +h1:first-child, +h2:first-child, +h3:first-child, +h4:first-child, +h5:first-child, +h6:first-child { + margin-top: 0 +} + +h1+h2, +h2+h3, +h3+h4, +h4+h5, +h5+h6 { + margin-top: 10px +} + +.aui-group>.aui-item>h1:first-child, +.aui-group>.aui-item>h2:first-child, +.aui-group>.aui-item>h3:first-child, +.aui-group>.aui-item>h4:first-child, +.aui-group>.aui-item>h5:first-child, +.aui-group>.aui-item>h6:first-child { + margin-top: 20px +} + +.aui-group:first-child>.aui-item>h1:first-child, +.aui-group:first-child>.aui-item>h2:first-child, +.aui-group:first-child>.aui-item>h3:first-child, +.aui-group:first-child>.aui-item>h4:first-child, +.aui-group:first-child>.aui-item>h5:first-child, +.aui-group:first-child>.aui-item>h6:first-child { + margin-top: 0 +} + +small { + color: #707070; + font-size: 12px; + line-height: 1.33333333333333 +} + +code, +kbd { + font-family: monospace +} + +var, +address, +dfn, +cite { + font-style: italic +} + +cite:before { + content: "\2014 \2009" +} + +blockquote { + border-left: 1px solid #ccc; + color: #707070; + margin-left: 19px; + padding: 10px 20px +} + +blockquote>cite { + display: block; + margin-top: 10px +} + +q { + color: #707070 +} + +q:before { + content: open-quote +} + +q:after { + content: close-quote +} + +abbr { + border-bottom: 1px #707070 dotted; + cursor: help +} + +/* module-key = 'com.atlassian.auiplugin:aui-avatars', location = 'src/less/aui-avatars.less' */ +.aui-avatar { + box-sizing: border-box; + display: inline-block; + vertical-align: text-bottom +} + +.aui-avatar-inner { + display: table-cell; + vertical-align: middle +} + +.aui-avatar img { + border-radius: 3px; + display: block; + margin: 0 auto; + height: 100%; + width: 100% +} + +.aui-avatar-xsmall, +.aui-avatar-xsmall .aui-avatar-inner { + height: 16px; + width: 16px +} + +.aui-avatar-small, +.aui-avatar-small .aui-avatar-inner { + height: 24px; + width: 24px +} + +.aui-avatar-medium, +.aui-avatar-medium .aui-avatar-inner { + height: 32px; + width: 32px +} + +.aui-avatar-large, +.aui-avatar-large .aui-avatar-inner { + height: 48px; + width: 48px +} + +.aui-avatar-xlarge, +.aui-avatar-xlarge .aui-avatar-inner { + height: 64px; + width: 64px +} + +.aui-avatar-xxlarge, +.aui-avatar-xxlarge .aui-avatar-inner { + height: 96px; + width: 96px +} + +.aui-avatar-xxxlarge, +.aui-avatar-xxxlarge .aui-avatar-inner { + height: 128px; + width: 128px +} + +.aui-avatar-xsmall .aui-avatar-inner img { + max-height: 16px; + max-width: 16px +} + +.aui-avatar-small .aui-avatar-inner img { + max-height: 24px; + max-width: 24px +} + +.aui-avatar-medium .aui-avatar-inner img { + max-height: 32px; + max-width: 32px +} + +.aui-avatar-large .aui-avatar-inner img { + max-height: 48px; + max-width: 48px +} + +.aui-avatar-xlarge .aui-avatar-inner img { + max-height: 64px; + max-width: 64px +} + +.aui-avatar-xxlarge .aui-avatar-inner img { + max-height: 96px; + max-width: 96px +} + +.aui-avatar-xxxlarge .aui-avatar-inner img { + max-height: 128px; + max-width: 128px +} + +.aui-avatar-xxlarge img, +.aui-avatar-xxxlarge img { + border-radius: 5px +} + +.aui-avatar-project { + background-color: #fff; + box-shadow: 0 0 0 1px #ccc; + position: relative +} + +.aui-avatar-project, +.aui-avatar-project img { + border-radius: 100% +} + +.aui-avatar-project img { + height: auto; + max-height: 100%; + max-width: 100%; + width: auto +} + +.aui-avatar-project:before { + border-radius: 100%; + border: 1px solid #ccc; + bottom: -1px; + content: ""; + left: -1px; + position: absolute; + right: -1px; + top: -1px +} + +/* module-key = 'com.atlassian.auiplugin:aui-page-layout', location = 'src/less/aui-page-layout.less' */ +.aui-header, +#footer { + clear: both; + float: left; + width: 100% +} + +#content { + box-sizing: border-box; + clear: both; + position: relative +} + +#content:before { + content: ""; + clear: both; + display: table +} + +#footer .footer-body a { + color: #707070 +} + +#footer .footer-body>ul, +#footer .footer-body>p { + margin: 10px 0 0 0 +} + +#footer .footer-body>ul:first-child, +#footer .footer-body>p:first-child { + margin: 0 +} + +#footer .footer-body>ul { + display: block; + font-size: 0; + list-style: none; + padding: 0 +} + +#footer .footer-body>ul>li { + display: inline-block; + font-size: 12px; + line-height: 1.66666666666667; + padding: 0; + white-space: nowrap +} + +#footer .footer-body>ul>li+li { + margin-left: 10px +} + +#footer .footer-body>ul>li:after { + content: "\b7"; + margin-left: 10px; + speak: none +} + +#footer .footer-body>ul>li:last-child:after { + display: none +} + +.aui-group { + display: table; + box-sizing: border-box; + border-spacing: 0; + table-layout: fixed; + width: 100% +} + +.aui-group>.aui-item { + box-sizing: border-box; + display: table-cell; + margin: 0; + vertical-align: top +} + +.aui-group>.aui-item+.aui-item { + padding-left: 20px +} + +.aui-layout .aui-group>header { + display: table-caption +} + +.aui-group.aui-group-split>.aui-item { + text-align: right +} + +.aui-group.aui-group-split>.aui-item:first-child { + text-align: left +} + +.aui-group.aui-group-trio>.aui-item { + text-align: left +} + +.aui-group.aui-group-trio>.aui-item+.aui-item { + text-align: center +} + +.aui-group.aui-group-trio>.aui-item+.aui-item+.aui-item { + text-align: right +} + +#content { + margin: 0; + padding: 0 +} + +body { + background: #f5f5f5; + color: #333 +} + +a { + color: #3572b0; + text-decoration: none +} + +a:focus, +a:hover, +a:active { + text-decoration: underline +} + +#footer .footer-body { + color: #707070; + font-size: 12px; + line-height: 1.66666666666667; + margin: 20px 0; + padding: 0 10px 21px 10px; + min-height: 44px; + text-align: center +} + +#content>.aui-panel { + background: #fff; + margin: 20px 0 0 0; + padding: 20px; + border-color: #ccc; + border-style: solid; + border-width: 1px 0 +} + +#content>.aui-page-header { + padding: 20px +} + +#content>.aui-page-header+.aui-panel { + margin-top: 0 +} + +#content>.aui-page-header:first-child { + margin-top: 0 +} + +.aui-panel+.aui-panel { + margin-top: 20px +} + +/*! AUI Page Panel */ +.aui-page-panel { + background: #fff; + border: 1px solid #ccc; + border-left-width: 0; + border-right-width: 0; + box-sizing: border-box; + clear: both; + display: block; + margin: 20px 0 0 0; + padding: 0; + position: relative; + width: 100% +} + +.aui-page-panel-inner { + border-spacing: 0; + display: table; + table-layout: fixed; + width: 100% +} + +.aui-page-panel-nav, +.aui-page-panel-content, +.aui-page-panel-item, +.aui-page-panel-sidebar { + box-sizing: border-box; + display: table-cell; + padding: 20px; + vertical-align: top +} + +.aui-page-panel-nav { + border-right: 1px solid #ccc; + width: 240px +} + +.aui-page-panel-sidebar { + width: 35% +} + +.aui-page-panel-item { + padding: 0 +} + +.aui-page-panel-nav~.aui-page-panel-sidebar { + width: 30% +} + +.aui-page-header+.aui-page-panel, +.aui-navbar+.aui-page-panel { + margin-top: 0 +} + +.aui-navbar+.aui-page-panel { + border-top: none +} + +.aui-page-panel-nav>.aui-nav-vertical { + margin-left: -10px; + margin-right: -10px +} + +.aui-page-focused .aui-page-header, +.aui-page-focused .aui-page-panel, +.aui-page-focused #footer .footer-body, +.aui-page-notification .aui-page-header, +.aui-page-notification .aui-page-panel, +.aui-page-notification #footer .footer-body, +.aui-page-fixed .aui-header-inner, +.aui-page-fixed .aui-page-header-inner, +.aui-page-fixed .aui-navgroup-horizontal .aui-navgroup-inner, +.aui-page-fixed .aui-page-panel-inner, +.aui-page-fixed #footer .footer-body, +.aui-page-hybrid .aui-page-header, +.aui-page-hybrid .aui-navgroup-horizontal .aui-navgroup-inner, +.aui-page-hybrid .aui-page-panel-inner, +.aui-page-hybrid #footer .footer-body { + margin-left: auto; + margin-right: auto; + width: 980px +} + +.aui-page-fixed .aui-header-inner, +.aui-page-fixed .aui-navgroup-horizontal .aui-navgroup-inner, +.aui-page-hybrid .aui-navgroup-horizontal .aui-navgroup-inner { + width: 1000px +} + +.aui-page-focused-small .aui-page-header, +.aui-page-size-small .aui-page-header, +.aui-page-focused-small .aui-page-panel, +.aui-page-size-small .aui-page-panel, +.aui-page-focused-small #footer .footer-body, +.aui-page-size-small #footer .footer-body { + width: 400px +} + +.aui-page-focused-medium .aui-page-header, +.aui-page-size-medium .aui-page-header, +.aui-page-focused-medium .aui-page-panel, +.aui-page-size-medium .aui-page-panel, +.aui-page-focused-medium #footer .footer-body, +.aui-page-size-medium #footer .footer-body { + width: 600px +} + +.aui-page-focused-large .aui-page-header, +.aui-page-size-large .aui-page-header, +.aui-page-focused-large .aui-page-panel, +.aui-page-size-large .aui-page-panel, +.aui-page-focused-large #footer .footer-body, +.aui-page-size-large #footer .footer-body { + width: 800px +} + +.aui-page-focused-xlarge .aui-page-header, +.aui-page-size-xlarge .aui-page-header, +.aui-page-focused-xlarge .aui-page-panel, +.aui-page-size-xlarge .aui-page-panel, +.aui-page-focused-xlarge #footer .footer-body, +.aui-page-size-xlarge #footer .footer-body { + width: 980px +} + +.aui-page-focused .aui-page-panel, +.aui-page-notification .aui-page-panel { + border-radius: 5px; + border-width: 1px +} + +.aui-page-fixed .aui-page-panel-inner, +.aui-page-fixed #content>.aui-page-header { + padding-left: 0; + padding-right: 0 +} + +.aui-page-fixed .aui-page-panel-nav:first-child, +.aui-page-fixed .aui-page-panel-content:first-child, +.aui-page-fixed .aui-page-panel-item:first-child, +.aui-page-fixed .aui-page-panel-sidebar:first-child, +.aui-page-hybrid .aui-page-panel-nav:first-child, +.aui-page-hybrid .aui-page-panel-content:first-child, +.aui-page-hybrid .aui-page-panel-item:first-child, +.aui-page-hybrid .aui-page-panel-sidebar:first-child { + padding-left: 0 +} + +.aui-page-fixed .aui-page-panel-nav:last-child, +.aui-page-fixed .aui-page-panel-content:last-child, +.aui-page-fixed .aui-page-panel-item:last-child, +.aui-page-fixed .aui-page-panel-sidebar:last-child, +.aui-page-hybrid .aui-page-panel-nav:last-child, +.aui-page-hybrid .aui-page-panel-content:last-child, +.aui-page-hybrid .aui-page-panel-item:last-child, +.aui-page-hybrid .aui-page-panel-sidebar:last-child { + padding-right: 0 +} + +.aui-page-panel .aui-page-header { + width: auto +} + +.aui-page-panel .aui-page-header-inner { + width: 100% +} + +#content>.aui-tabs { + margin: 20px; + background: transparent +} + +#content>.aui-tabs>.tabs-pane { + padding: 20px +} + +#content>.aui-tabs.horizontal-tabs>.tabs-pane { + border: 1px solid #ccc; + border-radius: 3px; + background: #fff +} + +#content>.aui-tabs.horizontal-tabs>.tabs-menu { + display: table +} + +.aui-page-focused .aui-page-panel-content>h2:first-child, +.aui-page-notification .aui-page-panel-content>h1:first-child { + border-bottom: 1px solid #ccc; + margin-bottom: 20px; + padding-bottom: 20px +} + +.aui-page-notification .aui-page-panel { + margin-top: 50px +} + +.aui-page-notification .aui-page-panel-content { + color: #707070; + padding: 40px; + text-align: center +} + +.aui-page-notification .aui-page-panel-content .aui-page-notification-description { + font-size: 20px +} + +.aui-page-notification .aui-page-panel-content form.aui .text { + margin-right: 10px +} + +.aui-page-notification-details { + margin: 0 auto; + max-width: 90%; + width: 980px +} + +.aui-page-notification-details-header { + color: #707070; + margin: 20px auto 0; + position: relative; + text-align: center +} + +.aui-page-notification-details-header-expander::before { + border-top: 1px solid #ccc; + content: ''; + display: block; + left: 0; + position: absolute; + right: 0; + top: 50% +} + +.aui-page-notification-details-header-expander .aui-expander-trigger { + background-color: #f5f5f5; + display: inline-block; + padding: 10px; + position: relative +} + +.aui-page-focused .aui-page-panel-content>form.aui .buttons-container { + border-top: 1px solid #ccc; + margin-top: 20px; + padding-top: 20px +} + +@media screen and (max-width:767px) { + html.aui-responsive .aui-group>.aui-item { + display: block; + width: auto + } + + html.aui-responsive .aui-group>.aui-item+.aui-item { + padding-left: 0; + padding-top: 10px + } + + html.aui-responsive .aui-group.aui-group-split>.aui-item, + html.aui-responsive .aui-group.aui-group-trio>.aui-item, + html.aui-responsive .aui-group.aui-group-split>.aui-item+.aui-item, + html.aui-responsive .aui-group.aui-group-trio>.aui-item+.aui-item, + html.aui-responsive .aui-group.aui-group-split>.aui-item+.aui-item+.aui-item, + html.aui-responsive .aui-group.aui-group-trio>.aui-item+.aui-item+.aui-item { + text-align: left + } + + html.aui-responsive .aui-page-fixed #content>.aui-page-header, + html.aui-responsive .aui-page-hybrid #content>.aui-page-header, + html.aui-responsive .aui-page-fixed .aui-page-panel-inner, + html.aui-responsive .aui-page-hybrid .aui-page-panel-inner, + html.aui-responsive .aui-page-fixed .aui-header-inner, + html.aui-responsive .aui-page-hybrid .aui-header-inner, + html.aui-responsive .aui-page-fixed .aui-navgroup-horizontal .aui-navgroup-inner, + html.aui-responsive .aui-page-hybrid .aui-navgroup-horizontal .aui-navgroup-inner, + html.aui-responsive .aui-page-fixed #footer .footer-body, + html.aui-responsive .aui-page-hybrid #footer .footer-body { + box-sizing: border-box; + width: 100% + } + + html.aui-responsive .aui-page-header-inner { + display: block; + width: 100% + } + + html.aui-responsive .aui-page-header-actions { + display: block; + width: auto; + text-align: left; + margin-top: 20px; + padding-left: 0; + padding-right: 20px + } +} + +@media screen and (max-width:800px) { + + html.aui-responsive .aui-page-hybrid .aui-page-header, + html.aui-responsive .aui-page-hybrid .aui-page-panel-inner, + html.aui-responsive .aui-page-hybrid .aui-page-fixed .aui-header-inner, + html.aui-responsive .aui-page-hybrid .aui-navgroup-horizontal .aui-navgroup-inner { + box-sizing: border-box; + width: 100% + } +} + +@media screen and (max-width:1023px) { + + html.aui-responsive .aui-page-fixed #content>.aui-page-header, + html.aui-responsive .aui-page-hybrid #content>.aui-page-header, + html.aui-responsive .aui-page-fixed .aui-page-panel-inner, + html.aui-responsive .aui-page-hybrid .aui-page-panel-inner { + padding-left: 20px; + padding-right: 20px + } + + html.aui-responsive .aui-page-panel-content, + html.aui-responsive .aui-page-panel-sidebar { + display: block; + padding-left: 0; + padding-right: 0; + width: auto + } + + html.aui-responsive .aui-page-fixed .aui-header-inner, + html.aui-responsive .aui-page-fixed .aui-page-header-inner, + html.aui-responsive .aui-page-fixed .aui-page-panel-inner, + html.aui-responsive .aui-page-fixed #footer .footer-body { + box-sizing: border-box; + width: 100% + } +} + +html.aui-responsive #footer .footer-body>ul>li { + white-space: normal +} + +@media screen and (max-width:400px) { + + html.aui-responsive .aui-page-focused-small .aui-page-header, + html.aui-responsive .aui-page-focused-small .aui-page-panel { + box-sizing: border-box; + width: 100% + } + + html.aui-responsive .aui-page-focused-small .aui-page-panel { + margin-top: 0 + } + + html.aui-responsive .aui-page-focused-small .aui-page-panel { + border-radius: 0; + border-left: 0; + border-right: 0 + } +} + +@media screen and (max-width:600px) { + + html.aui-responsive .aui-page-focused-medium .aui-page-header, + html.aui-responsive .aui-page-focused-medium .aui-page-panel { + box-sizing: border-box; + width: 100% + } + + html.aui-responsive .aui-page-focused-medium .aui-page-panel { + margin-top: 0 + } + + html.aui-responsive .aui-page-focused-medium .aui-page-panel { + border-radius: 0; + border-left: 0; + border-right: 0 + } +} + +@media screen and (max-width:800px) { + + html.aui-responsive .aui-page-focused-large .aui-page-header, + html.aui-responsive .aui-page-focused-large .aui-page-panel { + box-sizing: border-box; + width: 100% + } + + html.aui-responsive .aui-page-focused-large .aui-page-panel { + margin-top: 0 + } + + html.aui-responsive .aui-page-focused-large .aui-page-panel { + border-radius: 0; + border-left: 0; + border-right: 0 + } +} + +@media screen and (max-width:980px) { + + html.aui-responsive .aui-page-focused-xlarge .aui-page-header, + html.aui-responsive .aui-page-focused-xlarge .aui-page-panel { + box-sizing: border-box; + width: 100% + } + + html.aui-responsive .aui-page-focused-xlarge .aui-page-panel { + margin-top: 0 + } + + html.aui-responsive .aui-page-focused-xlarge .aui-page-panel { + border-radius: 0; + border-left: 0; + border-right: 0 + } +} + +/* module-key = 'com.atlassian.auiplugin:aui-page-layout', location = 'src/less/adg-page-layout.less' */ +#footer .footer-body, +#footer-logo a { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTE0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMTE0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiM3MDcwNzAiPjxnPjxwYXRoIGQ9Ik0yNy4yMDYuMjY1Yy0uMTEyLS4xNTQtLjI5Mi0uMjQ3LS40OC0uMjQ3LS4wOTcgMC0uMTkyLjAyNS0uMjc2LjA3Mi0zLjUxNyAxLjk3Ni03LjU5NCAzLjAyLTExLjc5IDMuMDIyLTQuMTk2IDAtOC4yNzItMS4wNDYtMTEuNzktMy4wMi0uMDgzLS4wNS0uMTc4LS4wNzQtLjI3NS0uMDc0LS4xODggMC0uMzY4LjA5My0uNDguMjQ3LS4xNjYuMjI3LS4xNy42MDguMTEyLjgzNSAxLjc2IDEuMzQ4IDMuNzAzIDIuNCA1Ljc3IDMuMTIgMi4xNDQuNzQ2IDQuMzg2IDEuMTI1IDYuNjYzIDEuMTI2IDIuMjc4IDAgNC41Mi0uMzggNi42NjMtMS4xMjYgMi4wNjgtLjcyIDQuMDEtMS43NzIgNS43NzMtMy4xMi4yOC0uMjI3LjI3Ni0uNjA4LjExLS44MzUiLz48cGF0aCBkPSJNMTQuNjYzIDcuMzM2Yy45IDAgMS40Mi0uMDU1IDEuNjA0LS4wNTUuMjIyIDAgLjQzNC4xODguNDM0LjQ1IDAgLjA3NS0uMDE2LjEzLS4wMzQuMTc4LS4xMi4zMjctLjY2MyAxLjUwNC0xLjY3NCAyLjUxNC0uMTE0LjExMy0uMjQyLjEzNS0uMzMuMTM1aC0uMDAyYy0uMDg4IDAtLjIxNy0uMDIyLS4zMy0uMTM1LTEuMDEyLTEuMDEtMS41NTYtMi4xODctMS42NzUtMi41MTQtLjAxOC0uMDQ4LS4wMzUtLjEwMy0uMDM1LS4xOCAwLS4yNi4yMTItLjQ0Ny40MzQtLjQ0Ny4xODMgMCAuNzA1LjA1NiAxLjYwMy4wNTZoLjAwNiIvPjxwYXRoIGQ9Ik0yMy4xNjQgNS44OTRjLS4wODQtLjA2Ni0uMTg0LS4xLS4yODYtLjEtLjA1NyAwLS4xMTQuMDEtLjE3LjAzMi0xLjAxOC40LTIuMDUzLjcwNC0yLjk5OC45My0uMTkyLjA0Ni0uMzQ4LjE5My0uNDEzLjM3LS42ODggMS45MzUtMi40NDYgMy43NzctNC4yOSA1LjcwOC0uMDc0LjA3Mi0uMTc4LjE2Ny0uMzQ2LjE2Ny0uMTY4IDAtLjI3LS4wOS0uMzQ2LS4xNjYtMS44NDQtMS45My0zLjYtMy43NjctNC4yOS01LjcwMi0uMDY0LS4xNzYtLjIyLS4zMjMtLjQxMy0uMzctLjk0NC0uMjI1LTEuOTgyLS41NC0zLS45NC0uMDU0LS4wMi0uMTEtLjAzLS4xNjgtLjAzLS4xMDIgMC0uMi4wMzItLjI4NS4wOTgtLjEzLjEwMi0uMTk4LjI2OC0uMTgzLjQyNy4xNTYgMS42MS43NzYgMy4xODMgMS44OTQgNC44MyAxLjA1IDEuNTUgMi40MjIgMi45ODYgMy43NDcgNC4zNzMgMi40NDMgMi41NTcgNC43NSA0Ljk3MiA0Ljk1MiA3Ljc3Mi4wMTguMjUyLjIyMy40NDguNDcuNDQ4aDIuODdjLjEzIDAgLjI1Mi0uMDU1LjM0Mi0uMTUuMDg3LS4wOTcuMTM0LS4yMjYuMTI4LS4zNTgtLjA5LTEuODcyLS43NzctMy43NDctMi4wOTgtNS43My0uMjc3LS40MTctLjU3NC0uODIyLS44ODQtMS4yMTgtLjEyNi0uMTYtLjA3NC0uMzYuMDIzLS40NjJsLjI4Ni0uMzAyYzEuMzI2LTEuMzg3IDIuNjk2LTIuODIyIDMuNzQ4LTQuMzcyIDEuMTE4LTEuNjQ4IDEuNzM3LTMuMjEyIDEuODkzLTQuODIuMDE2LS4xNjMtLjA1Ni0uMzM1LS4xODMtLjQzNCIvPjxwYXRoIGQ9Ik0xMS41ODIgMTcuNjk4Yy0uMDY4LS4wNzItLjE2OC0uMTQ3LS4zMzUtLjE0Ny0uMjE0IDAtLjM0LjE1My0uMzkuMjI4LTEuMjA2IDEuODg1LTEuODMgMy42NjQtMS45MTYgNS40NTItLjAwNS4xMzIuMDQyLjI2My4xMy4zNi4wOS4wOTUuMjE1LjE1LjM0NC4xNWgyLjg2NWMuMjQ1IDAgLjQ1My0uMTk4LjQ3LS40NS4wNjMtLjg2Mi4zMjUtMS43MjYuOC0yLjYzMy4xNjUtLjMxNC4wMzctLjYxLS4wNTgtLjczNS0uNDcyLS42My0xLjA1LTEuMzAyLTEuOTEtMi4yMjQiLz48L2c+PGc+PHBhdGggZD0iTTM0LjA3IDYuNDU3Yy0uMDU3LS4xODYtLjIyNS0uMzEzLS40MTUtLjMxM2gtNC4wNjhjLS4xOSAwLS4zNTguMTI3LS40MTUuMzEzTDI0LjA0IDIzLjE2Yy0uMDQuMTM2LS4wMTguMjg0LjA2NS40LjA4Mi4xMTQuMjEyLjE4Mi4zNS4xODJoMi44Yy4xOTQgMCAuMzY0LS4xMy40Mi0uMzJsMy41MzMtMTIuMjg1cy4wOTItLjMwNy40MTItLjMwN2MuMzI2IDAgLjQwNS4zMi40MDUuMzJsMS42NCA1LjgyNEgzMS40NmMtLjE5NSAwLS4zNjcuMTMzLS40Mi4zMjZsLS42MzIgMi4zMDdjLS4wMzcuMTM1LS4wMS4yOC4wNzMuMzkuMDgyLjExMi4yMS4xNzguMzQ3LjE3OGgzLjc1bC45OSAzLjI1M2MuMDU1LjE4Ni4yMjQuMzE0LjQxNS4zMTRoMi44Yy4xNCAwIC4yNy0uMDY4LjM1My0uMTgzLjA4Mi0uMTE2LjEwNS0uMjY0LjA2NC0uNEwzNC4wNyA2LjQ1NyIvPjxwYXRoIGQ9Ik00Ni4yNyAyMS4xNjhjLS4wMi0uMTI1LS4wODctLjIzNi0uMTktLjMwNi0uMTAyLS4wNy0uMjI3LS4wOTItLjM0Ny0uMDYyLS40NTQuMTE2LS44OS4xOC0xLjIyNi4xOC0uNjM3IDAtLjkyLS4yODMtLjkyLS45MnYtNi40aDIuNWMuMjQgMCAuNDM1LS4yLjQzNS0uNDQ2di0xLjk5NmMwLS4yNDctLjE5NS0uNDQ3LS40MzYtLjQ0N2gtMi41VjcuNjljMC0uMTMtLjA1NS0uMjUzLS4xNS0uMzM4LS4wOTUtLjA4NS0uMjIyLS4xMjQtLjM0Ni0uMTA2bC0yLjU3NC4zNjhjLS4yMTYuMDMtLjM3Ni4yMi0uMzc2LjQ0M3YyLjcxNGgtMS40MDJjLS4yNCAwLS40MzYuMi0uNDM2LjQ0OHYxLjk5NmMwIC4yNDcuMTk1LjQ0Ny40MzYuNDQ3aDEuNDAydjYuODE0YzAgMi4zNCAxLjE5OCAzLjUyNiAzLjU2IDMuNTI2LjY3NCAwIDEuODE2LS4xNiAyLjU2My0uNDI1LjE5OC0uMDcuMzItLjI3Ny4yODgtLjQ5bC0uMjgtMS45MTciLz48cGF0aCBkPSJNNTEuMDM2IDUuODE4SDQ4LjQ2Yy0uMjQgMC0uNDM1LjItLjQzNS40NDh2MTcuMDI4YzAgLjI0OC4xOTYuNDQ4LjQzNi40NDhoMi41NzZjLjI0IDAgLjQzNS0uMi40MzUtLjQ0OFY2LjI2NmMwLS4yNDgtLjE5NC0uNDQ4LS40MzQtLjQ0OCIvPjxwYXRoIGQ9Ik01OS4zODMgMTguOTg2djEuNTU2Yy0uNDI3LjIzMy0xLjIuNTY4LTIuMTMuNTY4LS44MDMgMC0xLjA0Ny0uMjUtMS4wNDctMS4wNzUgMC0uOC4xNS0xLjA1IDEuMDk3LTEuMDVoMi4wOHptLTEuNzI4LTguNDc0Yy0xLjMwMyAwLTIuODkuMjEtNC4wNC41MzgtLjIxNS4wNi0uMzUuMjc3LS4zMTQuNTAybC4zMDIgMS45MThjLjAyLjEyLjA4NC4yMjYuMTguMjk2LjA5Ny4wNy4yMTcuMDk1LjMzNC4wNzIgMS4wNy0uMjE0IDIuMTc1LS4zMzIgMy4xMS0uMzMyIDEuODYgMCAyLjE1Ny40MDMgMi4xNTcgMS42OTV2MS4xMjhoLTIuNzZjLTIuNjM3IDAtMy43NjMgMS4xMTYtMy43NjMgMy43MzMgMCAyLjUwNCAxLjIzNCAzLjk0IDMuMzg1IDMuOTQgMS4yNDUgMCAyLjQ5LS4zNTQgMy41MzgtMS4wMDNsLjExLjQxNWMuMDUyLjE5NS4yMjQuMzMuNDIuMzNoMi4wOGMuMjQgMCAuNDM2LS4yLjQzNi0uNDQ4di04LjA0YzAtMy40NTctMS40MDMtNC43NDItNS4xNzUtNC43NDJ6Ii8+PHBhdGggZD0iTTY5LjI4IDE1LjcxNGMtMS41OTgtLjQyMy0xLjU5OC0uNDQtMS41OTgtMS4zNCAwLS42MDQuMDYtLjg5NCAxLjM3NS0uODk0LjkwMiAwIDIuMjMyLjE2MiAzLjA4Ni4zMTIuMTE4LjAyLjIzOC0uMDEuMzM0LS4wODIuMDk1LS4wNzMuMTU4LS4xODMuMTcyLS4zMDRsLjI0Mi0yLjAxNGMuMDI3LS4yMjctLjExNi0uNDQtLjMzNC0uNDktLjk4OC0uMjM3LTIuMzYyLS4zOS0zLjUtLjM5LTMuOTYgMC00Ljc3IDEuNTM0LTQuNzcgMy44MzYgMCAyLjUzMi40NTcgMy4zODMgMy40OSA0LjE0IDIgLjQ5NSAyIC44NiAyIDEuNDcgMCAuNzk4LS4wNjggMS4wNzQtMS4zNzYgMS4wNzQtMS4wNTMgMC0yLjI3LS4xNjgtMy4zNDMtLjQ2Mi0uMTItLjAzMi0uMjQ0LS4wMTItLjM0Ny4wNTUtLjEwMy4wNjYtLjE3My4xNzQtLjE5NS4yOTdsLS4zNCAxLjkxYy0uMDQuMjIyLjA4Ni40MzguMjk0LjUwNyAxLjE3LjM4OCAyLjg0Ny42NiA0LjA4LjY2IDMuODM1IDAgNC42Mi0xLjY0NyA0LjYyLTQuMTIgMC0yLjczLS40NzItMy4yMzctMy44OTItNC4xNjYiLz48cGF0aCBkPSJNNzkuMjI3IDE1LjcxNGMtMS41OTctLjQyMy0xLjU5Ny0uNDQtMS41OTctMS4zNCAwLS42MDQuMDU4LS44OTQgMS4zNzQtLjg5NC45MDIgMCAyLjIzMi4xNjIgMy4wODcuMzEyLjExOC4wMi4yNC0uMDEuMzM0LS4wODIuMDk2LS4wNzMuMTU4LS4xODMuMTczLS4zMDRsLjI0Mi0yLjAxNGMuMDI3LS4yMjctLjExNy0uNDQtLjMzNC0uNDktLjk4OC0uMjM3LTIuMzYzLS4zOS0zLjUwMi0uMzktMy45NiAwLTQuNzcgMS41MzQtNC43NyAzLjgzNiAwIDIuNTMyLjQ1OCAzLjM4MyAzLjQ5MyA0LjE0IDEuOTk3LjQ5NSAxLjk5Ny44NiAxLjk5NyAxLjQ3IDAgLjc5OC0uMDY2IDEuMDc0LTEuMzc0IDEuMDc0LTEuMDUzIDAtMi4yNzItLjE2OC0zLjM0NC0uNDYyLS4xMTctLjAzMi0uMjQzLS4wMTItLjM0NS4wNTUtLjEwMi4wNjYtLjE3My4xNzQtLjE5NS4yOTdsLS4zNCAxLjkxYy0uMDQuMjIyLjA4Ni40MzguMjk0LjUwNyAxLjE2OC4zODggMi44NDcuNjYgNC4wOC42NiAzLjgzNCAwIDQuNjItMS42NDcgNC42Mi00LjEyIDAtMi43My0uNDczLTMuMjM3LTMuODkzLTQuMTY2Ii8+PHBhdGggZD0iTTg3LjU2IDUuODE4aC0yLjU3NmMtLjI0IDAtLjQzNi4yLS40MzYuNDQ3VjguNmMwIC4yNDguMTk2LjQ0OC40MzYuNDQ4aDIuNTc1Yy4yNCAwIC40MzUtLjIuNDM1LS40NDdWNi4yNjZjMC0uMjQ3LS4xOTYtLjQ0Ny0uNDM2LS40NDciLz48cGF0aCBkPSJNODcuNTYgMTAuNzdoLTIuNTc2Yy0uMjQgMC0uNDM2LjItLjQzNi40NDh2MTIuMDc2YzAgLjI0OC4xOTYuNDQ4LjQzNi40NDhoMi41NzVjLjI0IDAgLjQzNS0uMi40MzUtLjQ0OFYxMS4yMThjMC0uMjQ3LS4xOTYtLjQ0Ny0uNDM2LS40NDciLz48cGF0aCBkPSJNOTUuOTcgMTguOTg2djEuNTU2Yy0uNDI2LjIzMy0xLjIuNTY4LTIuMTMuNTY4LS44MDIgMC0xLjA0Ny0uMjUtMS4wNDctMS4wNzUgMC0uOC4xNTItMS4wNSAxLjA5OC0xLjA1aDIuMDh6bS0xLjcyNy04LjQ3NGMtMS4zMDMgMC0yLjg5LjIxLTQuMDQuNTM4LS4yMTUuMDYtLjM1LjI3Ny0uMzE1LjUwMmwuMzAyIDEuOTE4Yy4wMi4xMi4wODQuMjI2LjE4LjI5Ni4wOTcuMDcuMjE3LjA5NS4zMzMuMDcyIDEuMDctLjIxNCAyLjE3Ni0uMzMyIDMuMTEyLS4zMzIgMS44NTggMCAyLjE1NS40MDMgMi4xNTUgMS42OTV2MS4xMjhoLTIuNzZjLTIuNjM3IDAtMy43NjIgMS4xMTYtMy43NjIgMy43MzMgMCAyLjUwNCAxLjIzNCAzLjk0IDMuMzg1IDMuOTQgMS4yNDQgMCAyLjQ5LS4zNTQgMy41MzgtMS4wMDNsLjExLjQxNWMuMDUzLjE5NS4yMjUuMzMuNDIuMzNoMi4wOGMuMjQgMCAuNDM3LS4yLjQzNy0uNDQ4di04LjA0YzAtMy40NTctMS40MDMtNC43NDItNS4xNzQtNC43NDJ6Ii8+PHBhdGggZD0iTTEwOC45MzggMTAuNTEyYy0xLjM2NCAwLTMuMjIzLjQ4My00Ljc5MyAxLjI0bC0uMTg4LS42NmMtLjA1NC0uMTktLjIyNS0uMzItLjQxOC0uMzJoLTEuOTA4Yy0uMjQgMC0uNDM2LjItLjQzNi40NDZ2MTIuMDc2YzAgLjI0OC4xOTYuNDQ4LjQzNi40NDhoMi41NzVjLjI0IDAgLjQzNi0uMi40MzYtLjQ0OFYxNC45M2MuOTI3LS40ODQgMi4yMy0uOTg0IDMuMDEtLjk4NC41OCAwIC43OTYuMjIuNzk2LjgxNnY4LjUzMmMwIC4yNDguMTk1LjQ0OC40MzUuNDQ4aDIuNTc1Yy4yNCAwIC40MzUtLjIuNDM1LS40NDh2LTguODY4YzAtMi41OTctLjk5NC0zLjkxNC0yLjk1Ny0zLjkxNCIvPjwvZz48L2c+PC9zdmc+) center bottom no-repeat; + background-size: 114px 24px +} + +#footer-logo { + background: #f5f5f5; + position: relative; + bottom: -21px +} + +#footer-logo a { + display: block; + height: 24px; + margin: 0 auto; + text-align: left; + text-indent: -9999em; + width: 114px +} + +#footer-logo a:focus, +#footer-logo a:hover, +#footer-logo a:active { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTE0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMTE0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnPjxnIGZpbGw9IiM1QkE1Q0UiPjxwYXRoIGQ9Ik0yNy4yMDYuMjY1Yy0uMTEyLS4xNTQtLjI5Mi0uMjQ3LS40OC0uMjQ3LS4wOTcgMC0uMTkyLjAyNS0uMjc2LjA3Mi0zLjUxNyAxLjk3Ni03LjU5NCAzLjAyLTExLjc5IDMuMDIyLTQuMTk2IDAtOC4yNzItMS4wNDYtMTEuNzktMy4wMi0uMDgzLS4wNS0uMTc4LS4wNzQtLjI3NS0uMDc0LS4xODggMC0uMzY4LjA5My0uNDguMjQ3LS4xNjYuMjI3LS4xNy42MDguMTEyLjgzNSAxLjc2IDEuMzQ4IDMuNzAzIDIuNCA1Ljc3IDMuMTIgMi4xNDQuNzQ2IDQuMzg2IDEuMTI1IDYuNjYzIDEuMTI2IDIuMjc4IDAgNC41Mi0uMzggNi42NjMtMS4xMjYgMi4wNjgtLjcyIDQuMDEtMS43NzIgNS43NzMtMy4xMi4yOC0uMjI3LjI3Ni0uNjA4LjExLS44MzUiLz48cGF0aCBkPSJNMTQuNjYzIDcuMzM2Yy45IDAgMS40Mi0uMDU1IDEuNjA0LS4wNTUuMjIyIDAgLjQzNC4xODguNDM0LjQ1IDAgLjA3NS0uMDE2LjEzLS4wMzQuMTc4LS4xMi4zMjctLjY2MyAxLjUwNC0xLjY3NCAyLjUxNC0uMTE0LjExMy0uMjQyLjEzNS0uMzMuMTM1aC0uMDAyYy0uMDg4IDAtLjIxNy0uMDIyLS4zMy0uMTM1LTEuMDEyLTEuMDEtMS41NTYtMi4xODctMS42NzUtMi41MTQtLjAxOC0uMDQ4LS4wMzUtLjEwMy0uMDM1LS4xOCAwLS4yNi4yMTItLjQ0Ny40MzQtLjQ0Ny4xODMgMCAuNzA1LjA1NiAxLjYwMy4wNTZoLjAwNiIvPjxwYXRoIGQ9Ik0yMy4xNjQgNS44OTRjLS4wODQtLjA2Ni0uMTg0LS4xLS4yODYtLjEtLjA1NyAwLS4xMTQuMDEtLjE3LjAzMi0xLjAxOC40LTIuMDUzLjcwNC0yLjk5OC45My0uMTkyLjA0Ni0uMzQ4LjE5My0uNDEzLjM3LS42ODggMS45MzUtMi40NDYgMy43NzctNC4yOSA1LjcwOC0uMDc0LjA3Mi0uMTc4LjE2Ny0uMzQ2LjE2Ny0uMTY4IDAtLjI3LS4wOS0uMzQ2LS4xNjYtMS44NDQtMS45My0zLjYtMy43NjctNC4yOS01LjcwMi0uMDY0LS4xNzYtLjIyLS4zMjMtLjQxMy0uMzctLjk0NC0uMjI1LTEuOTgyLS41NC0zLS45NC0uMDU0LS4wMi0uMTEtLjAzLS4xNjgtLjAzLS4xMDIgMC0uMi4wMzItLjI4NS4wOTgtLjEzLjEwMi0uMTk4LjI2OC0uMTgzLjQyNy4xNTYgMS42MS43NzYgMy4xODMgMS44OTQgNC44MyAxLjA1IDEuNTUgMi40MjIgMi45ODYgMy43NDcgNC4zNzMgMi40NDMgMi41NTcgNC43NSA0Ljk3MiA0Ljk1MiA3Ljc3Mi4wMTguMjUyLjIyMy40NDguNDcuNDQ4aDIuODdjLjEzIDAgLjI1Mi0uMDU1LjM0Mi0uMTUuMDg3LS4wOTcuMTM0LS4yMjYuMTI4LS4zNTgtLjA5LTEuODcyLS43NzctMy43NDctMi4wOTgtNS43My0uMjc3LS40MTctLjU3NC0uODIyLS44ODQtMS4yMTgtLjEyNi0uMTYtLjA3NC0uMzYuMDIzLS40NjJsLjI4Ni0uMzAyYzEuMzI2LTEuMzg3IDIuNjk2LTIuODIyIDMuNzQ4LTQuMzcyIDEuMTE4LTEuNjQ4IDEuNzM3LTMuMjEyIDEuODkzLTQuODIuMDE2LS4xNjMtLjA1Ni0uMzM1LS4xODMtLjQzNCIvPjxwYXRoIGQ9Ik0xMS41ODIgMTcuNjk4Yy0uMDY4LS4wNzItLjE2OC0uMTQ3LS4zMzUtLjE0Ny0uMjE0IDAtLjM0LjE1My0uMzkuMjI4LTEuMjA2IDEuODg1LTEuODMgMy42NjQtMS45MTYgNS40NTItLjAwNS4xMzIuMDQyLjI2My4xMy4zNi4wOS4wOTUuMjE1LjE1LjM0NC4xNWgyLjg2NWMuMjQ1IDAgLjQ1My0uMTk4LjQ3LS40NS4wNjMtLjg2Mi4zMjUtMS43MjYuOC0yLjYzMy4xNjUtLjMxNC4wMzctLjYxLS4wNTgtLjczNS0uNDcyLS42My0xLjA1LTEuMzAyLTEuOTEtMi4yMjQiLz48L2c+PGcgZmlsbD0iIzI3NDk3MCI+PHBhdGggZD0iTTM0LjA3IDYuNDU3Yy0uMDU3LS4xODYtLjIyNS0uMzEzLS40MTUtLjMxM2gtNC4wNjhjLS4xOSAwLS4zNTguMTI3LS40MTUuMzEzTDI0LjA0IDIzLjE2Yy0uMDQuMTM2LS4wMTguMjg0LjA2NS40LjA4Mi4xMTQuMjEyLjE4Mi4zNS4xODJoMi44Yy4xOTQgMCAuMzY0LS4xMy40Mi0uMzJsMy41MzMtMTIuMjg1cy4wOTItLjMwNy40MTItLjMwN2MuMzI2IDAgLjQwNS4zMi40MDUuMzJsMS42NCA1LjgyNEgzMS40NmMtLjE5NSAwLS4zNjcuMTMzLS40Mi4zMjZsLS42MzIgMi4zMDdjLS4wMzcuMTM1LS4wMS4yOC4wNzMuMzkuMDgyLjExMi4yMS4xNzguMzQ3LjE3OGgzLjc1bC45OSAzLjI1M2MuMDU1LjE4Ni4yMjQuMzE0LjQxNS4zMTRoMi44Yy4xNCAwIC4yNy0uMDY4LjM1My0uMTgzLjA4Mi0uMTE2LjEwNS0uMjY0LjA2NC0uNEwzNC4wNyA2LjQ1NyIvPjxwYXRoIGQ9Ik00Ni4yNyAyMS4xNjhjLS4wMi0uMTI1LS4wODctLjIzNi0uMTktLjMwNi0uMTAyLS4wNy0uMjI3LS4wOTItLjM0Ny0uMDYyLS40NTQuMTE2LS44OS4xOC0xLjIyNi4xOC0uNjM3IDAtLjkyLS4yODMtLjkyLS45MnYtNi40aDIuNWMuMjQgMCAuNDM1LS4yLjQzNS0uNDQ2di0xLjk5NmMwLS4yNDctLjE5NS0uNDQ3LS40MzYtLjQ0N2gtMi41VjcuNjljMC0uMTMtLjA1NS0uMjUzLS4xNS0uMzM4LS4wOTUtLjA4NS0uMjIyLS4xMjQtLjM0Ni0uMTA2bC0yLjU3NC4zNjhjLS4yMTYuMDMtLjM3Ni4yMi0uMzc2LjQ0M3YyLjcxNGgtMS40MDJjLS4yNCAwLS40MzYuMi0uNDM2LjQ0OHYxLjk5NmMwIC4yNDcuMTk1LjQ0Ny40MzYuNDQ3aDEuNDAydjYuODE0YzAgMi4zNCAxLjE5OCAzLjUyNiAzLjU2IDMuNTI2LjY3NCAwIDEuODE2LS4xNiAyLjU2My0uNDI1LjE5OC0uMDcuMzItLjI3Ny4yODgtLjQ5bC0uMjgtMS45MTciLz48cGF0aCBkPSJNNTEuMDM2IDUuODE4SDQ4LjQ2Yy0uMjQgMC0uNDM1LjItLjQzNS40NDh2MTcuMDI4YzAgLjI0OC4xOTYuNDQ4LjQzNi40NDhoMi41NzZjLjI0IDAgLjQzNS0uMi40MzUtLjQ0OFY2LjI2NmMwLS4yNDgtLjE5NC0uNDQ4LS40MzQtLjQ0OCIvPjxwYXRoIGQ9Ik01OS4zODMgMTguOTg2djEuNTU2Yy0uNDI3LjIzMy0xLjIuNTY4LTIuMTMuNTY4LS44MDMgMC0xLjA0Ny0uMjUtMS4wNDctMS4wNzUgMC0uOC4xNS0xLjA1IDEuMDk3LTEuMDVoMi4wOHptLTEuNzI4LTguNDc0Yy0xLjMwMyAwLTIuODkuMjEtNC4wNC41MzgtLjIxNS4wNi0uMzUuMjc3LS4zMTQuNTAybC4zMDIgMS45MThjLjAyLjEyLjA4NC4yMjYuMTguMjk2LjA5Ny4wNy4yMTcuMDk1LjMzNC4wNzIgMS4wNy0uMjE0IDIuMTc1LS4zMzIgMy4xMS0uMzMyIDEuODYgMCAyLjE1Ny40MDMgMi4xNTcgMS42OTV2MS4xMjhoLTIuNzZjLTIuNjM3IDAtMy43NjMgMS4xMTYtMy43NjMgMy43MzMgMCAyLjUwNCAxLjIzNCAzLjk0IDMuMzg1IDMuOTQgMS4yNDUgMCAyLjQ5LS4zNTQgMy41MzgtMS4wMDNsLjExLjQxNWMuMDUyLjE5NS4yMjQuMzMuNDIuMzNoMi4wOGMuMjQgMCAuNDM2LS4yLjQzNi0uNDQ4di04LjA0YzAtMy40NTctMS40MDMtNC43NDItNS4xNzUtNC43NDJ6Ii8+PHBhdGggZD0iTTY5LjI4IDE1LjcxNGMtMS41OTgtLjQyMy0xLjU5OC0uNDQtMS41OTgtMS4zNCAwLS42MDQuMDYtLjg5NCAxLjM3NS0uODk0LjkwMiAwIDIuMjMyLjE2MiAzLjA4Ni4zMTIuMTE4LjAyLjIzOC0uMDEuMzM0LS4wODIuMDk1LS4wNzMuMTU4LS4xODMuMTcyLS4zMDRsLjI0Mi0yLjAxNGMuMDI3LS4yMjctLjExNi0uNDQtLjMzNC0uNDktLjk4OC0uMjM3LTIuMzYyLS4zOS0zLjUtLjM5LTMuOTYgMC00Ljc3IDEuNTM0LTQuNzcgMy44MzYgMCAyLjUzMi40NTcgMy4zODMgMy40OSA0LjE0IDIgLjQ5NSAyIC44NiAyIDEuNDcgMCAuNzk4LS4wNjggMS4wNzQtMS4zNzYgMS4wNzQtMS4wNTMgMC0yLjI3LS4xNjgtMy4zNDMtLjQ2Mi0uMTItLjAzMi0uMjQ0LS4wMTItLjM0Ny4wNTUtLjEwMy4wNjYtLjE3My4xNzQtLjE5NS4yOTdsLS4zNCAxLjkxYy0uMDQuMjIyLjA4Ni40MzguMjk0LjUwNyAxLjE3LjM4OCAyLjg0Ny42NiA0LjA4LjY2IDMuODM1IDAgNC42Mi0xLjY0NyA0LjYyLTQuMTIgMC0yLjczLS40NzItMy4yMzctMy44OTItNC4xNjYiLz48cGF0aCBkPSJNNzkuMjI3IDE1LjcxNGMtMS41OTctLjQyMy0xLjU5Ny0uNDQtMS41OTctMS4zNCAwLS42MDQuMDU4LS44OTQgMS4zNzQtLjg5NC45MDIgMCAyLjIzMi4xNjIgMy4wODcuMzEyLjExOC4wMi4yNC0uMDEuMzM0LS4wODIuMDk2LS4wNzMuMTU4LS4xODMuMTczLS4zMDRsLjI0Mi0yLjAxNGMuMDI3LS4yMjctLjExNy0uNDQtLjMzNC0uNDktLjk4OC0uMjM3LTIuMzYzLS4zOS0zLjUwMi0uMzktMy45NiAwLTQuNzcgMS41MzQtNC43NyAzLjgzNiAwIDIuNTMyLjQ1OCAzLjM4MyAzLjQ5MyA0LjE0IDEuOTk3LjQ5NSAxLjk5Ny44NiAxLjk5NyAxLjQ3IDAgLjc5OC0uMDY2IDEuMDc0LTEuMzc0IDEuMDc0LTEuMDUzIDAtMi4yNzItLjE2OC0zLjM0NC0uNDYyLS4xMTctLjAzMi0uMjQzLS4wMTItLjM0NS4wNTUtLjEwMi4wNjYtLjE3My4xNzQtLjE5NS4yOTdsLS4zNCAxLjkxYy0uMDQuMjIyLjA4Ni40MzguMjk0LjUwNyAxLjE2OC4zODggMi44NDcuNjYgNC4wOC42NiAzLjgzNCAwIDQuNjItMS42NDcgNC42Mi00LjEyIDAtMi43My0uNDczLTMuMjM3LTMuODkzLTQuMTY2Ii8+PHBhdGggZD0iTTg3LjU2IDUuODE4aC0yLjU3NmMtLjI0IDAtLjQzNi4yLS40MzYuNDQ3VjguNmMwIC4yNDguMTk2LjQ0OC40MzYuNDQ4aDIuNTc1Yy4yNCAwIC40MzUtLjIuNDM1LS40NDdWNi4yNjZjMC0uMjQ3LS4xOTYtLjQ0Ny0uNDM2LS40NDciLz48cGF0aCBkPSJNODcuNTYgMTAuNzdoLTIuNTc2Yy0uMjQgMC0uNDM2LjItLjQzNi40NDh2MTIuMDc2YzAgLjI0OC4xOTYuNDQ4LjQzNi40NDhoMi41NzVjLjI0IDAgLjQzNS0uMi40MzUtLjQ0OFYxMS4yMThjMC0uMjQ3LS4xOTYtLjQ0Ny0uNDM2LS40NDciLz48cGF0aCBkPSJNOTUuOTcgMTguOTg2djEuNTU2Yy0uNDI2LjIzMy0xLjIuNTY4LTIuMTMuNTY4LS44MDIgMC0xLjA0Ny0uMjUtMS4wNDctMS4wNzUgMC0uOC4xNTItMS4wNSAxLjA5OC0xLjA1aDIuMDh6bS0xLjcyNy04LjQ3NGMtMS4zMDMgMC0yLjg5LjIxLTQuMDQuNTM4LS4yMTUuMDYtLjM1LjI3Ny0uMzE1LjUwMmwuMzAyIDEuOTE4Yy4wMi4xMi4wODQuMjI2LjE4LjI5Ni4wOTcuMDcuMjE3LjA5NS4zMzMuMDcyIDEuMDctLjIxNCAyLjE3Ni0uMzMyIDMuMTEyLS4zMzIgMS44NTggMCAyLjE1NS40MDMgMi4xNTUgMS42OTV2MS4xMjhoLTIuNzZjLTIuNjM3IDAtMy43NjIgMS4xMTYtMy43NjIgMy43MzMgMCAyLjUwNCAxLjIzNCAzLjk0IDMuMzg1IDMuOTQgMS4yNDQgMCAyLjQ5LS4zNTQgMy41MzgtMS4wMDNsLjExLjQxNWMuMDUzLjE5NS4yMjUuMzMuNDIuMzNoMi4wOGMuMjQgMCAuNDM3LS4yLjQzNy0uNDQ4di04LjA0YzAtMy40NTctMS40MDMtNC43NDItNS4xNzQtNC43NDJ6Ii8+PHBhdGggZD0iTTEwOC45MzggMTAuNTEyYy0xLjM2NCAwLTMuMjIzLjQ4My00Ljc5MyAxLjI0bC0uMTg4LS42NmMtLjA1NC0uMTktLjIyNS0uMzItLjQxOC0uMzJoLTEuOTA4Yy0uMjQgMC0uNDM2LjItLjQzNi40NDZ2MTIuMDc2YzAgLjI0OC4xOTYuNDQ4LjQzNi40NDhoMi41NzVjLjI0IDAgLjQzNi0uMi40MzYtLjQ0OFYxNC45M2MuOTI3LS40ODQgMi4yMy0uOTg0IDMuMDEtLjk4NC41OCAwIC43OTYuMjIuNzk2LjgxNnY4LjUzMmMwIC4yNDguMTk1LjQ0OC40MzUuNDQ4aDIuNTc1Yy4yNCAwIC40MzUtLjIuNDM1LS40NDh2LTguODY4YzAtMi41OTctLjk5NC0zLjkxNC0yLjk1Ny0zLjkxNCIvPjwvZz48L2c+PC9zdmc+); + background-size: 114px 24px +} + +/* module-key = 'com.atlassian.auiplugin:internal-basic-css', location = 'src/less/basic.less' */ +/*! Atlassian UI and the Atlassian Design Guidelines are created by Atlassian. See https://developer.atlassian.com/display/AUI/ and https://developer.atlassian.com/design/ for license details. */ +.clear { + clear: both +} + +.hidden, +form.aui .hidden, +form.aui .field-group.hidden, +form.aui fieldset.hidden { + display: none +} + +.assistive, +form.aui legend.assistive { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px +} + +.aui-box-shadow { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13) +} + +.aui-dialog.aui-box-shadow { + box-shadow: none +} + +/* module-key = 'com.atlassian.auiplugin:dropdown', location = 'src/less/dropdown.less' */ +.aui-dd-parent { + position: relative +} + +.aui-dd-parent span a.aui-dd-trigger, +.aui-dd-parent a.aui-dd-trigger { + background: transparent url('data:image/gif;base64,R0lGODlhQQAaAJEDAP///zc3N21tbf///yH5BAEAAAMALAAAAABBABoAAALznA+ny+0PI5hs2psMxmjb5VEKh0BJeA3o13lNNprqetJxVWo5/M6rj7qBNLDiiZhS+SoUHi6opLGApSTy+Ki5lLNclyfSkTjOYZmqS3PPVRtb3Mvi5FKuAzt8We29+jsap1f2c7XRsgV1F7HI2Ngo4Bgp6ShQyVCJmQlpoKl50Jm5AGqp4PkJATkaqopZOtqwWYo6wGpZG0sLe8q5i3tJWwvMKvsLvGu82cnbKmo7q7p8GxsaTcrZ6isqrJxrzHvdDX5q6pkta04dPv3tkBpsPq77kA1fDV2fi96eHq572/9L3z560K69MggKoal2kxo6HFAAADs=') no-repeat -13px 0; + border: none; + color: #000; + display: block; + height: 13px; + padding: 0; + text-indent: -9999px; + width: 13px +} + +.aui-dd-parent a.aui-dd-trigger.active, +.aui-dd-parent a.aui-dd-trigger:hover, +.aui-dd-parent a.aui-dd-trigger:active, +.aui-dd-parent a.aui-dd-trigger:focus { + background-position: -26px 0; + border: none; + color: #000 +} + +.aui-dd-parent span a.aui-dd-trigger { + position: absolute; + right: 5px; + top: 8px +} + +.aui-dd-parent span a.aui-dd-trigger.unstyled, +.aui-dd-parent a.aui-dd-trigger.unstyled { + background: none; + border: none; + color: inherit; + display: block; + height: auto; + text-indent: 0; + width: auto +} + +.aui-dd-parent a.aui-dd-trigger-unstyled.active, +.aui-dd-parent a.aui-dd-trigger-unstyled:hover, +.aui-dd-parent a.aui-dd-trigger-unstyled:active, +.aui-dd-parent a.aui-dd-trigger-unstyled:focus { + background: none; + border: none; + color: inherit +} + +.aui-dd-parent span a.aui-dd-trigger-unstyled { + position: absolute; + right: auto; + top: auto +} + +.aui-dropdown { + list-style-type: none +} + +.aui-dd-parent .aui-dropdown, +.aui-dropdown, +.aui-dd-parent .aui-shadow-parent { + background: #fff; + border: 1px solid #ccc; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); + color: #000; + margin-top: -1px; + padding: 4px 0 4px 0; + position: absolute; + z-index: 2003 +} + +.aui-dd-parent .aui-dropdown-left { + left: 0px +} + +.aui-dd-parent .aui-dropdown-right { + right: 0px +} + +.aui-dd-parent .aui-shadow { + right: 5px +} + +.aui-dd-parent .aui-dropdown li.dropdown-item, +.aui-dropdown li.dropdown-item { + background: #fff; + color: #000; + display: block; + float: none; + margin: 0; + position: static +} + +.aui-dd-parent .aui-dropdown a.item-link, +.aui-dropdown a.item-link { + background: #fff; + color: #333; + display: inline-block; + float: none; + height: auto; + padding: 4px 14px 3px 12px; + position: static; + text-decoration: none; + text-indent: 0; + white-space: nowrap; + width: auto +} + +.aui-dd-parent .aui-dropdown a.item-link:link, +.aui-dd-parent .aui-dropdown a.item-link:visited, +.aui-dropdown a.item-link:link, +.aui-dropdown a.item-link:visited { + background: #fff; + color: #333 +} + +.aui-dd-parent .aui-dropdown li.dropdown-item.active a.item-link, +.aui-dd-parent .aui-dropdown a.item-link:hover, +.aui-dd-parent .aui-dropdown a.item-link:active, +.aui-dd-parent .aui-dropdown a.item-link:focus, +.aui-dropdown a.item-link:hover, +.aui-dropdown a.item-link:active, +.aui-dropdown a.item-link:focus { + background: #3572b0; + color: #fff +} + +.aui-dd-parent .aui-dropdown li.dropdown-item a.item-link span.icon { + display: inline-block +} + +div.shim { + position: absolute +} + +/* module-key = 'com.atlassian.auiplugin:icons', location = 'src/less/icons.less' */ +.aui-icon { + background-repeat: no-repeat; + background-position: 0 0; + border: none; + display: inline-block; + height: 16px; + margin: 0; + padding: 0; + text-align: left; + text-indent: -999em; + vertical-align: text-bottom; + width: 16px +} + +.aui-icon-small, +.aui-icon-large { + line-height: 0; + position: relative; + vertical-align: text-top +} + +.aui-icon-small { + height: 16px; + width: 16px +} + +.aui-icon-large { + height: 32px; + width: 32px +} + +.aui-icon-small:before, +.aui-icon-large:before { + color: inherit; + font-family: "Atlassian Icons"; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-style: normal; + left: 0; + line-height: 1; + position: absolute; + text-indent: 0; + speak: none; + top: 50% +} + +.aui-icon-small:before { + font-size: 16px; + margin-top: -8px +} + +.aui-icon-large:before { + font-size: 32px; + margin-top: -16px +} + +.icon-move, +.icon-move-d, +.icon-dropdown, +.icon-dropdown-d, +.icon-dropdown-active, +.icon-dropdown-active-d, +.icon-minimize, +.icon-minimize-d, +.icon-maximize, +.icon-maximize-d { + background-repeat: no-repeat +} + +.aui-icon.icon-move, +.aui-icon.icon-move-d, +.aui-icon.icon-dropdown, +.aui-icon.icon-dropdown-d, +.aui-icon.icon-dropdown-active, +.aui-icon.icon-dropdown-active-d, +.aui-icon.icon-minimize, +.aui-icon.icon-minimize-d, +.aui-icon.icon-maximize, +.aui-icon.icon-maximize-d { + background-position: 0 0 !important; + height: 13px; + vertical-align: baseline; + width: 13px +} + +.icon-move { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANAQAAAABakNnRAAAAAnRSTlMAAHaTzTgAAAAlSURBVHgBY2BiYGBnYOBvADGUFBiSDBj+/wCSIDYTSBwoC2QAAF4LBNQUu22rAAAAAElFTkSuQmCC'); + cursor: move +} + +.icon-move-d { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAAAAABXgLugAAAAAnRSTlMAAHaTzTgAAAAtSURBVHgBY4CAXDAJ4+TmInOgXAyVuXAMIuC8XCBGBqhyMBaaSTjtg3DQVQIAa64U3lyaxpQAAAAASUVORK5CYII='); + cursor: move +} + +.icon-dropdown { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAQAAADY4iz3AAAAKUlEQVQY02NgwAf+YwFQCezKKZRCtwdFF4oD0A1ESFDBGVil8IQGbgAAiaBjnU8tP0kAAAAASUVORK5CYII=') +} + +.icon-dropdown-d { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAQAAADY4iz3AAAAKklEQVQY02NgwAdy/2NCqAR25RRKoduDogvFAegGIiSo4AysUnhCAzcAAJOYRxkKj+5hAAAAAElFTkSuQmCC') +} + +.icon-dropdown-active { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAQAAADY4iz3AAAAKElEQVQY02NgwAf+YwE4JaCSlEhh2o2kC91RKAYyoPOo7kI8oYEbAACHhecZSiXhsAAAAABJRU5ErkJggg==') +} + +.icon-dropdown-active-d { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAQAAADY4iz3AAAAKElEQVQY02NgwAdy/2NCnBJQSUqkMO1G0oXuKBQDGdB5VHchntDADQAE0qTxqu2HqgAAAABJRU5ErkJggg==') +} + +.icon-minimize { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAQAAADY4iz3AAAAHklEQVQY02NgwAf+YwE4JaCS5Epht3/wSOEJDdwAAFcvh3lwBRT4AAAAAElFTkSuQmCC') +} + +.icon-minimize-d { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAQAAADY4iz3AAAAH0lEQVQY02NgwAdy/2NCnBJQSXKlsNs/eKTwhAZuAAAbK2Cx/Io00wAAAABJRU5ErkJggg==') +} + +.icon-maximize { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAQAAADY4iz3AAAAJUlEQVQY02NgIAT+YwDipNBNwS+F3SjCUtjdSoYDiJDC6VncAAAKY3uF7U/mdQAAAABJRU5ErkJggg==') +} + +.icon-maximize-d { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAQAAADY4iz3AAAAJklEQVQY02NgIARy/6ND4qTQTcEvhd0owlLY3UqGA4iQwulZ3AAAn8BYKXiL6OYAAAAASUVORK5CYII=') +} + +form.aui .icon-date, +.aui-icon-date { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAARElEQVR4AWMoIBGANFgXr8dE927fw0TkaCDLSf/B4O7duwQZ5Gq4iwNccDGHI4gIARuA6tAYJGig1En0DyVMQFcnkQgA7103vYurRvEAAAAASUVORK5CYII=') +} + +form.aui .icon-range, +.aui-icon-range { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAARklEQVR4AWMoIBGANFgXr8dEd7EBcjSQ5aT/YAA0gCCDXA0Q911wMSeIUGwA8gkyyNWAsJRyJ6F5mmQNhJ2EFtN0ijgSAQD0WQfB7IGD0QAAAABJRU5ErkJggg==') +} + +form.aui .icon-required, +.aui-icon-required { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAARUlEQVR4AWOAgQsu5v8ZSAIIjaVAbA4yAEqXkmpAMxDfABkApZtJNYARiHtABkBpRlIN0AbiK0AcBMQrQHyGkQdGwSgAAPtCJnBUV/TSAAAAAElFTkSuQmCC') +} + +form.aui .icon-users, +.aui-icon-users { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAArElEQVR4AWOgCbAuXi8HxLuA+DOUliPVgN1A/B8J78epuKCgwBOIn0GxJ9SAz2gG/MSllgHK+Q/Fz/C5AFMtpuBzWBhADfkCpeWxqoUKeoE4QPwExMbhU9LUAm2UAuK9IL8D8R4glmQgYLIGCCMZsBYtDNZiqkUIlCH5qxxqwCc0Az5jVQsVfI4k+A5qwH90jEstA4SDwLgNwFQ7jAy4gSR4F2rAaTQDjuFSCwBFeGK4drVwMAAAAABJRU5ErkJggg==') +} + +form.aui .icon-help, +.aui-icon-help, +form.aui .icon-inline-help, +.aui-icon-inline-help { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABG0lEQVR4AU2RNVYtQRiE+7m7IxHRlRxnHWwAty9lDbg7K4AUh7kJ7vDwEGLcvU6f6cP8NVJVXe3GFWGqWedSWBcLm2DxjmZuuSFGgxATu9X/tWt+zTAPdBNnnBNHl5whP0KDRJm1ezjimn6SpArlNhqRCLd02eA0h+SSzS47PJfuUEvEUMMN/yR/8UC5DVaKJej/T6PVGNbxjC1SeKtvBgfMawQVHhuGS9oC+8ninGW3XNq4MlwRDAyzx1enFDgxbOAFAhP0BpTHf7dIZyW64f1F1hqi3NLhW584Ej77StskKkIjD5Ra6y0bwlvLC7inyR31iCJd2MF5Zs+0U84wr58uq5U7bvBoEDxupBrVHCwi1LLJNaf8F4s4/xGiuqDPs2tUOAAAAABJRU5ErkJggg==') +} + +.aui-message .icon-close, +.aui-icon-close { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAOUlEQVR4AWOgGogCQjQ+KrcfCKMw+MgCECEMHqYSdGlMJZjSCCWo0oQVELaCsCMJe5NwQBEOasoBAGP2Kx0Yi3q/AAAAAElFTkSuQmCC') +} + +.aui-message .icon-close-inverted, +.aui-message.error .icon-close, +.aui-icon-close-inverted { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAOklEQVR4AWOgFvi/4P8CdD4qFwQWYPCRBSBCGDxMJejSmEowpRFKUKUJKyBsBWFHEvYm4YAiHNSUAwDHH6hxrraMqwAAAABJRU5ErkJggg==') +} + +.aui-icon-dropdown { + border: 4px solid transparent; + border-top-color: #333; + content: ""; + display: inline-block; + height: 0; + overflow: hidden; + text-align: left; + text-indent: -999em; + position: relative; + vertical-align: baseline; + width: 0 +} + +.aui-button[aria-disabled="true"] .aui-icon, +.aui-button[disabled] .aui-icon { + color: rgba(112, 112, 112, 0.5) +} + +/* module-key = 'com.atlassian.auiplugin:icons', location = 'src/less/adg-icons.less' */ +.aui-icon-wait { + background-image: url(data:image/gif;base64,R0lGODlhEAAQAPMPALu7u5mZmTMzM93d3REREQAAAHd3d1VVVWZmZqqqqoiIiO7u7kRERCIiIgARAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBwAPACwAAAAAEAAQAEAEcPDJtyg6dUrFetDTIopMoSyFcxxD1krD8AwCkASDIlPaUDQLR6G1Cy0SgqIkE1IQGMrFAKCcGWSBzwPAnAwarcKQ15MpTMJYd1ZyUDXSDGelBY0qIoBh/ZoYGgELCjoxCRRvIQcGD1kzgSAgAACQDxEAIfkEBQcADwAsAAAAAA8AEAAABF3wyfkMkotOJpscRKJJwtI4Q1MAoxQ0RFBw0xEvhGAVRZZJh4JgMAEQW7TWI4EwGFjKR+CAQECjn8DoN0kwDtvBT8FILAKJgfoo1iAGAPNVY9DGJXNMIHN/HJVqIxEAIfkEBQcADwAsAAAAABAADwAABFrwyfmColgiydpaQiY5x9Ith7hURdIl0wBIhpCAjKIIxaAUPQ0hFQsAC7MJALFSFi4SgC4wyHyuCYNWxH3AuhSEotkNGAALAPqqkigG8MWAjAnM4A8594vPUyIAIfkEBQcADwAsAAAAABAAEAAABF3wySkDvdKsddg+APYIWrcg2DIRQAcU6DJICjIsjBEETLEEBYLqYSDdJoCGiHgZwG4LQCCRECEIBAdoF5hdEIWwgBJqDs7DgcKyRHZl3uUwuhm2AbNNW+LV7yd+FxEAIfkEBQcACAAsAAAAABAADgAABEYQyYmMoVgeWQrP3NYhBCgZBdAFRUkdBIAUguVVo1ZsWFcEGB5GMBkEjiCBL2a5ZAi+m2SAURExwKqPiuCafBkvBSCcmiYRACH5BAUHAA4ALAAAAAAQABAAAARs0MnpAKDYrbSWMp0xZIvBKYrXjNmADOhAKBiQDF5gGcICNAyJTwFYTBaDQ0HAkgwSmAUj0OkMrkZM4HBgKK7YTKDRICAo2clAEIheKc9CISjEVTuEQrJASGcSBQcSUFEUDQUXJBgDBW0Zj34RACH5BAUHAA8ALAAAAAAQABAAAARf8Mn5xqBYgrVC4EEmBcOSfAEjSopJMglmcQlgBYjE5NJgZwjCAbO4YBAJjpIjSiAQh5ayyRAIDKvJIbnIagoFRFdkQDQKC0RBsCIUFAWsT7RwG410R8HiiK0WBwJjFBEAIfkEBQcADgAsAQABAA8ADwAABFrQybEWADXJLUHHAMJxIDAgnrOo2+AOibEMh1LN62gIxphzitRoCDAYNcNN6FBLShao4WzwHDQKvVGhoFAwGgtFgQHENhoB7nCwHRAIC0EyUcC8Zw1ha3NIRgAAIfkEBQcADwAsAAAAABAAEAAABGDwyfnWoljaNYYFV+Zx3hCEGEcuypBtMJBISpClAWLfWODymIFiCJwMDMiZBNAAYFqUAaNQ2E0YBIXGURAMCo1AAsFYBBoIScBJEwgSVcmP0li4FwcHz+FpCCQMPCFINxEAIfkEBQcADgAsAAABABAADwAABFzQyemWXYNqaSXY2vVtw3UNmROM4JQowKKlFOsgRI6ASQ8IhSADFAjAMIMAgSYJtByxyQIhcEoaBcSiwegpDgvAwSBJ0AIHBoCQqIAEi/TCIAABGhLG8MbcKBQgEQAh+QQFBwAPACwAAAEAEAAPAAAEXfDJSd+qeK5RB8fDRRWFspyotAAfQBbfNLCVUSSdKDV89gDAwcFBIBgywMRnkWBgcJUDKSZRIKAPQcGwYByAAYTEEJAAJIGbATEQ+B4ExmK9CDhBd8ThdHw/AmUYEQAh+QQFBwAPACwAAAEADwAPAAAEXvBJQIa8+ILSspdHkXxS9wxF4Q3L2aTBeC0sFjhAtuyLIjAMhYc2GBgaSKGuyNoBDp7czFAgeBIKwC6kWCAMxUSAFjtNCAAFGGF5tCQLAaJnWCTqHoREvQuQJAkyGBEAOw==) +} + +.aui-dropdown2 .active .aui-icon-wait, +.aui-button-primary .aui-icon-wait { + background-image: url(data:image/gif;base64,R0lGODlhEAAQAPMPAKC72NTg7e7z97rN4oaozWyWwlKDuP///5Sy08jX6OLq8q7F3XmfyEV6s/r7/AAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUAI/eAAh+QQFBwAPACwAAAAAEAAQAEAEcPDJ1+gadUqUOtFTI4rJgTSHMwxG1kqG8RhBwRAGIlOacSgNx6G1CzUYgaIkE0IIEsqGoaCcAWSEz6PAnBgUrcOQ15MhTMJYd1ZyUDXSDGelBY0qogJg/ZoAFAQNCDoxDBRvIQMAD1kzgSAgBQWQDxEAIfkEBQcADwAsAAAAAA8AEAAABF3wyfnAko3OJJU0AqNJQaM4hnIUo0QoAnFw0xA3QmAdR5ZJg0PAMCkQW7TWg7EAAFjKB2GwWECjH8LoN2EkBlvDD5FgNAgMg/oo1iwMBfNVA9DGJXMMIXN/HJVqIxEAIfkEBQcADwAsAAAAABAADwAABFrwyfkIolgumVRrQSY5Q9M1g9hUB9Mxk1FIQMCACYIEh4EcPY0gFSMAD7NJYbFSHi6Sgo5gyHyuDIBWxH3AupQFotklAAqNAvqqkiAM8IaBjCHM4A8594vPUyIAIfkEBQcADwAsAAAAABAAEAAABFzwySkJvRK0N5IcBfYEAOct2CYJRReijSEhi5wABOE1lqACpIfqUVCIHiWKrNbYEBgM0UIgcIByBNllcegGKKGLYWxQGRCW46SQfYzVQkmj0BweC7Im3C23w/UYEQAh+QQFBwAIACwAAAAAEAAOAAAERRDJiQCgWA55Ds/c1iECKAFeR5DYIBTIEVheFU/DsWH1Su2YwMSAIPiCnUPJcsmUPkNMQZY5TqYdIkJrSma4lAJQAgZFAAAh+QQFBwAOACwAAAAAEAAQAAAEa9DJ6Uqh2DUmEZCAkTUAhyAOooiZsRinIaBUwYgIYQFBpSSSRgFRaEwahoEjwJIYOJRGgmDUGK5VCmEwSCCu2AxBoRAsohhDgIBBNh1PCTBoMDaqgkPSIchmGAdKDlBoEwoHFyNpB2wZjn4RACH5BAUHAA8ALAAAAAAQABAAAARb8Mn5jKFYFkkIz9zFeEQCSkgzPgmDWc3DFBaxSMktGXS2CANM44JZuCaNJIixWASTygwjEQgATpMBI4rdPBYxEGCheDRugZPggHhceaDGmkiMOw4XxzE+CIQpEQAh+QQFBwAOACwBAAEADwAPAAAEVtBJI0uRTOpab1nb5l3L5TSnZlAOAzjGgEiNgYZA8G73hpihYAFAzAQ1n4HsSCsFa6yawrHbHA4IRGI6S/gOAIWC4JiFDFeKoBE4Mg4XwdqhAKo0g2MEACH5BAUHAA8ALAAAAAAQABAAAARd8Mn5WqNY3meMLBtmXB1HhFTjdQ3iYZtlFYyEEBlMLHiOES8fxYAoCicGgLL2URQwrmHicOhNEgKExnEIeBQExiLxICgWEsLTFgjUesGJotF+DBw+xzcgIec2SjkRACH5BAUHAA4ALAAAAQAQAA8AAARa0MnpWpOGamll2Vr3bZlmlMQITgxSXFRJqc4i3AvI7EVw/AkQgeBqnAgCmYSwcrwmjUWAKVHUGooEw4EYOAcACUNGGCQKgi1ME3CYHYD2pmB1JII15QaBAEUAACH5BAUHAA8ALAAAAQAQAA8AAARY8MlJX6t4NlMNx8ZFHQdSiU3xFeTxTYZaAQfTiZKiZ0/hGwOHQADI+BifBiOBsVUGkpcEsXA+Ao9iYuAjLCQAgqQgETMACwOWJ2CiHwQmSL6ANoq8shgTAQAh+QQFBwAPACwAAAEADwAPAAAEWvDJIoy8+JajspfDwXxS9xjH4RnNaRLj1bAY4RRZKyFBkiCemcEAUBiBuaGlVRh4cDLAQ+BhIKBO4AIwZBBOsNNEUEBIF5aHTh1YPMwPBmB9cb+ljy8pHsNEAAA7) +} + +.aui-button-primary[aria-disabled="true"] .aui-icon-wait { + background-image: url(data:image/gif;base64,R0lGODlhEAAQAPMPAKC72NTg7e7z97rN4oaozWyWwlKDuP///5Sy08jX6OLq8q7F3XmfyEV6s/r7/AAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUAI/eAAh+QQFBwAPACwAAAAAEAAQAEAEcPDJ1+gadUqUOtFTI4rJgTSHMwxG1kqG8RhBwRAGIlOacSgNx6G1CzUYgaIkE0IIEsqGoaCcAWSEz6PAnBgUrcOQ15MhTMJYd1ZyUDXSDGelBY0qogJg/ZoAFAQNCDoxDBRvIQMAD1kzgSAgBQWQDxEAIfkEBQcADwAsAAAAAA8AEAAABF3wyfnAko3OJJU0AqNJQaM4hnIUo0QoAnFw0xA3QmAdR5ZJg0PAMCkQW7TWg7EAAFjKB2GwWECjH8LoN2EkBlvDD5FgNAgMg/oo1iwMBfNVA9DGJXMMIXN/HJVqIxEAIfkEBQcADwAsAAAAABAADwAABFrwyfkIolgumVRrQSY5Q9M1g9hUB9Mxk1FIQMCACYIEh4EcPY0gFSMAD7NJYbFSHi6Sgo5gyHyuDIBWxH3AupQFotklAAqNAvqqkiAM8IaBjCHM4A8594vPUyIAIfkEBQcADwAsAAAAABAAEAAABFzwySkJvRK0N5IcBfYEAOct2CYJRReijSEhi5wABOE1lqACpIfqUVCIHiWKrNbYEBgM0UIgcIByBNllcegGKKGLYWxQGRCW46SQfYzVQkmj0BweC7Im3C23w/UYEQAh+QQFBwAIACwAAAAAEAAOAAAERRDJiQCgWA55Ds/c1iECKAFeR5DYIBTIEVheFU/DsWH1Su2YwMSAIPiCnUPJcsmUPkNMQZY5TqYdIkJrSma4lAJQAgZFAAAh+QQFBwAOACwAAAAAEAAQAAAEa9DJ6Uqh2DUmEZCAkTUAhyAOooiZsRinIaBUwYgIYQFBpSSSRgFRaEwahoEjwJIYOJRGgmDUGK5VCmEwSCCu2AxBoRAsohhDgIBBNh1PCTBoMDaqgkPSIchmGAdKDlBoEwoHFyNpB2wZjn4RACH5BAUHAA8ALAAAAAAQABAAAARb8Mn5jKFYFkkIz9zFeEQCSkgzPgmDWc3DFBaxSMktGXS2CANM44JZuCaNJIixWASTygwjEQgATpMBI4rdPBYxEGCheDRugZPggHhceaDGmkiMOw4XxzE+CIQpEQAh+QQFBwAOACwBAAEADwAPAAAEVtBJI0uRTOpab1nb5l3L5TSnZlAOAzjGgEiNgYZA8G73hpihYAFAzAQ1n4HsSCsFa6yawrHbHA4IRGI6S/gOAIWC4JiFDFeKoBE4Mg4XwdqhAKo0g2MEACH5BAUHAA8ALAAAAAAQABAAAARd8Mn5WqNY3meMLBtmXB1HhFTjdQ3iYZtlFYyEEBlMLHiOES8fxYAoCicGgLL2URQwrmHicOhNEgKExnEIeBQExiLxICgWEsLTFgjUesGJotF+DBw+xzcgIec2SjkRACH5BAUHAA4ALAAAAQAQAA8AAARa0MnpWpOGamll2Vr3bZlmlMQITgxSXFRJqc4i3AvI7EVw/AkQgeBqnAgCmYSwcrwmjUWAKVHUGooEw4EYOAcACUNGGCQKgi1ME3CYHYD2pmB1JII15QaBAEUAACH5BAUHAA8ALAAAAQAQAA8AAARY8MlJX6t4NlMNx8ZFHQdSiU3xFeTxTYZaAQfTiZKiZ0/hGwOHQADI+BifBiOBsVUGkpcEsXA+Ao9iYuAjLCQAgqQgETMACwOWJ2CiHwQmSL6ANoq8shgTAQAh+QQFBwAPACwAAAEADwAPAAAEWvDJIoy8+JajspfDwXxS9xjH4RnNaRLj1bAY4RRZKyFBkiCemcEAUBiBuaGlVRh4cDLAQ+BhIKBO4AIwZBBOsNNEUEBIF5aHTh1YPMwPBmB9cb+ljy8pHsNEAAA7) +} + +.aui-icon-success, +.aui-icon-warning, +.aui-icon-info, +.aui-icon-error, +.aui-icon-hint, +.aui-icon-generic { + height: 16px; + width: 16px; + line-height: 0; + position: relative +} + +.aui-icon-success:before, +.aui-icon-warning:before, +.aui-icon-info:before, +.aui-icon-error:before, +.aui-icon-hint:before, +.aui-icon-generic:before { + color: #707070; + content: "\f16f"; + font-size: 16px; + font-family: "Atlassian Icons"; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-style: normal; + left: 0; + line-height: 1; + margin-top: -8px; + position: absolute; + speak: none; + text-indent: 0; + top: 50% +} + +.aui-icon-generic:before { + color: #707070; + content: "\f23d" +} + +.aui-icon-error:before { + color: #d04437; + content: "\f15a" +} + +.aui-icon-hint:before, +.aui-icon-info:before { + color: #707070; + content: "\f23d" +} + +.aui-icon-success:before { + color: #14892c; + content: "\f194" +} + +.aui-icon-warning:before { + color: #f6c342; + content: "\f1b3" +} + +/* module-key = 'com.atlassian.auiplugin:table', location = 'src/less/tables.less' */ +/*! AUI Tables */ +table.aui { + border-collapse: collapse; + width: 100% +} + +table.aui table.aui { + margin: 0 +} + +table.aui>caption { + color: #707070; + background: #f5f5f5; + border-bottom: 1px solid #ccc; + caption-side: top; + padding: 7px 10px; + text-align: left +} + +table.aui>tbody>tr, +table.aui>tfoot>tr { + background: #fff; + border-bottom: 1px solid #ccc; + color: #333 +} + +table.aui>tbody>tr>th { + background: #fff; + color: #333 +} + +table.aui>thead>tr>th, +table.aui>tbody>tr>th, +table.aui>thead>tr>td, +table.aui>tbody>tr>td, +table.aui>tfoot>tr>td { + padding: 7px 10px; + text-align: left; + vertical-align: top +} + +table.aui>thead { + border-bottom: 1px solid #ccc +} + +table.aui>tbody>tr:first-child>td, +table.aui>tbody>tr:first-child>th, +table.aui>tfoot>tr:first-child>td { + border-top: 1px solid #ccc +} + +table.aui>thead>tr>th>ul.menu, +table.aui>tbody>tr>th>ul.menu, +table.aui>tbody>tr>td>ul.menu, +table.aui>tfoot>tr>td>ul.menu { + list-style-type: none; + margin: 0; + padding: 0 +} + +table.aui>thead>tr>th>ul.menu>li, +table.aui>tbody>tr>th>ul.menu>li, +table.aui>tbody>tr>td>ul.menu>li, +table.aui>tfoot>tr>td>ul.menu>li { + float: left; + margin: 0 10px 0 0; + width: auto +} + +table.aui.aui-table-interactive>tbody>tr:hover { + background: #f5f5f5 +} + +table.aui.aui-zebra tr { + border-bottom: 0 +} + +table.aui.aui-zebra>thead>tr:nth-child(even), +table.aui.aui-zebra>tbody>tr:nth-child(even), +table.aui.aui-zebra>tfoot>tr:nth-child(even), +table.aui-zebra>tbody>tr:nth-child(even)>th { + background: #f5f5f5; + color: #333 +} + +/* module-key = 'com.atlassian.auiplugin:internal-form-css', location = 'src/less/forms.less' */ +form.aui { + margin: 20px 0 0 0; + position: relative +} + +form.aui:first-child { + margin-top: 0 +} + +form.aui .text, +form.aui .password, +form.aui .upfile, +form.aui .textarea, +form.aui .select, +form.aui .multi-select, +form.aui .aui-select2-container { + background: #fff; + color: #333; + font-family: inherit; + font-size: 14px +} + +form.aui .text, +form.aui .password, +form.aui .textarea, +form.aui .select, +form.aui .multi-select, +form.aui .aui-select2-container .select2-choices { + border: 1px solid #ccc; + border-radius: 3.01px; + box-sizing: border-box; + font-size: inherit; + margin: 0; + max-width: 250px; + vertical-align: baseline; + width: 100% +} + +form.aui .text, +form.aui .password, +form.aui .select, +form.aui .aui-select2-container .select2-choices { + height: 2.14285714em; + line-height: 1.4285714285714; + padding: 4px 5px +} + +form.aui .select { + padding: 6px 5px 5px 5px; + vertical-align: top +} + +form.aui .textarea, +form.aui .select[size], +form.aui .multi-select { + height: auto; + line-height: 1.4285714285714; + margin: 0; + padding: 4px 5px +} + +form.aui .textarea { + overflow-y: auto +} + +form.aui .aui-select2-container { + border: 0; + height: auto; + max-width: 250px; + padding: 0; + vertical-align: baseline; + width: 100% +} + +form.aui .aui-select2-container .select2-choices { + height: auto; + max-width: none +} + +form.aui .upfile { + box-sizing: border-box; + font-family: inherit; + font-size: inherit; + margin: 5px 0; + padding: 0 +} + +form.aui optgroup { + background-color: #f5f5f5; + color: #707070; + font-style: normal; + font-weight: normal +} + +form.aui option, +form.aui optgroup option { + background-color: #fff; + color: #333 +} + +form.aui .text[disabled], +form.aui .password[disabled], +form.aui .textarea[disabled], +form.aui .select[disabled], +form.aui .multi-select[disabled], +form.aui .select[disabled] option, +form.aui .select[disabled] optgroup, +form.aui .multi-select[disabled] option, +form.aui .multi-select[disabled] optgroup { + background-color: #f5f5f5; + color: #999 +} + +form.aui .text[disabled], +form.aui .password[disabled], +form.aui .textarea[disabled], +form.aui .select[disabled], +form.aui .multi-select[disabled] { + color: #999 +} + +form.aui .text[disabled], +form.aui .password[disabled], +form.aui .textarea[disabled], +form.aui .select[disabled], +form.aui .multi-select[disabled], +form.aui .radio[disabled], +form.aui .checkbox[disabled] { + cursor: not-allowed +} + +form.aui .text::-webkit-input-placeholder, +form.aui .password::-webkit-input-placeholder, +form.aui .textarea::-webkit-input-placeholder { + color: #999; + opacity: 1 +} + +form.aui .text::-moz-placeholder, +form.aui .password::-moz-placeholder, +form.aui .textarea::-moz-placeholder { + color: #999 +} + +form.aui .text.aui-placeholder-shown, +form.aui .password.aui-placeholder-shown, +form.aui .textarea.aui-placeholder-shown, +form.aui .text.placeholder-shown, +form.aui .password.placeholder-shown, +form.aui .textarea.placeholder-shown { + color: #999 +} + +form.aui .text[type=search] { + -webkit-appearance: textfield; + outline-width: 5px; + outline-offset: -2px +} + +form.aui .text[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +form.aui .short-field { + max-width: 75px +} + +form.aui .medium-field { + max-width: 165px +} + +form.aui .medium-long-field { + max-width: 350px +} + +form.aui .long-field { + max-width: 500px +} + +form.aui .full-width-field { + max-width: none +} + +form.aui fieldset { + border: 0; + clear: both; + display: block; + margin: 0; + padding: 0; + position: relative +} + +form.aui legend, +form.aui label { + color: #707070 +} + +form.aui .icon-required { + left: 100%; + position: absolute; + top: 5px +} + +form.aui div.description { + color: #707070; + font-size: 12px; + line-height: 1.66666666666667; + margin: 5px 0 0 0 +} + +form.aui div.description:first-child { + margin-top: 0 +} + +form.aui .field-value { + display: inline-block; + font-weight: bold; + padding-top: 5px +} + +form.aui legend { + display: none +} + +form.aui .field-group, +form.aui .group, +form.aui .date-select { + box-sizing: border-box; + clear: both; + padding: 4px 0 4px 145px; + position: relative; + margin: 1px 0; + width: 100% +} + +form.aui .group { + padding-top: 0 +} + +form.aui .field-group:before, +form.aui .field-group:after, +form.aui .group:before, +form.aui .group:after, +form.aui .date-select:before, +form.aui .date-select:after { + content: " "; + display: table +} + +form.aui .field-group:after, +form.aui .group:after, +form.aui .date-select:after { + clear: both +} + +form.aui legend, +form.aui .field-group>label, +form.aui .field-group>aui-label { + float: left; + margin-left: -145px; + padding: 5px 0 0 0; + position: relative; + text-align: right; + width: 130px; + word-wrap: break-word +} + +form.aui .checkbox>label, +form.aui .radio>label { + color: #333 +} + +form.aui div.checkbox>.checkbox[disabled]+label, +form.aui div.radio>.radio[disabled]+label { + color: #999; + cursor: not-allowed +} + +form.aui .field-group .error, +form.aui .group .error, +form.aui .checkbox .error, +form.aui .radio .error { + clear: both; + color: #d04437; + display: block; + margin: 5px 0 0 0 +} + +form.aui .field-group .error:first-child, +form.aui .checkbox .error:first-child, +form.aui .radio .error:first-child { + margin-top: 0 +} + +form.aui .group legend, +form.aui .date-select legend { + display: block +} + +form.aui .group .field-group, +form.aui .date-select .field-group { + clear: none; + padding-left: 0; + padding-top: 0 +} + +form.aui .date-select .field-group label { + display: none +} + +form.aui div.checkbox, +form.aui div.radio { + margin: 5px 0 0 0; + padding: 0 0 0 20px; + position: relative +} + +form.aui legend+.field-group, +form.aui legend+.checkbox, +form.aui legend+.radio { + margin-top: 0; + padding-top: 5px +} + +form.aui div.checkbox:first-child, +form.aui div.radio:first-child { + margin-top: 0 +} + +form.aui .matrix { + padding-top: 5px +} + +form.aui div.radio input.radio, +form.aui div.checkbox input.checkbox { + box-sizing: border-box; + font-size: 14px; + height: 1.4285714285714em; + left: 0; + margin: 0; + padding: 2px; + position: absolute; + vertical-align: baseline +} + +form.aui .buttons-container { + box-sizing: border-box; + clear: both; + margin: 1px 0 0 0; + padding: 4px 0 4px 145px; + position: relative; + width: 100% +} + +form.aui.long-label .field-group, +form.aui.long-label .group, +form.aui.long-label .date-select, +form.aui.long-label .buttons-container { + padding-left: 250px +} + +form.aui.long-label .field-group>label, +form.aui.long-label .field-group>aui-label, +form.aui.long-label .group>legend { + margin-left: -250px; + width: 235px +} + +form.aui.long-label .group .field-group, +form.aui.long-label .date-select .field-group { + padding-left: 0 +} + +form.aui.top-label .field-group { + padding-left: 0 +} + +form.aui.top-label .field-group>label, +form.aui.top-label .field-group>aui-label { + display: block; + float: none; + margin: 0 0 5px 0; + padding: 0; + text-align: left; + width: auto +} + +form.aui.top-label .icon-required { + left: 0; + position: static; + top: 0 +} + +form.aui.top-label .group, +form.aui.top-label .date-select { + padding-left: 0 +} + +form.aui.top-label .group legend, +form.aui.top-label .date-select legend { + float: none; + margin: 0; + text-align: left; + width: auto +} + +form.aui.top-label .date-select label { + display: none +} + +form.aui.top-label .buttons-container { + padding-left: 0 +} + +form.aui .button { + box-sizing: border-box; + background: #f5f5f5; + border: 1px solid #ccc; + border-radius: 3.01px; + color: #333; + cursor: pointer; + display: inline-block; + font-family: Arial, sans-serif; + font-size: 14px; + font-variant: normal; + font-weight: normal; + height: 2.14285714em; + line-height: 1.4285714285714; + margin: 0; + padding: 4px 10px; + text-decoration: none; + text-shadow: 0 1px 0 white; + vertical-align: baseline; + white-space: nowrap +} + +form.aui .cancel { + cursor: pointer; + font-size: 14px; + display: inline-block; + padding: 5px 10px; + vertical-align: baseline +} + +form.aui .buttons-container>.buttons { + font-size: 0 +} + +form.aui .buttons-container>.buttons>* { + font-size: 14px +} + +form.aui .buttons-container .button+.button, +form.aui .buttons-container .button+.aui-button, +form.aui .buttons-container .aui-button+.button, +form.aui .buttons-container .aui-button+.aui-button { + margin-left: 10px +} + +form.aui .buttons-container .aui-button+.aui-button-link { + margin-left: 9px +} + +form.aui .button::-moz-focus-inner { + border: 0; + padding: 0 +} + +form.aui .button:focus, +form.aui .button:hover { + background-color: #f5f5f5; + border-color: #999; + color: #000; + text-decoration: none +} + +form.aui .button:active, +form.aui .button.active { + background-image: none; + background-color: #f5f5f5; + box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.1); + text-shadow: none; + text-decoration: none +} + +form.aui .button[disabled], +form.aui .button[disabled]:hover, +form.aui .button[disabled]:focus, +form.aui .button[disabled]:active { + background-color: #f5f5f5; + border-color: #ddd; + box-shadow: none; + color: #999; + cursor: default; + text-shadow: none +} + +form.aui .aui-message+.field-group, +form.aui .aui-message+.group, +form.aui .aui-message+.date-select { + margin-top: 10px +} + +form.aui span.content { + left: -9999px; + position: absolute; + top: -9999px +} + +form.aui pre.aui-form { + background-color: #f5f5f5; + border: 1px solid #ccc; + font-family: monospace; + font-size: 12px; + line-height: 1.66666666666667; + overflow-x: auto; + overflow-y: visible; + padding: 15px +} + +@media screen and (max-width:767px) { + + html.aui-responsive form.aui .field-group, + html.aui-responsive form.aui.long-label .field-group { + padding-left: 0 + } + + html.aui-responsive form.aui .field-group>label, + html.aui-responsive form.aui.long-label .field-group>label, + html.aui-responsive form.aui .field-group>aui-label, + html.aui-responsive form.aui.long-label .field-group>aui-label { + display: block; + float: none; + margin: 0 0 5px 0; + padding: 0; + text-align: left; + width: auto + } + + html.aui-responsive form.aui .icon-required, + html.aui-responsive form.aui.long-label .icon-required { + left: 0; + position: static; + top: 0 + } + + html.aui-responsive form.aui .group, + html.aui-responsive form.aui.long-label .group, + html.aui-responsive form.aui .date-select, + html.aui-responsive form.aui.long-label .date-select { + padding-left: 0 + } + + html.aui-responsive form.aui .group legend, + html.aui-responsive form.aui.long-label .group legend, + html.aui-responsive form.aui .date-select legend, + html.aui-responsive form.aui.long-label .date-select legend { + float: none; + margin: 0; + text-align: left; + width: auto + } + + html.aui-responsive form.aui .date-select label, + html.aui-responsive form.aui.long-label .date-select label { + display: none + } + + html.aui-responsive form.aui .buttons-container, + html.aui-responsive form.aui.long-label .buttons-container { + padding-left: 0 + } +} + +/* module-key = 'com.atlassian.auiplugin:internal-message-css', location = 'src/less/messages.less' */ +aui-message { + display: block; + margin: 20px 0 0 0 +} + +.aui-message { + background: #fff; + border-top: 1px solid #3572b0; + border-right: 1px solid #3572b0; + border-bottom: 1px solid #3572b0; + border-left: 1px solid #3572b0; + border-radius: 3px; + color: #333; + line-height: 20px; + margin: 20px 0 0 0; + overflow-wrap: break-word; + padding-bottom: 20px; + padding-left: 60px; + padding-right: 40px; + padding-top: 20px; + position: relative; + word-wrap: break-word; + word-break: break-word +} + +.aui-message:before { + background-color: #3572b0; + bottom: 0; + content: ''; + left: 0; + position: absolute; + top: 0; + width: 40px +} + +.aui-message:after { + color: #fff; + font-family: "Atlassian Icons"; + font-size: 16px; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + left: 12px; + line-height: 1; + margin-top: -8px; + position: absolute; + speak: none; + top: 50% +} + +.aui-message:after { + content: "\f16f"; + color: #fff +} + +.aui-message:before { + background-color: #3572b0 +} + +.aui-message .aui-icon.icon-close { + background-image: none; + color: #707070; + text-indent: inherit +} + +.aui-message .aui-icon.icon-close:before { + content: "\f11b"; + font-family: "Atlassian Icons"; + font-size: 16px; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal +} + +.aui-message .aui-icon.icon-close:hover { + color: #333 +} + +.aui-message .aui-icon-success, +.aui-message .aui-icon-warning, +.aui-message .aui-icon-info, +.aui-message .aui-icon-error, +.aui-message .aui-icon-hint, +.aui-message .aui-icon-generic, +.aui-message .icon-generic, +.aui-message .icon-error, +.aui-message .icon-hint, +.aui-message .icon-info, +.aui-message .icon-success, +.aui-message .icon-warning { + display: none +} + +aui-message:first-child, +.aui-message:first-child { + margin-top: 0 +} + +.aui-popup .aui-message.closeable, +.aui-dialog .aui-message.closeable { + z-index: 4000 +} + +.aui-message.error, +.aui-message-error { + background: #fff; + border-color: #d04437; + color: #333 +} + +.aui-message.error:after, +.aui-message-error:after { + content: "\f15a"; + color: #fff +} + +.aui-message.error:before, +.aui-message-error:before { + background-color: #d04437 +} + +.aui-message.warning, +.aui-message-warning { + background: #fff; + border-color: #f6c342; + color: #333 +} + +.aui-message.warning:after, +.aui-message-warning:after { + content: "\f1b3"; + color: #707070 +} + +.aui-message.warning:before, +.aui-message-warning:before { + background-color: #f6c342 +} + +.aui-message.hint, +.aui-message-hint, +.aui-message.info, +.aui-message-info { + background: #fff; + border-color: #3572b0; + color: #333 +} + +.aui-message.hint:after, +.aui-message-hint:after, +.aui-message.info:after, +.aui-message-info:after { + content: "\f16f"; + color: #fff +} + +.aui-message.hint:before, +.aui-message-hint:before, +.aui-message.info:before, +.aui-message-info:before { + background-color: #3572b0 +} + +.aui-message.success, +.aui-message-success { + background: #fff; + border-color: #8eb021; + color: #333 +} + +.aui-message.success:after, +.aui-message-success:after { + content: "\f194"; + color: #fff +} + +.aui-message.success:before, +.aui-message-success:before { + background-color: #8eb021 +} + +.aui-message p.title { + font-weight: bold +} + +.aui-message p.title strong { + font-weight: inherit +} + +.aui-message.closeable .icon-close { + cursor: pointer; + left: auto; + opacity: 0; + position: absolute; + right: 20px; + top: 20px +} + +.aui-message.closeable:hover .icon-close, +.aui-message.closeable .icon-close:focus, +.aui-message.closeable:not(.fadeout):not(.aui-will-close) .icon-close { + opacity: 1 +} + +#footer .aui-message { + margin-left: 20px; + margin-right: 20px; + text-align: left +} + +/* module-key = 'com.atlassian.auiplugin:internal-message-css', location = 'src/less/aui-banner-message-header-interop.less' */ +#header .aui-message { + border-radius: 0; + color: #333; + margin: 0; + padding: 10px 40px 10px 50px; + position: relative +} + +#header .aui-message.closeable .icon-close { + top: 10px +} + +/* module-key = 'com.atlassian.auiplugin:toolbar', location = 'src/less/toolbar.less' */ +.aui-toolbar { + clear: both; + display: inline-block; + padding-top: 10px; + position: relative; + width: 100% +} + +.aui-toolbar .toolbar-group { + display: inline-block; + float: left; + padding: 0; + margin: 0 10px 10px 0; + white-space: nowrap +} + +.aui-toolbar .toolbar-item { + display: inline-block; + float: left; + margin: 0; + padding: 0 +} + +.aui-toolbar .aui-dd-parent { + position: relative; + width: auto +} + +.aui-toolbar .toolbar-split { + display: inline-block; + float: left; + margin-left: 10px +} + +.aui-toolbar .toolbar-split.toolbar-split-right { + float: right +} + +.aui-toolbar .toolbar-split.toolbar-split-row { + clear: both; + float: none; + width: 100% +} + +.aui-toolbar .toolbar-trigger { + cursor: default +} + +.aui-toolbar .toolbar-item-link .toolbar-trigger { + cursor: pointer +} + +.aui-toolbar .primary .toolbar-trigger { + font-weight: bold +} + +.aui-toolbar .toolbar-group .toolbar-trigger, +.aui-toolbar .aui-dd-parent a.aui-dd-trigger { + box-sizing: border-box; + background: #f5f5f5; + border: 1px solid #ccc; + color: #333; + display: inline-block; + margin: 0; + padding: 4px 10px; + text-decoration: none; + text-shadow: 0 1px 0 white; + vertical-align: baseline; + height: auto; + text-indent: 0; + width: auto; + float: left +} + +.toolbar-item+.toolbar-item .toolbar-trigger, +.toolbar-item+.toolbar-item a.aui-dd-trigger { + border-left-width: 0; + padding-left: 11px +} + +.aui-toolbar .toolbar-group button.toolbar-trigger, +.aui-toolbar .toolbar-group input.toolbar-trigger { + font-size: inherit; + font-family: inherit; + line-height: inherit +} + +.aui-toolbar .toolbar-group .toolbar-item.toolbar-item-link .toolbar-trigger { + border-color: transparent; + background: transparent; + text-decoration: none; + color: #3572b0 +} + +.aui-toolbar .toolbar-group .toolbar-item-link:hover .toolbar-trigger, +.aui-toolbar .toolbar-group .toolbar-item-link .toolbar-trigger:focus { + text-decoration: underline +} + +.toolbar-group .toolbar-item:first-of-type a, +.toolbar-group .toolbar-item:first-of-type button, +.toolbar-group .toolbar-item:first-of-type input[type="button"], +.toolbar-group .toolbar-item:first-of-type input[type="reset"], +.toolbar-group .toolbar-item:first-of-type input[type="submit"], +.toolbar-group .toolbar-item:first-of-type .toolbar-trigger { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px +} + +.toolbar-group .toolbar-item.toolbar-splitbutton .aui-dd-trigger { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.toolbar-group .toolbar-item.toolbar-splitbutton:last-of-type .aui-dd-trigger, +.toolbar-group .toolbar-item:last-of-type a, +.toolbar-group .toolbar-item:last-of-type button, +.toolbar-group .toolbar-item:last-of-type input[type="button"], +.toolbar-group .toolbar-item:last-of-type input[type="reset"], +.toolbar-group .toolbar-item:last-of-type input[type="submit"], +.toolbar-group .toolbar-item:last-of-type .toolbar-trigger { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px +} + +.toolbar-group .toolbar-splitbutton:last-of-type .toolbar-trigger { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.toolbar-group .toolbar-item:first-of-type .toolbar-trigger, +.toolbar-group .toolbar-item:first-of-type button { + border-left-width: 1px +} + +.aui-toolbar .toolbar-group .aui-dropdown { + border: 1px solid #999 +} + +.aui-toolbar .toolbar-group .aui-dropdown a { + border: 0; + border-radius: 0 +} + +.aui-toolbar .aui-dropdown2-trigger.toolbar-trigger.active, +.aui-toolbar .toolbar-splitbutton:hover .toolbar-trigger, +.aui-toolbar .toolbar-group .toolbar-trigger:focus, +.aui-toolbar .toolbar-group .toolbar-trigger:hover, +.aui-toolbar .toolbar-group button:focus, +.aui-toolbar .toolbar-group button:hover, +.aui-toolbar .aui-dd-parent .aui-dd-trigger:focus, +.aui-toolbar .aui-dd-parent .aui-dd-trigger:hover, +.aui-toolbar .toolbar-group .active .toolbar-trigger:hover { + background: #e9e9e9; + border-width: 1px; + border-color: #999; + margin-left: -1px; + color: #000; + position: relative; + text-decoration: none +} + +.aui-toolbar .toolbar-item:first-child .toolbar-trigger:hover, +.aui-toolbar .toolbar-item:first-child .aui-dropdown2-trigger.toolbar-trigger.active, +.aui-toolbar .toolbar-item.active:first-child .toolbar-trigger, +.aui-toolbar .toolbar-splitbutton:first-child:hover .toolbar-trigger, +.aui-toolbar .toolbar-item:first-child .toolbar-trigger:focus, +.aui-toolbar .toolbar-item:first-child .toolbar-trigger:hover, +.aui-toolbar .toolbar-item:first-child button:focus, +.aui-toolbar .toolbar-item:first-child button:hover, +.aui-toolbar .toolbar-item:first-child .aui-dd-parent .aui-dd-trigger:focus, +.aui-toolbar .toolbar-item:first-child .aui-dd-parent .aui-dd-trigger:hover, +.aui-toolbar .toolbar-item:first-child.active .toolbar-trigger:hover { + margin-left: 0 +} + +.aui-toolbar .aui-dropdown2-trigger.active, +.aui-toolbar .aui-dd-parent a.aui-dd-trigger.active, +.aui-toolbar .toolbar-group .active .toolbar-trigger, +.aui-toolbar .toolbar-group .toolbar-trigger:active { + background: #f5f5f5; + box-shadow: inset 0 3px 6px rgba(0, 0, 0, 0.1); + text-shadow: none; + text-decoration: none +} + +.aui-toolbar .toolbar-group .toolbar-item-link .toolbar-trigger:active { + background: none; + box-shadow: none +} + +.aui-toolbar .icon-dropdown { + background: transparent url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAAB4CAYAAADMtn8nAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAJdRJREFUeNrsnQl4FNeV703ulutfUWgBQQCzL7YkrzI2KAYY4fFJhOIbZw4jh9I8fdlnhNnHMgQR5IzzMDkxXbe956xcDyxMzMOBDteAAfbwsYLAiwJkIVZZNCChCQQqCW1WktvNedUV4lS00tVdTUW8f1/31W3qm7dqrp1f/ecc6vqto7jOAinXn/9db87WLVqlS4c5WtRrqi84m0lFEqpLLq8iJN6wfLp3JpH/wxa13rl27ZF/g3bt3l5WXl5eOpn0UFxeX3nHHHSVy8n766aeKj3/dunWKAHjppZd0Csv3XuS9P51XYrq3gBhFsEUTsi8y9cSXkGlks8ybFAlkmVX5cUGVKai/BJJg9W0/LLd7dL6yMVU4z93rpoOSNoIg5SvfB8FBQUl3//92XldblcgerOr5YvXy6389GkQRGkb7/9tiblhR3gawGZWH4Y4AWJ9eUbhgBQWZg6iNIwlC9VNTEngYzzcSxq950rlK8LYnEU7QOhBDeW8KujAEY9QCQmM7baWEwmvSeP3Q2wdqonrxrdf//9/CdBJX739b9WAGspw7XaUZghg3CVKzS2sjBWTakaq6ERxFrVmQivL4W0D4fDAW5JQXr8Y8S0yrwPksdxMNjlgh22e/hegvKqEYHq67uv/7xAIcZsnBqRAyMLm7AzGhBlZbPSTqK0jCW7wviag0ssDe8nBe8IVlgHmAfZ5CQiLCaIsGcgv/YgMjFuAwW2BO4XrdqAX4OlWpV8PzF2epiX/FCya1wuEo37uxaGmBa7w6A53WFtjFXTl4HlRMrZdiIYvrg54eIwyh5ziRq8F9jUwRR2Dd2ehpoNgAH/9MTAnAVcX5hgYwhQD1/ix6CHvw26383C21lZCxeVkD2/AKbcVABvDC4AY5sAOecBmPKOxhjYuxOgMrVyzRnAX38MfC3DCim8Wu9bhFjT8MBxiD49IdvgDHSDM0IMinnxgKwCyWTVaY8agEOtwX2Bl/sFK6bUejrXNd1DFyyPF3RPVpQOKBG962V3gdWsg/RAjsG2Gw18Ivaz5WyQ9sTZhXAC0INO3cOa1gtFrgYKPyOgbw6IiB1bqgYgxc4vWpSfnY6MJu4cO5D4KSLKwTAXa7XGDtbAd69oggdiLF59GtJrDdD6gHWPqwhTeko/HWEQN4dMbAZeEof/ny5WG1wOHeh3gbqWLnq74zPFTgcaNB3SCW0iertJCWt6Z04X6UkokpFNGjlJGRkbIepRwaGlL1KGg4Fe5HKRnATEzXsfSsCpiYGMBMTEwMYCYmJgYwExMDmImJiQHMxMTEAGZiYmIAMzExgJmYmBjATExMDGAmpmudGvXrqXPUrgytWnAt0WUPmzt42HuUgjyNoqSfUjKp7mZVgjnQeewC/xMcaqk/Pb2dq6rqwvcbnfAfElJSZCVlaXJmy2Sd4IfxfTT8vLyeFsBE1NTdypU6ego6ODP8/HHntM1XkMOTmuZ4CD9m4n9A25sCwOzEYdZCYaICkmAqJMesXl4vX1N2Ge33aqsv0AXP0qZylI3gxT2vZJ69ev56hOnU7ncKK3psREr0CKn5T27duneE6sUkmjBwnIpWFoK6UQH1XtZJe5IDwKhXBO2XKFIiIiACdznfd0kU5ffo0feVCgZjevPF6m2YlplfEdeCZF0tzeD/77DMoLCyEW265BbZv366qnO5N3e6ww6psXqIM7kgOsIzxater4eefgecaLXB3AkxXFqCUWn9VPsCB8HTup1yftorJdXXdMuWLWF9XdEggbfUqycCPtCgnfWrFnw5Zdf5nr1mDUBLLYseGNjY6Gvr68Myyr1utCl4jIVZfMWieAdGhoaATBBSuo10xJSYG0tDTo7OxUDTEBOm7cOO/ObRFZYPpC68hCCpBr1gBOnjwJCxcu5MxqqpK1dzKFpuLO3ZuECalRkBPnw1Ottjg3GUbuNACpyWYYFZmPExINcOHxzth4cxkLj3JrMYSD1tA7HT47xpCLH1dUZx2SGoUpAZu1Flgb3yOmgtKomHdPGjVBbW0ugVVNDoZOhT7wQHP6n0tBVqAVUVFREB8fTX6vDjCxVd9/AQuNXCyJqIrTd/pVUwR6oSEBIiLi4PGxkbFEIvwlpWV6STuM1nfJkolJSVA6/CT0xritrY2mDt3Lu80zn95Cc/geeee45vdPT/z372s4DnMeBwc3Ut/ZCdYoD2Lht8gJCmJxhhzZ0T0KRxUH3GArtr22HhtFS0wLHwUV0nrMhL5KiDYoaqhReakPiMo0gLvWCF2DkRH2lagGFhbYG9JquDKRmxYQ54rwTpw4kU80zxDB1tPTA5cuXYLDhw8vREtQjRdDtbWnGBQbY4lgZcVOCASLLy5XfZGpMYufolWWAmwymfjPGTNmwIkTJygeVgUvfudhkrrPuA68IdbKdaROlLyL/v5/nzee89mDBhAl9vcqaTudjjgBR0m7utQ7D32AUYGnTAw8unDHud98wfC3VNlHjExfg3hszYXyKGRov9sHciYlq3P1heMMAcVhEv73kz9r6SvX19apiYG83wlfvpLaSqCcr27Rp07AFrqurA9ECU2N88MEHYxHjhwpweVK49ddeOIl0dHRfDkYw5UQEAaDgYds0qRJsHLlSqD9h3KRCVwRVvpOx0/lE7jd3d0guknkSivt/akOCEy0qgSo1AIPH6sAMcGrVUhDdc83roGBgWEPg0TncPnyZVmdUP15G2SPMcHnjd0wMEgzSLqhy2qH2iYLxJgj4JapqXDnrFR4/UAjHGm8BIWzx8FBhFkpwFJ4RWkEsbTdVwfJp9gKh3vKHoMPSKWWN8/HejWNh9GIKKevbm5WTr96AqCjpYTDNiYVigEuAZhKkMLzl8IcgFTU1N5l5biYlHUeQgQqxrgksa/okst/V8EWq0LJ0IsWGKCt1twoT0VryG8R870cU0dVrhQ9xbk5eXB4OAgb32pE6TzoFRdXQ333ntvcBccY92JY4zQ1NkLTtzO4XLA5jeOwbK88TBvYir09jvgHFpcl9MNTe0WMMzNgLPtPUoOt4zgFF1oGRArvb6lckaXaSxFDcDXwgJDAIhBq9FcikHJjSV31ivWraHlFoulJMSyd1VVVf0OeqFBJJogefMmQPz5s0jeMURak3Oh3g/NVF6LQOQt9QJEQaDZAQ5YbFs82KyqFYVoh7SwXXWLSb3lZS03grfnKyh1rtCFsAP0p34KYGDu0tLTA8ePHh8MDsrwEL4YDQRvTALrfNCuTkyZWdJ3N8f/v2DmOLD0DcH/2XkUBu1Oz9SvOjdwOg76ByKO39/ENO1pbAsRDcX7rvvPr/r33nnnVDa/TWxwN7D5r7cC9Ujcd4Q1Jvby/vyknjV4VlE5iLhPuGw0IrXC3Ecpq5nqTKE21gdZhh3qQUMBgjMBa0gwXjwE9PXIYxCg2xZECqVALwIq88IR97NcJbe7YPJo6LAjdS9sWgE3YctsMY21d8J4JeiLGFmOKADta3sxEM/Ra7ED8IzO/9O2A/x6l8MJSDU/oJULgWBd8CYeJMqD84bYim8QrtS1UEHs8ArVqxQdQeDtGzZMi6QxZWOSFOyWq2a/TaSdwbEgCSCij19fCFMIKcpYCeFXuiO3R4msOL28R4wwe0I0WIZ04BxwoWWJgMy0OPjyjA3GJIZWNsKaCBqrqt7KHW3og5yxZujEzsbp4mBaRjQc6XeBcew/qIKXHyTMjoe2ThvMn5QEZ1q7wE7Aov71R7fyncRT5R8LDc0NdPGQn2zBRbMzlA9UiyF2Ae8pWrbZrgs8J49e8JrgYP0PqVhHNmT/eRUiNIcXooX9ANNJmM4Bxy8hOPD6EPaTZEoCs5qba/vxUL3f0rA1y0s38qHGPzYkuvx4ceOCDDg4SYyNVlz1pbCzsrToHi2/Kgm/nZcHbB8/yg1nbPzp1ZQDQ7YB7bpsOxgg9fFLbAmWP3qZ6rMAb4lDh/Xu2wJooQOXUCKk0TOVDKKPOwRQdaURrQ4M2GNsJv3/JYdX322wASaMH3kMIbw16BVPSyfI6wELwGnSQGBOBYFth5oQoWFOYptpKJMVF6lbePpH7f2/VwcOLb4BVd06FyuOtUNdwAdxON0walwAFszLBgJ3b8zuPwNOP3AJpSdGhWKVhiDXqoEuFAaqwtKOwW2BgCmxtfQ5g6SA9QQ9WdJ3jokwwhO6oQaD9i4HcJdPAxdDW80ZFcf/zqFLcOecRN5ttvQ5wYyWNynWAAdP9cHs7Cj4wV3jQm5gMyck6X68fBb3h3ePw83Tx8LdeRMh0jTZM8iFcfbxs52wv7YVNn7/ZrhpapoWDbpUMlYSkteGBiDcP14XVrGJ3YPoiy/quFmzZl496DbghLMd/dDUOci70NbIXB0nIQFY9pgoKUGMm//AWTMuO1r/0Hzn754hlt8YzJ0dNvBhW5SoIBDp3uglZkbD2ngxNj6/D0s8dO9MJ7x5qhKaObv5lhqwxcbD8thy46YY0yEiJ1bEWxQCpqqrO85Nm3aDrHu85468B13H90Jy5lQ4W3cAFv989feYLfuaeM6Ed6ZE2L4nA8fLoXZoyPgnXfzmAwMYD//nXfJvndULOLSu/8/IZsB5/GxyDvXD3U2OCkjdUczV/2VDex2J6y4NRWKlzJ4GcBMTExfu9iMHExMDGAmJiYGMBMTEwOYiYkBzMTExABmYmJiADMxMfmQrqioSO6N4P3l5eWFSndQXFz8EXi926rlPpSUT1PWKD3devWrcePzT5WWTBtoaRmvmBJeLXq66DFiDY/kf4EcOpsleqxZjonXFuJ9tGhy/VDlCEuupxse5qS3/rFD29zDtVFqej/ZDr57Qm3ENQpIef41w/N7tSEn5AdfXwPDr6/SFjqWiurxIkQXWyUyFKq9xYZj3oaR8LZUkgL1ag7Lo4tED9RWYBmHkdEbXmzYLkNEndX7VQtLiHa3Fko5htUbHS4AWCZ2ZeIx/EZZZrmGdFQnnp2i6UQP4fuEmJKvrq7cKYilV70faG8qwxqFAvFPo9UV9IFR4rtQSqJT4aqV4MqXXKby5ArR3C52RaM3IjTS4hDLXy1AtVNo8EkaQVYsdDrrhfJyhHO4Vlos6bA/UAqwTq4LoGYuYsn2hXLyKd2Hl4tSDU0WovGAOyE61eLhY6oQrKM3NJtwrmF6vGsFuqnQgC4SAhjtLiG3xPgEb9brmG95Umuv6L96gULHCx9pHYicWG7j8K1DwXlh/rQ92qvshYLDWmLRhdRGotdr7JIrLDUZd6mkfVNEgDeKexrtYbHLsa7I2J2ilG9k4rrKnX9Ra9ksaSOkgTvq0hpPRmCDeyIFo4Q7DAhYGsayj7kFNmC1OkdBAtbC4GW9rgeRu1/iI6bbHGAbNbNorBY6twpJSFMkwKBFp1cuKafcK1waMcikMsbOFSytRQgpGiT7oP83gIrJCQwIABcoLg0VChkxakhxtvfxBYqD1YxCB4iB10sGarQCuOEau25aAVwawOqsFs4tFCssWizw4Umt1sALWi2kPOHYP5C462KHlCSxkrPI1CMnSv8L3wZMffAWNg7yHwEGNgvzFqKHG2j2H6QrglQvhmdTPIjQ7wGfnDDF8BahIxIb/xZJZ7dFpbUUXeVkrOt1iAOFt1XqQXcIiyrEPanepApWIyNTjntc7Lagw82Cq2ZhQz3KLTM8GhWODVfupqpwaNfoWQPoMr8z1pBXOFcOzSUWAxTm3QeNBss3DcG3zElwDqbyUVSWDyrvvNkvEItR1csteyDV7noHqQKViMHaoMIbqVSkArvJ7L96MNGrhv1V4x9WLQ9jbSNsHarhdAkDaoYo3rY6dguSySesmRxK9qGq7oim/xsz/xXnw4xw6SJC6u2joLFmOrtsBMAfTSSy9tAe1Gmn2Vr7tGHQ2l8ZiiMJ0DzwMjWmub0Ni9n16rUNtgsX4qAnhODaD9AzqpHqQSWaMzQBm8is5t80hEDs8BZ7uY7Xq0IaZJIZY6sWmxOLiek6FnsbiYmJAczExMQAZmJiYgAzMTGAmZiYGMBMTEwMYCYmJgYwExMDmImJiQHMxMTEAGZigZrxEPsReXVi/Djh5gmSha/jemVbcV53eICpc9PHk9yh1qOgS9Q72y8sdHxkPBpAKYHzdP1kP258fv3JCOl2MXq/f3tDQsKS9vZ3h3HjxkFOTs77brf7QTx2m5jXaDRCWlpa8B10dAx/HThnLPs3eszW9Ly5RA1ffrIY8Z9q5b9GAcNwr5yvg1govrw9z58jsltb026Boa5C80XTWjXh9j0kds/89TJ5e80gp675JOfCD6TPet7tdDzrcbpuYNynSDPPjYwIe4rp16hh/2qZZ0Rv4/AP9Kuex3lbjQk/VmFahmka1RKmg5jeKS/K/VhpeSCKdqu7HP/4xlR20YeMwvr203sXHuEuDh6BH2Qf18kGGMFNxI/nMD3qJx/ByOEC2lAB1HuOe3LMeeuOjAKLM8jYaGITE3kH43bItsiAWAY6IiIh3Op0vf/HFF6sI3JSUFH755cuXWOeO3fu6waD4X5XK5eNQAPnDzJNa9ZAmxsaDXjTwsN5bf3tcH2a9BlEzZuiUAewDSruVgz0PAUT3UG482iA5dsR4jidGoBJ0QZD/ADWz8aDB1ZVUp0ZhJfRnE4oyMyETbfd/noU1k/08nXj0yAueXYce3evRs2btwYMOmTZuG25wagBGwpwx63b/flJMEcyYkwNhEM7hc2Mdd6IPa5h6ob7fuwWxbEbI9CgDmPwWAFR0P7kdzeM/bPgMnWCEqYqwsiMXXCfIaaW4cEVuBizPTYfdNe2wq6aNFhHgbyLo3xEhlquDjQfBGmMCXUKCz/WcywVw8eKVBakpfN4eXF7ZWAnz586TtR8EM9put28leA2GCEhISMSL6JtSWJiInR3W6C2tnYVQmw3mUzrEPRJefBw/vQQzAhOZkH35cm4HLKk/3nP3MjIFajj36Orggalxih3kzoOBwoASh8VnFR1N3GYv0gmFs3HvhsVWU7XlMTGjK3WyjbBAQ0rdt0wJ7jMGwrk9h/ZAmTpwYNsuEcD0/ZVzsEz8qnAipcZEju66xMbB47lioO9ez7I8fNS3DvD9FuH4/GlzcmpoaWdauPnUjDLjqYcDdgV5SjOzyDQjlo1J4STdkxF75HNkp/RHz7xcssiyR28xF6EFnt/vOYO2FtRP/Ae7KRb8ct8/Q5MLGxVn57eR63IjvHqEdxvCu8bhGCLbCm1trXxnbzQaIDo6BmLRalosPMRr5s2bxyHEj5DhlAtvE4KZGR/PuQIv293BtdRHso7UTbEPqxv20EOurHio9Hq9g9cWd6PVXkoPMAp0SeNHy6hHebWh51/DwRiIAeD1SsE7QNYHLNhu/jNZRHrTEHG7zCCezfsj6SizyVevJQt9///2hwFs2PSPuiX9cOhXQAownmQ5RZFVXn//NPi3t049j9ucRoj3Bitbuv2N7ipF7jTIfI86Nzew202Wd8B2BV651le0wE94L9xXd3HEp0SJAuyvKLoCDgf6t74B1lv7YPWs1RBjjIZWx2XQOZOvbCO7eMeO2tpjqwgsPV5gszkKMjIyBe3DS5d6uStcFxcvGCJjz08f/6NkVFRUUHnFR7Yv59rfPBBSIJCQivhGIYhDRNpN27OCixo1TZondTg4OlKEngvVwWYt6lee5Z//At1xDAkO/QvAd97hQGQVW5kRAT0DA3u2FB5YNXhjnZPp4Dn8L/nz4cV48fzef7a1ARbT53i11W2t8OGgwce3nzr7ZHxpsjVChoxF0psGwDehEij/tdrFeMgNefyK0mK/3Ce2cfx3/3Ktyd7lrFut5usxp4RYDney/st7ugvq0PokwRvra5XzHA1Oh9WGDO7YJbx9wEqVEpsP/cJBCqzucLxgogi5cuLDn6NGjS4cwzktA15vi3Zkz58CUKVP49cePG3nLe/FiJ4LthhgEsbe3F44dO7YqPz9/jzAY4lcWtC6JCAHIgVcCcQIm2jZq0SJlV/TUX3D7LqycBArqAabUBgJ/KUwpXynJ8/MNbKKG3I596yvPLD0cOdFD7zYMX4nJwfPTfh5t0W1oanBschD3NzXyewxcuwC8PV656YeG3gtaPj5hYUuLerxwVhrEmeVPHjMvOxHSk8z3IfwzEcQTo2nUuNdxlO/o4o036rzhNUCcInilMfAITUuP42PgnYrHKy/7MsKKxxNdYyY2IUGlMiakVt97yzP7CQ1HUf5LLqhIUUWuL6fml/vw2taxxZYmIHrfCV9SkpqXwsjC42b311umhso9FgRct/9uzZpWPHjg26DxeCS2VfGBiAqLlzA1vsY8dgLHYStE/F8xUNdnFw5DmAZA9oYL/sMWxu7NTcfbjM4IGQ8kxZwfkf0JIM0hyvW3q4C8uJEeIqrIclWVnD8JJiMHYvzMiAPefOeQa20LUdOkSvHryy6U33nKzolPQ2gKjHsibrHwyS4K43dJxH349IXcUqgnxOsflhGofd2/DPXOfQOtossSDanXWV5M53Kp15TMydWtItnA41vJYXTfERkRBn6sfInVGWJS90DPY1XaISMHkEqmRVXRbW5vdbDabHBLgdTq9ZBB4HKSmpqIr3QEHDnyK7dOTz2yOhJaWVrusw8dj0mP5SQsWQNabbwbM27J0KTiOHuW3UVy5Vciz8td8T70N3Ri9D1oDXWXnUTLj86FaAW34RtMh3W87ZsXczgThqjteBrK0LPyOEZfT9IpVNsTENbnmG6OGtpib78woAbkJXPAyamZ4UpXgjcqXBc5tp1LjNBGvw/MrplZXDDjcthFus9wBL2AqdaVDB8qvtfGQ8l5XMvbxxfApoKnYXPVc7iIg1hjDFwa7ILGvvOgc0vGTNwueYM02PjItdUJjZH6CSnAtJxGjT0jxzphZFq8FcbJ7H884CSjlQ8m8gQsaOVku9vDvvpXHJz5KxYQcyWMIFfC1oLgIsA6SXhBseAJjGJuA4HSVMDNzrajs6d6ofOGct8ua0N1mRnwz4eD7LCasV/gOXQVSUZ59iXrdd8aUWbhUFG1eTPQAUbADKeyBruGF74mXTaHKf08w3gQMNF1ldb3jVlkkAvwpX/7ZNIL2leC/UGDBx6J7NHjsH4kyxUFbwSzjX57l/ehCjafhuFwjt5GhzMxMU1NTI7a9SKF96jB0vPoBMz2WTtcLiffPgcGBmHy5KmyLjDBSEdjPnsWHI89FjBvVEsLb80UA0wDVzTmIA0djHh5XFZ0rc9fHVZQ3oP/ArD01YDFLs3KMpWfb6WeZbhO6fg2NTbCY8Ig1sutrXCJjtdsHo7hoacHVk7KUQRAbW0t/ynzfrBcnb7QPTgnMzlKEcSXrHwo1qhkFDrcD3XcM/ZPuj8338uXqRebzCAnxcGpubLyPzbcV5TeVFnCqAKeb9w6nXoCD9ZpideAPkxGXzqyu7aj0uM8cpBnjatGnvdnd3L3COM9kMvCWVi8EweIDJ2SFPWBHwBDG2A6HE5KTU2ig6125ANODGmeOHMH484i8wWSXS379NO9DH7bKYyndEvANCOlZvDwchSDuqwf22giz/4xBMXm0Ej8e86XvT1LP8P4HcjikpeDHem7vb1wEWNeqqEq/M67z6LVx/8XxCfAj6bPeFdNoxJB1kjv1DZ3wXYG0JRded66GOPwn2F3Z1KHsvD7ETWkOGl28i9IhkUXk1/arBRyLElfWX4HS7FS5bh6R5n8e8z6vaCOedxjV283/Or4/4XtBcCWe/p4Gu6T4DO4bx6GzluSVrasry8vJ3V1dWr6JZRYmIS0COUVnQL3W5u2PoODPTz16evzwbp6RmA27yOQAe9TUKPR3a/DJwNtuwmy7HraeBINpWXuz7Ww84bq/bruTSjlngAbijkn9CbeTVQ8CP/n9AgP0WHRlhWPbb/Ft3rq/6fNUnfX2AFcR7Otlokf9r9mwe4G/V1cFp6hxoYKu7G6MioEtTe/jtsqfnOvN27d/OPVErvC/vLq6DcrR992bnxrtljIdIo79H9k6290HDB9gFCeBBGoQhircrix1mE55xvFB7qeOKy1T4fkzhgtR/T7zHPftV7kcSbOqcLWtpOwgPlsCi1FzIMIBS7ZOmqBaFcCdnZ1kWR9AIP9UVVX98MWLHVBff9rrcU/eM4LBwUER3v/GbR5xu4M/p0DPNt/w179yX333u9j59AaHmDwNtHRT33jj6ueifam3iQPLGc/or/c5p0wHmPSPnutrwF0dV29/UX0CKytHMTlNzXEMJqNhof2JKf/6f11VUPf4IdGyQlwXHskO798kvPSH5/v8cCWyxwpzkKtuTl/zdu88iQDC9CMupcA2H4lQSE8Dy6s7995eOmp4oX5wTNbx10AublwZdTvug28yPQnwINAp9re4NKwLY67nmV8DPPV7FbrMgejFBx8GIASNdrxXO1H4IZ6IP85YKrH1XNV7ahraVN0bmchsMhqL8/DxddXXVmvMY89ETWNJnDMhtzsjIInhfo7zoFtM2ssqnJ6oQSK4eIXajhQJ/EOM56NHC8fDKfZSSvBA6dVdyaVTAOeexRNE97erxXce2jYiMqBPaMNzjTGairbk3qzbUFO15mOEmEtIgC8IZhJZXox5FxojYXNu/mtRRmMRbRNrGB0/3IHg/AKhii2vaHj8kTuz/T2fAM2XuEPFQ3QbXM8g9u8KXMgTKfVoJo/qRldlu3zh/uXGfiXGd58EnoHeuRXER5SYnQi/G7ls0FfZiALLA4Y0csMCPPLVVVVqhRSnom2hPDunh48/PzyW0efpmBAB4zZkzgY5GiXTyJAx0L71zAMaNlu8IY36MsMDQAVT3DQsBuGXxmSijo4Are//2oyKW8OuumLf6/z9zLDF702Alh8pDJyOF4RfV6E5zaF1TUoWO4hIs1EV43GajkXZgYqPwfqZGx8Do0UI8b8hvBsWzhwDs8bHQ0ykAZwYJnXb7PD5mS6oPmsh00kvM7wM3xBdk59WCefrhFKAhXiXWtz2M2fOLKHRaWrp9JD9lClT3sd/HkS3efh1QqUA8xBr/jphg8d0t36GIKFL298pr1Kj8bhTZwFkLRCGjQMDLBprE9aPDrjtr9afXvJ2ayu//P6sLPjh1Gnvczrdg3bhdUIYhQALENPbHfSY5L3gVlQivVomP41BHcHfMPEfhuJiek6FpuRg4mJAczExMQAZmJiYgAzMTGAmZiYGMBMTEwMYCYmJh8yCMCKpHu8ccf57/IuYcsc3IwXmqeNRWmcJHuowxTqSRdJSWzRkimiCkSknQu0W2YaBqFBqXliif9DSmZ7yy/BrTb9Qcu6hdu3YFvQa7d/OKy8vrwnhKXzQw/P/xveRhm7vhmAkx/zuinB81415yx0Fz7MT07ugjTMZ1O1z1KzoGTQCttLOI7zqUa7GM9ps2YdmKiOYAswr7Khf3lgf8Z1WIP5FixbBzJkzITvb85pla2srnDhx4pl9/Y94wWFIiGc1IhfF/wgvA9T1hPScew0xhgK3hmmpg/MZF/UHzA7oJjTR4v3fbeITXM/n5i7X8ZBz02mETpklqdkiTYSudQFuGSn00ljKNIE4SACZLu8GrYd4t7IvWF4fSNeuXcs/8mkymfh3mumtp5ycHBg/fjy98wwvvPCC6sa/fPlyLpj1pfMpLi4GtMKhXosamcuYtAKY9PiSyXBo73YYFFrJjcLyrw5UYbqygTCT/cStW7dyahtUGCAuDSPEiwWId/pYZxGWF4UA8NO33347ZGVl8eBWVFTAihUrMkH0PWFJUuW8BaZrPP/fuflrrTcoXl6YKsB4I3RA9CSV4GtJYA/q7M2B8SjQcwuz7go8BegYUxvYuUio3PtZSDvWEOI8L7dZdKe1gjgpiBVpkORRo2emTp06/J7x/DytXruRh/tvf/gb33HMPv5ysMAL8jFKA84q3hYHBq91/ybUIdp2qQwkHmHwATPCKiktLDwBvO2SaaZaOIajUYOcaQRzI4mppiZMEisPcNWimTPFAcEnn3xyeOK99evXDy9PT08PZYxAiXQh1H8gN99fjMwUgvjbSPQbSGLMG0gDbsrZXZ3pCY719CNFhtRiQTWUj/LlZqaCuFzdQAXuyKUgydgP/zwQ2hubuZhptcjaR5rk5Tte7du3cYahXSKUxaxb1a5GWSY4Fbq96GVslCJ9cDFwf/E7qGdoPNWcv/HxmRDTGGudDQtwKSI1dgrqrRAq8cSyxlqgot0EYwFovxLtSK7xaADgvlANva2vjB6xeeOEFKCwsHJ6Uj7Rv3z4oKiqClpYWlf5tTdCBqRDjXzkxbi5DLXwAS3tdrmtoF3xlLeKhlWrI1cwnWm/oS1DJQtjgDQRxCYR62KD0Aj/Ap6RZ7FRlguDV6Gc0K/r6ufueOOODRRxFV155ZcRKGp1OTk6GTz75hMrOExBeIPdBxZHlTVfWAZMa7cGJlJrQWW6mTvA0E3IrgjRh8/iAulcSCZSpgE8Bi6IR523CsiQBYkqTQd294N9UVVU9QxY4IyMDnnrqKX4EWupek/WtrORHHX6jpkLk3gdWcxtJxqR2YZnsjkkAWHyqirR161aIqHj27G8pBCLrkKZmgEsbKBbBBfaW3dreLx5O3bsqM7Ly4PJkyfzPzpObvSFCxegsbERDh8HJL1knMfmKyvxq400zXQdTljq/fo/UTe9X4sBqj7fjD8iglEwOYiYlpFIq9jcTExABmYmJiADMxMTGAmZgYwExMTAxgJiYmBjATExMDmImJAczExMQAZmJiYgAzMX2D9T8CDABMIiduuYHd8QAAAABJRU5ErkJggg') 0 0 no-repeat; + display: inline-block; + margin-top: 0; + margin-left: 5px; + margin-right: -5px; + padding-right: 5px; + text-indent: -9999px; + width: 7px +} + +.aui-toolbar .toolbar-dropdown .icon-dropdown { + background-position: -24px 0; + height: 7px +} + +.aui-toolbar .toolbar-splitbutton .icon-dropdown { + background-position: -46px 7px; + margin-left: 0; + height: auto +} + +.aui-toolbar .toolbar-splitbutton>.toolbar-trigger, +.aui-toolbar .toolbar-splitbutton>.toolbar-trigger:hover, +.aui-toolbar .toolbar-splitbutton>.toolbar-trigger:focus { + border-right-style: dotted; + float: left +} + +.aui-toolbar .toolbar-splitbutton>.aui-dd-parent>.toolbar-trigger:hover, +.aui-toolbar .toolbar-splitbutton>.aui-dd-parent>.toolbar-trigger:focus { + border-left-width: 0; + margin-left: 0 +} + +.aui-toolbar .toolbar-splitbutton>.aui-dd-parent { + float: left +} + +.aui-toolbar .toolbar-splitbutton>.aui-dd-parent>.toolbar-trigger { + border-left-width: 0 +} + +.aui-toolbar .toolbar-splitbutton>.aui-dd-parent.active>.toolbar-trigger { + border-left-color: #999 +} + +.aui-toolbar .toolbar-splitbutton>.aui-dd-parent>.aui-dd-trigger { + min-width: 0; + margin: 0; + padding-left: 2px; + padding-right: 2px; + width: 9px +} + +.aui-toolbar .aui-dropdown2-trigger[aria-disabled="true"], +.aui-toolbar .toolbar-group.disabled .toolbar-trigger, +.aui-toolbar .toolbar-item.disabled .toolbar-trigger, +.aui-toolbar .toolbar-trigger.disabled { + color: #999 +} + +.aui-toolbar .aui-dropdown2-trigger[aria-disabled="true"]:focus, +.aui-toolbar .aui-dropdown2-trigger[aria-disabled="true"]:hover, +.aui-toolbar .aui-dropdown2-trigger[aria-disabled="true"]:active, +.aui-toolbar .disabled .active .toolbar-trigger:hover, +.aui-toolbar .toolbar-group.disabled .toolbar-trigger, +.aui-toolbar .toolbar-group.disabled .toolbar-trigger:focus, +.aui-toolbar .toolbar-group.disabled .toolbar-trigger:hover, +.aui-toolbar .toolbar-group.disabled .toolbar-trigger:active, +.aui-toolbar .toolbar-group .disabled .toolbar-trigger, +.aui-toolbar .toolbar-group .disabled .toolbar-trigger:focus, +.aui-toolbar .toolbar-group .disabled .toolbar-trigger:hover, +.aui-toolbar .toolbar-group .disabled .toolbar-trigger:active, +.aui-toolbar .toolbar-group .toolbar-trigger.disabled, +.aui-toolbar .toolbar-group .toolbar-trigger.disabled:focus, +.aui-toolbar .toolbar-group .toolbar-trigger.disabled:hover, +.aui-toolbar .toolbar-group .toolbar-trigger.disabled:active { + background: #f5f5f5; + border-color: #ddd; + box-shadow: none; + color: #999; + cursor: default; + text-shadow: none +} + +.aui-toolbar .aui-dropdown2-trigger[aria-disabled="true"]:focus, +.aui-toolbar .aui-dropdown2-trigger[aria-disabled="true"]:hover, +.aui-toolbar .aui-dropdown2-trigger[aria-disabled="true"]:active { + border-color: transparent; + color: #999 +} + +.aui-toolbar .toolbar-group.disabled .toolbar-item:first-child .toolbar-trigger, +.aui-toolbar .toolbar-group .disabled.toolbar-item:first-child .toolbar-trigger, +.aui-toolbar .toolbar-group .toolbar-item:first-child .disabled.toolbar-trigger { + border-left-width: 1px; + border-left-color: #ddd +} + +.aui-toolbar .toolbar-group.disabled .toolbar-item .aui-dd-trigger, +.aui-toolbar .toolbar-group .disabled.toolbar-item .aui-dd-trigger, +.aui-toolbar .toolbar-group .toolbar-item .disabled.aui-dd-trigger { + border-left-width: 0 +} + +/* module-key = 'com.atlassian.auiplugin:aui-buttons', location = 'src/less/aui-buttons.less' */ +.aui-button, +a.aui-button, +.aui-button:visited { + box-sizing: border-box; + background: #f5f5f5; + border: 1px solid #ccc; + border-radius: 3.01px; + color: #333; + cursor: pointer; + display: inline-block; + font-family: inherit; + font-size: 14px; + font-variant: normal; + font-weight: normal; + height: 2.14285714em; + line-height: 1.42857143; + margin: 0; + padding: 4px 10px; + text-decoration: none; + vertical-align: baseline; + white-space: nowrap +} + +.aui-button.aui-button-light, +a.aui-button.aui-button-light, +.aui-button:visited.aui-button-light { + background: #fff +} + +.aui-button~.aui-button { + margin-left: 10px +} + +a.aui-button:hover, +a.aui-button:active, +a.aui-button:focus { + text-decoration: none +} + +form.aui .button:focus, +form.aui .cancel:focus, +.aui-button:focus { + outline: 1px dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: 1px +} + +.aui-button::-moz-focus-inner { + border: 0; + padding: 0 +} + +.aui-button:focus, +.aui-button:hover, +.aui-button-subtle.aui-button:focus, +.aui-button-subtle.aui-button:hover { + background: #e9e9e9; + border-color: #999; + color: #000; + text-decoration: none +} + +.aui-button.aui-button-subtle:active, +.aui-button.aui-button-subtle.active { + border-color: #999 +} + +.aui-button:active, +.aui-button.active, +.aui-header .aui-button-split-more.active, +.aui-button-subtle.aui-button:active, +.aui-button-subtle.aui-button.active { + box-shadow: inset 0 3px 6px 0 rgba(0, 0, 0, 0.1); + background-image: none; + background: #f5f5f5; + text-decoration: none +} + +.aui-buttons .aui-button.aui-button-split-main:not(:active) { + border-right-color: transparent +} + +.aui-buttons .aui-button.aui-button-split-main:not(.aui-button-primary):hover+.aui-button-split-more:before, +.aui-buttons .aui-button.aui-button-split-main:not(.aui-button-primary):active+.aui-button-split-more:before, +.aui-buttons .aui-button.aui-button-split-main:not(.aui-button-primary):focus+.aui-button-split-more:before { + visibility: hidden +} + +.aui-buttons .aui-button.aui-button-split-main:not(.aui-button-primary)+.aui-button-split-more:hover:before, +.aui-buttons .aui-button.aui-button-split-main:not(.aui-button-primary)+.aui-button-split-more:active:before, +.aui-buttons .aui-button.aui-button-split-main:not(.aui-button-primary)+.aui-button-split-more:focus:before { + visibility: hidden +} + +.aui-buttons .aui-button.aui-button-split-main:not(.aui-button-primary):hover+.aui-button-split-more { + border-left: 1px solid #999; + margin-left: -2px +} + +.aui-buttons .aui-button.aui-button-split-main+.aui-button-split-more { + margin-left: -1px +} + +.aui-buttons .aui-button.aui-button-split-main+.aui-button-split-more:focus, +.aui-buttons .aui-button.aui-button-split-main+.aui-button-split-more:hover { + margin-left: -2px +} + +.aui-buttons .aui-button.aui-button-split-main+.aui-button-split-more.aui-dropdown2-trigger:before { + content: ''; + border-left: 1px solid #ccc; + bottom: 4px; + display: block; + left: -1px; + position: absolute; + top: 4px +} + +.aui-buttons .aui-button.aui-button-split-main+.aui-button-split-more.aui-dropdown2-trigger.aui-button-primary:before { + border-color: #fff +} + +.aui-button.aui-button-primary, +.aui-button.aui-button-primary:visited { + background: #3572b0; + border-color: transparent; + color: #fff; + font-weight: bold; + -webkit-font-smoothing: antialiased +} + +.aui-button.aui-button-primary:hover, +.aui-button.aui-button-primary:focus { + background: #2a67a5; + border-color: transparent; + color: #fff +} + +.aui-button.aui-button-primary:active { + box-shadow: inset 0 3px 6px 0 rgba(0, 0, 0, 0.1); + background-image: none; + background: #3572b0; + text-decoration: none +} + +.aui-button.aui-button-link, +.aui-button.aui-button-link:visited, +.aui-button.aui-button-text, +.aui-button.aui-button-text:visited { + background: transparent; + border-color: transparent; + color: #3572b0; + padding: 4px 0; + text-decoration: none; + box-shadow: none +} + +.aui-button.aui-button-link:focus, +.aui-button.aui-button-link:hover, +.aui-button.aui-button-link:active, +.aui-buttons .aui-button.aui-button-link:focus, +.aui-buttons .aui-button.aui-button-link:hover, +.aui-buttons .aui-button.aui-button-link:active, +.aui-buttons .aui-button.aui-button-link[aria-pressed="true"], +.aui-button.aui-button-text:focus, +.aui-button.aui-button-text:hover, +.aui-button.aui-button-text:active, +.aui-buttons .aui-button.aui-button-text:focus, +.aui-buttons .aui-button.aui-button-text:hover, +.aui-buttons .aui-button.aui-button-text:active, +.aui-buttons .aui-button.aui-button-text[aria-pressed="true"] { + background: transparent; + border-color: transparent; + box-shadow: none; + text-decoration: underline +} + +.aui-button.aui-button-text, +.aui-button.aui-button-text:visited { + border: none; + font-size: inherit; + height: inherit; + line-height: normal; + padding: 0 +} + +.aui-button.aui-button-subtle { + background: transparent; + border-color: transparent; + color: #707070 +} + +.aui-buttons .aui-button.aui-button-subtle { + border-radius: 3.01px +} + +.aui-button.aui-button-subtle .aui-icon { + margin-right: 1px +} + +.aui-button>.aui-icon+.aui-button-label { + margin-left: 4px +} + +.aui-button.aui-button-compact { + font-size: 12px; + height: 2.16666666666667em; + padding: 2px 8px; + line-height: 1.66666666666667 +} + +.aui-buttons { + display: inline-block; + font-size: 0 +} + +.aui-buttons:after { + clear: both; + content: ""; + display: table +} + +.aui-buttons .aui-button { + border-radius: 0; + margin: 0 +} + +.aui-buttons .aui-button:first-child { + border-top-left-radius: 3.01px; + border-bottom-left-radius: 3.01px +} + +.aui-buttons .aui-button:last-child { + border-top-right-radius: 3.01px; + border-bottom-right-radius: 3.01px +} + +.aui-buttons+.aui-buttons { + margin-left: 10px +} + +.aui-buttons .aui-button:not(.aui-button-primary):not(.aui-button-link):focus, +.aui-buttons .aui-button:not(.aui-button-primary):not(.aui-button-link):hover, +.aui-buttons .aui-button:not(.aui-button-primary):not(.aui-button-link):active { + border-color: #999 +} + +.aui-buttons .aui-button[disabled], +.aui-buttons .aui-button[disabled]:hover, +.aui-buttons .aui-button[disabled]:focus, +.aui-buttons .aui-button[disabled]:active, +.aui-buttons .aui-button[aria-disabled="true"], +.aui-buttons .aui-button[aria-disabled="true"]:hover, +.aui-buttons .aui-button[aria-disabled="true"]:focus, +.aui-buttons .aui-button[aria-disabled="true"]:active { + border-color: #ddd +} + +.aui-buttons .aui-button~.aui-button { + border-left-width: 0; + padding-left: 11px +} + +.aui-buttons .aui-button~.aui-button:hover, +.aui-buttons .aui-button~.aui-button:focus, +.aui-buttons .aui-button~.aui-button:active { + border-width: 1px; + margin-left: -1px; + position: relative +} + +.aui-button[aria-pressed="true"], +.aui-buttons .aui-button[aria-pressed="true"], +.aui-buttons .aui-button[aria-pressed="true"].aui-button-primary, +.aui-buttons .aui-button[aria-pressed="true"].aui-button-subtle { + background: #ccc +} + +.aui-button[aria-pressed="true"].aui-button-subtle, +.aui-buttons .aui-button[aria-pressed="true"].aui-button-subtle { + color: #333; + border-color: #ccc +} + +.aui-buttons .aui-button[aria-pressed="true"]:active { + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.1); + background: #f5f5f5 +} + +.aui-button[disabled], +.aui-button[disabled]:hover, +.aui-button[disabled]:focus, +.aui-button[disabled]:active, +.aui-button[aria-disabled="true"], +.aui-button[aria-disabled="true"]:hover, +.aui-button[aria-disabled="true"]:focus, +.aui-button[aria-disabled="true"]:active, +.aui-button[aria-disabled="true"][aria-pressed] { + background: #f5f5f5; + border-color: #ddd; + box-shadow: none; + color: #999; + cursor: default +} + +.aui-button.aui-button-subtle[disabled], +.aui-button.aui-button-subtle[aria-disabled="true"] { + border: 0; + background: none +} + +.aui-button.aui-button-primary[disabled], +.aui-button.aui-button-primary[disabled]:hover, +.aui-button.aui-button-primary[disabled]:focus, +.aui-button.aui-button-primary[disabled]:active, +.aui-button.aui-button-primary[aria-disabled="true"], +.aui-button.aui-button-primary[aria-disabled="true"]:hover, +.aui-button.aui-button-primary[aria-disabled="true"]:focus, +.aui-button.aui-button-primary[aria-disabled="true"]:active { + background: #9cbad9; + border-color: transparent; + box-shadow: none; + color: #fff +} + +.aui-button.aui-button-link[disabled], +.aui-button.aui-button-link[disabled]:hover, +.aui-button.aui-button-link[disabled]:focus, +.aui-button.aui-button-link[disabled]:active, +.aui-button.aui-button-link[aria-disabled="true"], +.aui-button.aui-button-link[aria-disabled="true"]:hover, +.aui-button.aui-button-link[aria-disabled="true"]:focus, +.aui-button.aui-button-link[aria-disabled="true"]:active, +.aui-button.aui-button-text[disabled], +.aui-button.aui-button-text[disabled]:hover, +.aui-button.aui-button-text[disabled]:focus, +.aui-button.aui-button-text[disabled]:active, +.aui-button.aui-button-text[aria-disabled="true"], +.aui-button.aui-button-text[aria-disabled="true"]:hover, +.aui-button.aui-button-text[aria-disabled="true"]:focus, +.aui-button.aui-button-text[aria-disabled="true"]:active { + background: transparent; + border-color: transparent; + color: #999; + text-decoration: none +} + +.aui-button.aui-button-compact .aui-icon { + margin-top: -1px +} + +.aui-button.aui-button-primary .aui-icon { + color: #fff +} + +.aui-button .aui-icon { + color: #707070 +} + +.aui-button[disabled] .aui-icon { + color: #ccc +} + +.aui-button[disabled].aui-button-primary .aui-icon { + color: #fff +} + +.aui-header .aui-nav .aui-button, +.aui-header .aui-nav .aui-button-primary { + margin: 5px 0 0 10px +} + +.aui-header .aui-nav .aui-button.aui-button-split-main { + margin-right: 0 +} + +.aui-header .aui-nav .aui-buttons .aui-button~.aui-button:hover, +.aui-header .aui-nav .aui-buttons .aui-button~.aui-button:focus, +.aui-header .aui-nav .aui-buttons .aui-button~.aui-button:active, +.aui-header .aui-nav .aui-button.aui-button-split-more { + margin-left: 0 +} + +.aui-header .aui-nav .aui-button-primary, +.aui-header .aui-nav .aui-button-primary:link, +.aui-header .aui-nav .aui-button-primary:visited { + background: #3572b0; + box-shadow: none; + border: 0; + color: #fff; + line-height: 1.57142857 +} + +.aui-header .aui-nav .aui-button.aui-button-primary:focus, +.aui-header .aui-nav .aui-button.aui-button-primary:hover { + background: #2a67a5; + color: #fff +} + +.aui-header .aui-nav .aui-button.aui-button-primary:active, +.aui-header .aui-nav .aui-button.aui-button-primary.active { + box-shadow: inset 0 3px 6px 0 rgba(0, 0, 0, 0.1); + background: #3572b0; + background-image: none +} + +.aui-button[busy], +.aui-button.aui-button-primary[busy] { + color: rgba(0, 0, 0, 0) !important +} + +/* module-key = 'com.atlassian.auiplugin:aui-toolbar2', location = 'src/less/aui-toolbar2.less' */ +/*! AUI Toolbar2 */ +.aui-toolbar2 { + box-sizing: border-box; + margin: 0; + padding: 0 +} + +.aui-toolbar2 .aui-button { + margin-top: 10px +} + +.aui-toolbar2:after, +.aui-toolbar2-group:after { + clear: both; + content: ""; + display: table +} + +.aui-toolbar2-group { + margin: 0; + padding: 0 +} + +.aui-toolbar2-primary { + float: left +} + +.aui-toolbar2-secondary { + float: right +} + +.aui-toolbar2 .aui-buttons { + float: left; + padding: 0; + white-space: nowrap +} + +.aui-toolbar2 .aui-button-link { + padding: 4px 0 +} + +.aui-toolbar2-primary>.aui-buttons, +.aui-toolbar2-secondary>.aui-buttons { + margin: 0 10px 0 0 +} + +.aui-toolbar2-secondary>.aui-buttons:last-child { + margin-right: 0 +} + +/* module-key = 'com.atlassian.auiplugin:aui-navigation', location = 'src/less/aui-navigation.less' */ +/*! AUI Navigation */ +.aui-nav, +.aui-nav>li { + list-style: none; + margin: 0; + padding: 0 +} + +.aui-nav-breadcrumbs:after, +.aui-nav-pagination:after, +.aui-nav-horizontal:after, +.aui-navgroup-horizontal .aui-nav:after, +.aui-navgroup-horizontal .aui-navgroup-inner:after { + clear: both; + content: " "; + display: table +} + +.aui-nav-breadcrumbs>li, +.aui-nav-pagination>li, +.aui-nav-horizontal>li, +.aui-navgroup-horizontal .aui-nav>li { + float: left +} + +.aui-nav-heading { + color: #707070; + font-size: 12px; + font-weight: bold; + line-height: 1.66666666666667; + text-transform: uppercase +} + +.aui-nav-breadcrumbs>li { + padding: 0 10px 0 0 +} + +.aui-nav-breadcrumbs>li+li:before { + content: "/"; + padding-right: 10px +} + +.aui-navgroup-horizontal .aui-nav>li a, +.aui-nav-horizontal>li a { + padding-right: 10px +} + +.aui-nav-pagination { + margin: 10px 0 0 0 +} + +.aui-nav-pagination>li { + padding: 0 +} + +.aui-nav-pagination>li>a { + padding: 10px 10px 0 10px +} + +.aui-nav-pagination>li.aui-nav-selected, +.aui-nav-pagination>li.aui-nav-truncation { + padding-left: 10px; + padding-right: 10px +} + +.aui-nav-pagination .aui-nav-truncation>a { + padding-left: 0; + padding-right: 0 +} + +.aui-nav-pagination>li:first-child>a, +.aui-nav-pagination>li.aui-nav-truncation:first-child, +.aui-nav-pagination>li.aui-nav-selected:first-child { + padding-left: 0 +} + +.aui-nav-pagination>li:last-child>a, +.aui-nav-pagination>li.aui-nav-truncation:last-child, +.aui-nav-pagination>li.aui-nav-selected:last-child { + padding-right: 0 +} + +.aui-nav-pagination a[aria-disabled="true"], +.aui-nav-pagination a[aria-disabled="true"]:link, +.aui-nav-pagination a[aria-disabled="true"]:visited, +.aui-nav-pagination a[aria-disabled="true"]:focus, +.aui-nav-pagination a[aria-disabled="true"]:hover, +.aui-nav-pagination a[aria-disabled="true"]:active { + color: #999; + text-decoration: none +} + +.aui-nav-pagination>li.aui-nav-current, +.aui-nav-pagination>li.aui-nav-selected { + color: #333; + font-weight: bold +} + +.aui-navgroup-vertical .aui-nav>li>a, +.aui-nav-vertical>li>a { + color: #3572b0; + display: block; + line-height: 1.14285714285714; + padding: 7px 10px; + word-wrap: break-word +} + +.aui-navgroup-vertical .aui-nav>li>a:focus, +.aui-navgroup-vertical .aui-nav>li>a:hover, +.aui-nav-vertical>li>a:focus, +.aui-nav-vertical>li>a:hover { + background: #e6e6e6; + text-decoration: none +} + +.aui-navgroup-vertical .aui-nav .aui-nav-selected>a, +.aui-nav-vertical .aui-nav .aui-nav-selected>a { + color: #333; + font-weight: bold +} + +.aui-navgroup-vertical .aui-nav, +.aui-navgroup-vertical .aui-nav-heading { + border-top: 1px solid #ccc; + margin-top: 5px; + padding-top: 5px +} + +.aui-navgroup-vertical .aui-nav-heading { + padding: 10px 10px 4px 10px +} + +.aui-navgroup-vertical .aui-nav:first-child, +.aui-navgroup-vertical .aui-navgroup-inner>.aui-nav-heading:first-child, +.aui-navgroup-vertical .aui-navgroup-primary>.aui-nav-heading:first-child, +.aui-navgroup-vertical .aui-nav-heading+.aui-nav { + border-top: 0; + margin-top: 0; + padding-top: 0 +} + +.aui-navgroup-vertical .aui-nav .aui-nav { + border-top: none; + margin-top: 0; + padding: 0 0 0 26px +} + +.aui-navgroup-vertical .aui-nav .aui-nav>li { + position: relative +} + +.aui-navgroup-vertical .aui-nav .aui-nav>li:before, +.aui-navgroup-vertical .aui-nav .aui-nav>li:after { + background-color: #ccc; + content: ""; + left: -1px; + position: absolute +} + +.aui-navgroup-vertical .aui-nav .aui-nav>li:before { + bottom: 0; + top: 0; + width: 1px +} + +.aui-navgroup-vertical .aui-nav .aui-nav>li:after { + height: 1px; + top: 14px; + width: 5px +} + +.aui-navgroup-vertical .aui-nav .aui-nav>li:last-child:before, +.aui-navgroup-vertical .aui-nav .aui-nav>li.aui-nav-more:before { + bottom: 50% +} + +.aui-navgroup-vertical .aui-nav>li[aria-expanded] { + position: relative +} + +.aui-navgroup-vertical .aui-nav>li[aria-expanded] .aui-nav-heading { + padding-left: 0 +} + +.aui-navgroup-vertical .aui-nav>li[aria-expanded] .aui-nav-subtree-toggle { + color: #999; + left: 0; + position: absolute; + padding-left: 0; + padding-right: 0; + top: 0; + width: 15px +} + +.aui-navgroup-vertical .aui-nav>li[aria-expanded] li { + position: relative +} + +.aui-navgroup-vertical .aui-nav>li[aria-expanded][aria-expanded="false"]>* { + display: none +} + +.aui-navgroup-vertical .aui-nav>li[aria-expanded][aria-expanded="false"]>.aui-nav-subtree-toggle, +.aui-navgroup-vertical .aui-nav>li[aria-expanded][aria-expanded="false"]>.aui-nav-item { + display: inherit +} + +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions { + border-radius: 2px; + display: block; + height: 16px; + margin: 0; + overflow: hidden; + padding: 0; + position: absolute; + right: 5px; + text-indent: -999em; + top: 7px; + width: 16px +} + +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions:after { + border: 4px solid transparent; + border-top-color: #333; + content: ""; + height: 0; + left: 4px; + position: absolute; + top: 6px; + width: 0 +} + +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions:hover, +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions:focus, +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions:active, +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions.active { + background-color: #ccc +} + +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions:hover:after, +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions:focus:after, +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions:active:after, +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions.active:after { + border-top-color: #333 +} + +.aui-navgroup-vertical .aui-nav .aui-nav-item-actions~.aui-nav-item-label { + margin-right: 15px +} + +.aui-navgroup-horizontal { + background: #f5f5f5; + border-top: 1px solid #ccc; + border-bottom: 1px solid #ccc; + margin: 0; + padding: 0 10px +} + +.aui-page-panel-content>.aui-navgroup-horizontal { + margin-left: -20px; + margin-right: -20px +} + +.aui-navgroup-horizontal+.aui-page-panel { + border-top: 0; + margin-top: 0 +} + +.aui-page-panel-content>.aui-navgroup-horizontal:first-child { + margin-top: -20px +} + +.aui-navgroup-horizontal .aui-nav>li a { + color: #3572b0; + display: block; + margin: 0; + padding: 9px 10px; + text-decoration: none +} + +.aui-navgroup-horizontal .aui-nav>li a.active, +.aui-navgroup-horizontal .aui-nav>li a:focus, +.aui-navgroup-horizontal .aui-nav>li a:hover { + background: #e6e6e6; + text-decoration: none +} + +.aui-navgroup-horizontal .aui-nav>.aui-nav-selected a { + color: #333; + font-weight: bold; + position: relative +} + +.aui-navgroup-horizontal .aui-nav>.aui-nav-selected a:before, +.aui-navgroup-horizontal .aui-nav>.aui-nav-selected a:after { + border: 8px solid transparent; + border-style: outset outset solid outset; + border-bottom-color: #ccc; + bottom: 0; + content: ""; + height: 0; + left: 50%; + margin-left: -8px; + overflow: hidden; + position: absolute; + width: 0 +} + +.aui-navgroup-horizontal .aui-nav>.aui-nav-selected a:after { + background: transparent; + border-bottom-color: #fff; + bottom: -1px +} + +.aui-navgroup-horizontal .aui-nav, +.aui-navgroup-horizontal .aui-nav-heading, +.aui-navgroup-horizontal .aui-navgroup-primary { + float: left +} + +.aui-navgroup-horizontal .aui-navgroup-secondary { + float: right +} + +.aui-navgroup-horizontal .aui-dropdown2-trigger .aui-icon-dropdown { + display: none +} + +.aui-navgroup-horizontal .aui-dropdown2-trigger { + padding-right: 23px !important; + position: relative +} + +.aui-navgroup-horizontal .aui-nav>li a.aui-dropdown2-trigger:after { + border: 4px solid transparent; + content: ""; + height: 0; + left: 100%; + margin-left: -18px; + margin-top: -3px; + opacity: 0.8; + position: absolute; + top: 50%; + width: 0 +} + +.aui-navgroup-horizontal .aui-nav>li a.aui-dropdown2-trigger:after { + border-top-color: #333 +} + +.aui-navgroup-horizontal .aui-nav>li a.aui-dropdown2-trigger:hover:after, +.aui-navgroup-horizontal .aui-nav>li a.aui-dropdown2-trigger.active:after { + opacity: 1 +} + +.aui-navgroup-horizontal .aui-nav-breadcrumbs>li, +.aui-navgroup-horizontal .aui-nav-breadcrumbs>li:before { + padding: 0 +} + +.aui-navgroup-horizontal .aui-nav-breadcrumbs>li a { + display: inline-block +} + +.aui-navgroup-horizontal .aui-nav-heading { + padding: 10px 10px 0 10px +} + +.aui-nav-actions-list { + font-size: 0; + list-style: none; + margin: 10px 0 0 0; + padding: 0 +} + +.aui-nav-actions-list:first-child { + margin-top: 0 +} + +.aui-nav-actions-list>li { + display: inline-block; + font-size: 14px; + margin-bottom: 5px; + margin-right: 10px +} + +/* module-key = 'com.atlassian.auiplugin:aui-experimental-iconfont', location = 'src/less/adg-iconfont.less' */ +@font-face { + font-family: "Atlassian Icons"; + src: url(/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-experimental-iconfont/fonts/atlassian-icons.eot); + src: url(/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-experimental-iconfont/fonts/atlassian-icons.eot?#iefix) format("embedded-opentype"), url(/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-experimental-iconfont/fonts/atlassian-icons.woff) format("woff"), url(/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-experimental-iconfont/fonts/atlassian-icons.ttf) format("truetype"), url(/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-experimental-iconfont/fonts/atlassian-icons.svg#atlassian-icons) format("svg"); + font-weight: normal; + font-style: normal +} + +.aui-iconfont-add:before { + content: "\f101" +} + +.aui-iconfont-add-comment:before { + content: "\f102" +} + +.aui-iconfont-add-small:before { + content: "\f103" +} + +.aui-iconfont-approve:before { + content: "\f104" +} + +.aui-iconfont-appswitcher:before { + content: "\f105" +} + +.aui-iconfont-arrows-down:before { + content: "\f106" +} + +.aui-iconfont-arrows-left:before { + content: "\f107" +} + +.aui-iconfont-arrows-right:before { + content: "\f108" +} + +.aui-iconfont-arrows-up:before { + content: "\f109" +} + +.aui-iconfont-attachment:before { + content: "\f10a" +} + +.aui-iconfont-attachment-small:before { + content: "\f10b" +} + +.aui-iconfont-autocomplete-date:before { + content: "\f10c" +} + +.aui-iconfont-back-page:before { + content: "\f10d" +} + +.aui-iconfont-blogroll:before { + content: "\f10e" +} + +.aui-iconfont-bp-decisions:before { + content: "\f10f" +} + +.aui-iconfont-bp-default:before { + content: "\f110" +} + +.aui-iconfont-bp-files:before { + content: "\f111" +} + +.aui-iconfont-bp-requirements:before { + content: "\f112" +} + +.aui-iconfont-bp-howto:before { + content: "\f113" +} + +.aui-iconfont-bp-jira:before { + content: "\f114" +} + +.aui-iconfont-bp-meeting:before { + content: "\f115" +} + +.aui-iconfont-bp-retrospective:before { + content: "\f116" +} + +.aui-iconfont-bp-sharedlinks:before { + content: "\f117" +} + +.aui-iconfont-bp-troubleshooting:before { + content: "\f118" +} + +.aui-iconfont-build:before { + content: "\f119" +} + +.aui-iconfont-calendar:before { + content: "\f11a" +} + +.aui-iconfont-close-dialog:before { + content: "\f11b" +} + +.aui-iconfont-collapsed:before { + content: "\f11c" +} + +.aui-iconfont-comment:before { + content: "\f11d" +} + +.aui-iconfont-configure:before { + content: "\f11e" +} + +.aui-iconfont-confluence:before { + content: "\f11f" +} + +.aui-iconfont-copy-clipboard:before { + content: "\f120" +} + +.aui-iconfont-custom-bullet:before { + content: "\f121" +} + +.aui-iconfont-delete:before { + content: "\f122" +} + +.aui-iconfont-deploy:before { + content: "\f123" +} + +.aui-iconfont-details:before { + content: "\f124" +} + +.aui-iconfont-devtools-arrow-left:before { + content: "\f125" +} + +.aui-iconfont-devtools-arrow-right:before { + content: "\f126" +} + +.aui-iconfont-devtools-branch:before { + content: "\f127" +} + +.aui-iconfont-devtools-branch-small:before { + content: "\f128" +} + +.aui-iconfont-devtools-browse-up:before { + content: "\f129" +} + +.aui-iconfont-devtools-checkout:before { + content: "\f12a" +} + +.aui-iconfont-devtools-clone:before { + content: "\f12b" +} + +.aui-iconfont-devtools-commit:before { + content: "\f12c" +} + +.aui-iconfont-devtools-compare:before { + content: "\f12d" +} + +.aui-iconfont-devtools-file:before { + content: "\f12e" +} + +.aui-iconfont-devtools-file-binary:before { + content: "\f12f" +} + +.aui-iconfont-devtools-file-commented:before { + content: "\f130" +} + +.aui-iconfont-devtools-folder-closed:before { + content: "\f131" +} + +.aui-iconfont-devtools-folder-open:before { + content: "\f132" +} + +.aui-iconfont-devtools-fork:before { + content: "\f133" +} + +.aui-iconfont-devtools-pull-request:before { + content: "\f134" +} + +.aui-iconfont-devtools-repository:before { + content: "\f135" +} + +.aui-iconfont-devtools-repository-forked:before { + content: "\f136" +} + +.aui-iconfont-devtools-repository-locked:before { + content: "\f137" +} + +.aui-iconfont-devtools-side-diff:before { + content: "\f138" +} + +.aui-iconfont-devtools-submodule:before { + content: "\f139" +} + +.aui-iconfont-devtools-tag:before { + content: "\f13a" +} + +.aui-iconfont-devtools-tag-small:before { + content: "\f13b" +} + +.aui-iconfont-devtools-task-cancelled:before { + content: "\f13c" +} + +.aui-iconfont-devtools-task-disabled:before { + content: "\f13d" +} + +.aui-iconfont-devtools-task-in-progress:before { + content: "\f13e" +} + +.aui-iconfont-doc:before { + content: "\f13f" +} + +.aui-iconfont-down:before { + content: "\f140" +} + +.aui-iconfont-drag-vertical:before { + content: "\f141" +} + +.aui-iconfont-edit:before { + content: "\f142" +} + +.aui-iconfont-edit-small:before { + content: "\f143" +} + +.aui-iconfont-editor-align-center:before { + content: "\f144" +} + +.aui-iconfont-editor-align-left:before { + content: "\f145" +} + +.aui-iconfont-editor-align-right:before { + content: "\f146" +} + +.aui-iconfont-editor-bold:before { + content: "\f147" +} + +.aui-iconfont-editor-color:before { + content: "\f148" +} + +.aui-iconfont-editor-emoticon:before { + content: "\f149" +} + +.aui-iconfont-editor-help:before { + content: "\f14a" +} + +.aui-iconfont-editor-hr:before { + content: "\f14b" +} + +.aui-iconfont-editor-indent:before { + content: "\f14c" +} + +.aui-iconfont-editor-italic:before { + content: "\f14d" +} + +.aui-iconfont-editor-layout:before { + content: "\f14e" +} + +.aui-iconfont-editor-list-bullet:before { + content: "\f14f" +} + +.aui-iconfont-editor-list-number:before { + content: "\f150" +} + +.aui-iconfont-editor-macro-toc:before { + content: "\f151" +} + +.aui-iconfont-editor-mention:before { + content: "\f152" +} + +.aui-iconfont-editor-outdent:before { + content: "\f153" +} + +.aui-iconfont-editor-styles:before { + content: "\f154" +} + +.aui-iconfont-editor-symbol:before { + content: "\f155" +} + +.aui-iconfont-editor-table:before { + content: "\f156" +} + +.aui-iconfont-editor-task:before { + content: "\f157" +} + +.aui-iconfont-editor-underline:before { + content: "\f158" +} + +.aui-iconfont-email:before { + content: "\f159" +} + +.aui-iconfont-error:before { + content: "\f15a" +} + +.aui-iconfont-expanded:before { + content: "\f15b" +} + +.aui-iconfont-file-code:before { + content: "\f15c" +} + +.aui-iconfont-file-doc:before { + content: "\f15d" +} + +.aui-iconfont-file-java:before { + content: "\f15e" +} + +.aui-iconfont-file-pdf:before { + content: "\f15f" +} + +.aui-iconfont-file-ppt:before { + content: "\f160" +} + +.aui-iconfont-file-txt:before { + content: "\f161" +} + +.aui-iconfont-file-wav:before { + content: "\f162" +} + +.aui-iconfont-file-xls:before { + content: "\f163" +} + +.aui-iconfont-file-zip:before { + content: "\f164" +} + +.aui-iconfont-flag:before { + content: "\f165" +} + +.aui-iconfont-focus:before { + content: "\f166" +} + +.aui-iconfont-group:before { + content: "\f167" +} + +.aui-iconfont-handle-horizontal:before { + content: "\f168" +} + +.aui-iconfont-help:before { + content: "\f169" +} + +.aui-iconfont-hipchat:before { + content: "\f16a" +} + +.aui-iconfont-homepage:before { + content: "\f16b" +} + +.aui-iconfont-image:before { + content: "\f16c" +} + +.aui-iconfont-image-extrasmall:before { + content: "\f16d" +} + +.aui-iconfont-image-small:before { + content: "\f16e" +} + +.aui-iconfont-info:before { + content: "\f16f" +} + +.aui-iconfont-jira:before { + content: "\f170" +} + +.aui-iconfont-jira-completed-task:before { + content: "\f171" +} + +.aui-iconfont-jira-test-session:before { + content: "\f172" +} + +.aui-iconfont-like:before { + content: "\f173" +} + +.aui-iconfont-like-small:before { + content: "\f174" +} + +.aui-iconfont-weblink:before { + content: "\f175" +} + +.aui-iconfont-link:before { + content: "\f176" +} + +.aui-iconfont-list-add:before { + content: "\f177" +} + +.aui-iconfont-list-remove:before { + content: "\f178" +} + +.aui-iconfont-locked:before { + content: "\f179" +} + +.aui-iconfont-locked-small:before { + content: "\f17a" +} + +.aui-iconfont-macro-code:before { + content: "\f17b" +} + +.aui-iconfont-macro-default:before { + content: "\f17c" +} + +.aui-iconfont-macro-gallery:before { + content: "\f17d" +} + +.aui-iconfont-macro-status:before { + content: "\f17e" +} + +.aui-iconfont-more:before { + content: "\f17f" +} + +.aui-iconfont-nav-children:before { + content: "\f180" +} + +.aui-iconfont-page-blank:before { + content: "\f181" +} + +.aui-iconfont-page-blogpost:before { + content: "\f182" +} + +.aui-iconfont-page-default:before { + content: "\f183" +} + +.aui-iconfont-page-template:before { + content: "\f184" +} + +.aui-iconfont-pages:before { + content: "\f185" +} + +.aui-iconfont-quote:before { + content: "\f186" +} + +.aui-iconfont-redo:before { + content: "\f187" +} + +.aui-iconfont-remove:before { + content: "\f188" +} + +.aui-iconfont-remove-label:before { + content: "\f189" +} + +.aui-iconfont-review:before { + content: "\f18a" +} + +.aui-iconfont-rss:before { + content: "\f18b" +} + +.aui-iconfont-search:before { + content: "\f18c" +} + +.aui-iconfont-search-small:before { + content: "\f18d" +} + +.aui-iconfont-share:before { + content: "\f18e" +} + +.aui-iconfont-sidebar-link:before { + content: "\f18f" +} + +.aui-iconfont-sourcetree:before { + content: "\f190" +} + +.aui-iconfont-space-default:before { + content: "\f191" +} + +.aui-iconfont-space-personal:before { + content: "\f192" +} + +.aui-iconfont-star:before { + content: "\f193" +} + +.aui-iconfont-success:before { + content: "\f194" +} + +.aui-iconfont-table-bg:before { + content: "\f195" +} + +.aui-iconfont-table-col-left:before { + content: "\f196" +} + +.aui-iconfont-table-col-remove:before { + content: "\f197" +} + +.aui-iconfont-table-col-right:before { + content: "\f198" +} + +.aui-iconfont-table-copy-row:before { + content: "\f199" +} + +.aui-iconfont-table-cut-row:before { + content: "\f19a" +} + +.aui-iconfont-table-header-column:before { + content: "\f19b" +} + +.aui-iconfont-table-header-row:before { + content: "\f19c" +} + +.aui-iconfont-table-merge:before { + content: "\f19d" +} + +.aui-iconfont-table-no-bg:before { + content: "\f19e" +} + +.aui-iconfont-table-paste-row:before { + content: "\f19f" +} + +.aui-iconfont-table-remove:before { + content: "\f1a0" +} + +.aui-iconfont-table-row-down:before { + content: "\f1a1" +} + +.aui-iconfont-table-row-remove:before { + content: "\f1a2" +} + +.aui-iconfont-table-row-up:before { + content: "\f1a3" +} + +.aui-iconfont-table-split:before { + content: "\f1a4" +} + +.aui-iconfont-teamcals:before { + content: "\f1a5" +} + +.aui-iconfont-time:before { + content: "\f1a6" +} + +.aui-iconfont-undo:before { + content: "\f1a7" +} + +.aui-iconfont-unfocus:before { + content: "\f1a8" +} + +.aui-iconfont-unlocked:before { + content: "\f1a9" +} + +.aui-iconfont-unstar:before { + content: "\f1aa" +} + +.aui-iconfont-unwatch:before { + content: "\f1ab" +} + +.aui-iconfont-up:before { + content: "\f1ac" +} + +.aui-iconfont-user:before { + content: "\f1ad" +} + +.aui-iconfont-user-status:before { + content: "\f1ae" +} + +.aui-iconfont-view:before { + content: "\f1af" +} + +.aui-iconfont-view-card:before { + content: "\f1b0" +} + +.aui-iconfont-view-list:before { + content: "\f1b1" +} + +.aui-iconfont-view-table:before { + content: "\f1b2" +} + +.aui-iconfont-warning:before { + content: "\f1b3" +} + +.aui-iconfont-watch:before { + content: "\f1b4" +} + +.aui-iconfont-workbox:before { + content: "\f1b5" +} + +.aui-iconfont-workbox-empty:before { + content: "\f1b6" +} + +.aui-iconfont-configure-columns:before { + content: "\f1b7" +} + +.aui-iconfont-export:before { + content: "\f1b8" +} + +.aui-iconfont-export-list:before { + content: "\f1b9" +} + +.aui-iconfont-file-image:before { + content: "\f1ba" +} + +.aui-iconfont-admin-fusion:before { + content: "\f1bb" +} + +.aui-iconfont-admin-jira-fields:before { + content: "\f1bc" +} + +.aui-iconfont-admin-issue:before { + content: "\f1bd" +} + +.aui-iconfont-admin-notifications:before { + content: "\f1be" +} + +.aui-iconfont-admin-roles:before { + content: "\f1bf" +} + +.aui-iconfont-admin-jira-screens:before { + content: "\f1c0" +} + +.aui-iconfont-pause:before { + content: "\f1c1" +} + +.aui-iconfont-priority-highest:before { + content: "\f1c2" +} + +.aui-iconfont-priority-high:before { + content: "\f1c3" +} + +.aui-iconfont-priority-medium:before { + content: "\f1c4" +} + +.aui-iconfont-priority-low:before { + content: "\f1c5" +} + +.aui-iconfont-priority-lowest:before { + content: "\f1c6" +} + +.aui-iconfont-refresh-small:before { + content: "\f1c7" +} + +.aui-iconfont-share-list:before { + content: "\f1c8" +} + +.aui-iconfont-switch-small:before { + content: "\f1c9" +} + +.aui-iconfont-version:before { + content: "\f1ca" +} + +.aui-iconfont-workflow:before { + content: "\f1cb" +} + +.aui-iconfont-admin-jira-settings:before { + content: "\f1cc" +} + +.aui-iconfont-component:before { + content: "\f1cd" +} + +.aui-iconfont-reopen:before { + content: "\f1ce" +} + +.aui-iconfont-roadmap:before { + content: "\f1cf" +} + +.aui-iconfont-deploy-success:before { + content: "\f1d0" +} + +.aui-iconfont-deploy-fail:before { + content: "\f1d1" +} + +.aui-iconfont-file-generic:before { + content: "\f1d2" +} + +.aui-iconfont-arrow-down:before { + content: "\f1d3" +} + +.aui-iconfont-arrow-up:before { + content: "\f1d4" +} + +.aui-iconfont-file-video:before { + content: "\f1d5" +} + +.aui-iconfont-filter:before { + content: "\f1d6" +} + +.aui-iconfont-table-copy-column:before { + content: "\f1d7" +} + +.aui-iconfont-table-paste-column:before { + content: "\f1d8" +} + +.aui-iconfont-table-cut-column:before { + content: "\f1d9" +} + +.aui-iconfont-maximise-small:before { + content: "\f1da" +} + +.aui-iconfont-minimise-small:before { + content: "\f1db" +} + +.aui-iconfont-more-small:before { + content: "\f1dc" +} + +.aui-iconfont-move-small:before { + content: "\f1dd" +} + +.aui-iconfont-download:before { + content: "\f1de" +} + +.aui-iconfont-upload:before { + content: "\f1df" +} + +.aui-iconfont-version-unreleased:before { + content: "\f1e0" +} + +.aui-iconfont-puzzle:before { + content: "\f1e1" +} + +.aui-iconfont-editor-files:before { + content: "\f1e2" +} + +.aui-iconfont-bp-sprint:before { + content: "\f1e3" +} + +.aui-iconfont-jira-issues:before { + content: "\f1e4" +} + +.aui-iconfont-bitbucket:before { + content: "\f1e5" +} + +.aui-iconfont-blogroll-large:before { + content: "\f1e6" +} + +.aui-iconfont-email-large:before { + content: "\f1e7" +} + +.aui-iconfont-layout-1col-large:before { + content: "\f1e8" +} + +.aui-iconfont-layout-2col-large:before { + content: "\f1e9" +} + +.aui-iconfont-layout-2col-left-large:before { + content: "\f1ea" +} + +.aui-iconfont-layout-2col-right-large:before { + content: "\f1eb" +} + +.aui-iconfont-layout-3col-center-large:before { + content: "\f1ec" +} + +.aui-iconfont-layout-3col-large:before { + content: "\f1ed" +} + +.aui-iconfont-nav-children-large:before { + content: "\f1ee" +} + +.aui-iconfont-pages-large:before { + content: "\f1ef" +} + +.aui-iconfont-sidebar-link-large:before { + content: "\f1f0" +} + +.aui-iconfont-teamcals-large:before { + content: "\f1f1" +} + +.aui-iconfont-user-large:before { + content: "\f1f2" +} + +/* module-key = 'com.atlassian.auiplugin:aui-header-unresponsive', location = 'src/less/aui-header.less' */ +aui-header { + display: block +} + +.aui-header { + background: #205081; + border-bottom: 1px solid #2e3d54; + box-sizing: border-box; + color: #fff; + padding: 0 10px +} + +.aui-header:after, +.aui-header .aui-header-logo a:after { + content: ""; + display: table; + clear: both +} + +.aui-header .aui-header-logo, +.aui-header .aui-nav { + margin: 0; + padding: 0; + float: left +} + +.aui-header .aui-header-secondary .aui-nav { + float: right +} + +.aui-header .aui-nav>li { + float: left; + padding: 0 +} + +.aui-header a { + color: #fff; + display: block; + line-height: 1; + padding: 13px 10px +} + +.aui-header a:visited, +.aui-header a:focus, +.aui-header a:hover, +.aui-header a:active { + text-decoration: none +} + +.aui-header .aui-header-logo a { + box-sizing: border-box; + float: left; + height: 40px; + padding: 0 10px +} + +.aui-header .aui-header-logo.aui-header-logo-textonly a { + font-size: 24px; + padding: 5px 10px +} + +.aui-header .aui-header-logo-textonly .aui-header-logo-device { + float: left; + padding-top: 4px; + text-indent: 0 +} + +.aui-header .aui-header-logo-textonly .aui-header-logo-device+.aui-header-logo-text { + padding: 5px 0 5px 10px +} + +.aui-header .aui-header-logo .aui-header-logo-text { + display: block; + float: left; + font-size: 14px; + line-height: 1.4286; + margin: 0; + padding: 10px 0 10px 10px +} + +.aui-header .aui-header-logo-device { + background-repeat: no-repeat; + background-position: 0 50%; + background-size: 100%; + display: block; + float: left; + height: 24px; + padding: 8px 0; + text-indent: -9999px; + text-align: left +} + +.aui-header .aui-header-logo img { + border: 0; + float: left; + max-height: 30px; + padding: 5px 0 +} + +.aui-header .aui-icon { + margin: -1px 0; + vertical-align: top +} + +.aui-header a>.aui-avatar { + vertical-align: top +} + +.aui-header a>.aui-avatar-tiny { + margin: -1px 0 +} + +.aui-header a>.aui-avatar-small { + margin: -5px 0 +} + +.aui-header a.aui-button { + line-height: 1.42857142857143 +} + +.aui-header .aui-button.aui-button-primary { + background: #3572b0; + border: 0; + margin: 5px 10px 0 10px; + padding: 4px 10px +} + +.aui-header .aui-button.aui-button-primary.active { + padding-bottom: 4px +} + +.aui-header .aui-button.aui-button-primary:focus, +.aui-header .aui-button.aui-button-primary:hover { + background: #2a67a5 +} + +.aui-header .aui-button.aui-button-primary:active { + background: #3572b0 +} + +.aui-header .aui-quicksearch { + padding: 0 10px; + position: relative +} + +.aui-header .aui-quicksearch input[type='text'] { + background: rgba(0, 0, 0, 0.2); + border: none; + border-radius: 3px; + box-shadow: none; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: rgba(255, 255, 255, 0.6); + height: 2.143em; + font-family: inherit; + font-size: inherit; + margin: 5px 0; + padding: 2px 26px 2px 10px; + vertical-align: baseline; + width: 170px +} + +.aui-header .aui-quicksearch input[type='text'][type='text']:focus { + background: rgba(0, 0, 0, 0.25); + color: #fff; + outline: none +} + +.aui-header .aui-quicksearch input[type='text']::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.6) +} + +.aui-header .aui-quicksearch input[type='text']::-moz-placeholder { + color: rgba(255, 255, 255, 0.6) +} + +.aui-header .aui-quicksearch input[type='text']:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.6) +} + +.aui-header .aui-quicksearch input[type='text']:focus::-webkit-input-placeholder { + color: #fff +} + +.aui-header .aui-quicksearch input[type='text']:focus::-moz-placeholder { + color: #fff +} + +.aui-header .aui-quicksearch input[type='text']:focus:-ms-input-placeholder { + color: #fff +} + +.aui-header .aui-quicksearch:after { + color: rgba(255, 255, 255, 0.6); + content: "\f18c"; + font-family: "Atlassian Icons"; + height: 16px; + margin-top: 10px; + position: absolute; + right: 16px; + top: 0; + width: 16px +} + +.aui-header .aui-quicksearch input { + -moz-appearance: textfield; + -webkit-appearance: textfield; + background: rgba(0, 0, 0, 0.2); + border: none; + border-radius: 5em; + box-shadow: inset 1px 2px 3px rgba(0, 0, 0, 0.3); + box-sizing: border-box; + color: rgba(255, 255, 255, 0.6); + font-family: inherit; + font-size: inherit; + height: 1.71428571428571em; + line-height: 1.42857142857143; + margin: 8px 0; + padding: 2px 10px; + vertical-align: baseline; + width: 170px +} + +.aui-header .aui-quicksearch input:focus { + background-color: #fff; + outline: none +} + +/* module-key = 'com.atlassian.auiplugin:aui-header-unresponsive', location = 'src/less/adg-header.less' */ +.aui-header .aui-quicksearch { + position: relative +} + +.aui-header .aui-quicksearch input[type='text'] { + background: rgba(0, 0, 0, 0.2); + border-radius: 3px; + box-shadow: none; + color: rgba(255, 255, 255, 0.6); + height: 30px; + margin: 5px 0; + padding-right: 26px +} + +.aui-header .aui-quicksearch input[type='text'][type='text']:focus { + background: rgba(0, 0, 0, 0.25); + color: #fff +} + +.aui-header .aui-quicksearch input[type='text']::-webkit-input-placeholder { + color: rgba(255, 255, 255, 0.6) +} + +.aui-header .aui-quicksearch input[type='text']::-moz-placeholder { + color: rgba(255, 255, 255, 0.6) +} + +.aui-header .aui-quicksearch input[type='text']:-ms-input-placeholder { + color: rgba(255, 255, 255, 0.6) +} + +.aui-header .aui-quicksearch input[type='text']:focus::-webkit-input-placeholder { + color: #fff +} + +.aui-header .aui-quicksearch input[type='text']:focus::-moz-placeholder { + color: #fff +} + +.aui-header .aui-quicksearch input[type='text']:focus:-ms-input-placeholder { + color: #fff +} + +.aui-header .aui-quicksearch:after { + color: rgba(255, 255, 255, 0.6); + content: "\f18d"; + font-family: "Atlassian Icons"; + height: 16px; + margin-top: 11px; + pointer-events: none; + position: absolute; + right: 16px; + top: 0; + width: 16px +} + +/* module-key = 'com.atlassian.auiplugin:aui-header-unresponsive', location = 'src/less/atlassian-brand-logos.less' */ +.aui-header .aui-header-logo-atlassian .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-atlassian.png"); + width: 87px +} + +.aui-header .aui-header-logo-aui .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-aui.png"); + width: 36px +} + +.aui-header .aui-header-logo-bamboo .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-bamboo.png"); + width: 95px +} + +.aui-header .aui-header-logo-bitbucket .aui-header-logo-device, +.aui-header .aui-header-logo-stash .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-bitbucket.png"); + width: 100px +} + +.aui-header .aui-header-logo-clover .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-clover.png"); + width: 72px +} + +.aui-header .aui-header-logo-confluence .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-confluence.png"); + width: 118px +} + +.aui-header .aui-header-logo-crowd .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-crowd.png"); + width: 71px +} + +.aui-header .aui-header-logo-crucible .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-crucible.png"); + width: 89px +} + +.aui-header .aui-header-logo-fecru .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-fecru.png"); + width: 51px +} + +.aui-header .aui-header-logo-fisheye .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-fisheye.png"); + width: 87px +} + +.aui-header .aui-header-logo-hipchat .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-hipchat.png"); + width: 97px +} + +.aui-header .aui-header-logo-jira .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-jira.png"); + width: 57px +} + +.aui-header .aui-header-logo-answers .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-answers.png"); + width: 103px +} + +.aui-header .aui-header-logo-developers .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-developers.png"); + width: 111px +} + +.aui-header .aui-header-logo-experts .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-experts.png"); + width: 64px +} + +.aui-header .aui-header-logo-marketplace .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-marketplace.png"); + width: 116px +} + +.aui-header .aui-header-logo-support .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-support.png"); + width: 90px +} + +.aui-header .aui-header-logo-university .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-university.png"); + width: 113px +} + +.aui-header .aui-header-logo-cloud .aui-header-logo-device { + background-image: url("/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-header-unresponsive/images/logos/aui-header-logo-cloud.png"); + width: 126px +} + +/* module-key = 'com.atlassian.auiplugin:aui-header', location = 'src/less/aui-header-responsive.less' */ +.aui-header-secondary .aui-nav { + position: absolute; + right: 0 +} + +.aui-header-primary .aui-nav { + overflow: hidden; + white-space: nowrap; + width: 0px +} + +.aui-header-primary .aui-nav>li { + display: inline-block; + float: none +} + +.aui-header .aui-header-secondary { + position: relative +} + +/* module-key = 'com.atlassian.auiplugin:aui-page-header', location = 'src/less/aui-page-header.less' */ +.aui-page-header-inner { + border-spacing: 0; + box-sizing: border-box; + display: table; + table-layout: auto; + width: 100% +} + +.aui-page-header-image, +.aui-page-header-main, +.aui-page-header-actions { + box-sizing: border-box; + display: table-cell; + margin: 0; + padding: 0; + text-align: left; + vertical-align: top +} + +.aui-page-header-image { + white-space: nowrap; + width: 1px +} + +.aui-page-header-main { + vertical-align: middle +} + +.aui-page-header-image+.aui-page-header-main { + padding-left: 10px +} + +.aui-page-header-actions { + padding-left: 20px; + text-align: right; + vertical-align: middle +} + +.aui-page-header-main>h1, +.aui-page-header-main>h2, +.aui-page-header-main>h3, +.aui-page-header-main>h4, +.aui-page-header-main>h5, +.aui-page-header-main>h6 { + margin: 0 +} + +.aui-page-header-actions>.aui-buttons { + margin-bottom: 5px; + margin-top: 5px; + vertical-align: top; + white-space: nowrap +} + +.aui-page-header-image .aui-avatar { + vertical-align: top +} + +/* module-key = 'com.atlassian.auiplugin:layer', location = 'src/less/layer.less' */ +.aui-layer { + position: fixed +} + +.aui-layer[aria-hidden="true"] { + display: none +} + +.aui-blanket { + opacity: 0; + transition: opacity .2s, visibility .2s; + transition-delay: .1s; + visibility: hidden; + background: #000; + height: 100%; + left: 0px; + position: fixed; + top: 0; + width: 100%; + z-index: 2500 +} + +.aui-blanket[aria-hidden="false"] { + opacity: .5; + transition: opacity .2s; + transition-delay: .1s; + visibility: visible +} + +/* module-key = 'com.atlassian.auiplugin:aui-dropdown2', location = 'src/less/dropdown2.less' */ +.aui-dropdown2 { + box-sizing: border-box; + max-width: 300px; + min-width: 160px; + position: absolute +} + +.aui-dropdown2[aria-hidden="true"] { + top: -999em; + left: -999em +} + +.aui-dropdown2:not([resolved]) { + display: none +} + +.aui-dropdown2 [role="menuitem"], +.aui-dropdown2 [role="menuitemcheckbox"], +.aui-dropdown2 [role="menuitemradio"], +.aui-dropdown2 [role="radio"], +.aui-dropdown2 [role="checkbox"], +.aui-dropdown2 a { + -ms-user-select: none; + -moz-user-select: none; + -webkit-user-select: none; + user-select: none; + display: block +} + +.aui-dropdown2 .aui-list-truncate [role="menuitem"], +.aui-dropdown2 .aui-list-truncate [role="menuitemcheckbox"], +.aui-dropdown2 .aui-list-truncate [role="menuitemradio"], +.aui-dropdown2 .aui-list-truncate [role="radio"], +.aui-dropdown2 .aui-list-truncate [role="checkbox"], +.aui-dropdown2 .aui-list-truncate a { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.aui-dropdown2.aui-style-default { + background-color: #fff; + border: 1px solid #ccc; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2) +} + +.aui-dropdown2.aui-style-default.aui-layer { + -webkit-height: auto; + height: auto +} + +.aui-dropdown2.aui-style-default ul { + list-style: none; + margin: 2px 0; + padding-left: 0 +} + +.aui-style-default .aui-dropdown2-section+.aui-dropdown2-section { + border-top: 1px solid #ccc +} + +.aui-dropdown2.aui-style-default>strong, +.aui-dropdown2.aui-style-default .aui-dropdown2-section>strong, +.aui-dropdown2-heading { + color: #707070; + display: block; + font-size: 12px; + font-weight: bold; + padding: 7px 10px 5px; + text-transform: uppercase +} + +.aui-dropdown2.aui-style-default strong+ul { + margin-top: 0 +} + +.aui-dropdown2.aui-style-default [role="menuitem"], +.aui-dropdown2.aui-style-default [role="menuitemcheckbox"], +.aui-dropdown2.aui-style-default [role="menuitemradio"], +.aui-dropdown2.aui-style-default [role="radio"], +.aui-dropdown2.aui-style-default [role="checkbox"], +.aui-dropdown2.aui-style-default a { + color: #333; + padding: 3px 10px; + text-decoration: none +} + +.aui-dropdown2.aui-style-default [aria-disabled="true"], +.aui-dropdown2.aui-style-default a.disabled { + color: #999; + cursor: default +} + +.aui-dropdown2.aui-style-default a:focus, +.aui-dropdown2.aui-style-default a:hover { + text-decoration: none +} + +.aui-dropdown2.aui-style-default .aui-dropdown2-radio:not([aria-disabled="true"]), +.aui-dropdown2.aui-style-default .aui-dropdown2-checkbox:not([aria-disabled="true"]) { + cursor: pointer +} + +.aui-dropdown2.aui-style-default .aui-icon-container, +.aui-dropdown2.aui-style-default .aui-dropdown2-radio, +.aui-dropdown2.aui-style-default .aui-dropdown2-checkbox { + padding-left: 31px +} + +.aui-dropdown2.aui-style-default .aui-icon-container, +.aui-dropdown2.aui-style-default .aui-dropdown2-radio, +.aui-dropdown2.aui-style-default .aui-dropdown2-checkbox { + background-position: 10px 5px; + background-repeat: no-repeat; + position: relative +} + +.aui-dropdown2.aui-style-default .aui-icon-container>img, +.aui-dropdown2.aui-style-default .aui-icon-container>.aui-icon, +.aui-dropdown2.aui-style-default .aui-icon-container>.aui-avatar { + border-width: 0; + left: 10px; + position: absolute; + top: 5px +} + +.aui-dropdown2.aui-style-default .aui-icon-container>.aui-icon { + display: block; + overflow: hidden; + text-indent: -99999px +} + +.aui-dropdown2.aui-style-default .aui-dropdown2-checkbox.aui-dropdown2-checked { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAARklEQVR4AWMYysCKIR6/9CeGHwwyqILMDFpI0r8YAtF1LWT4zGCNKY0AAUDhzwzpCGlsSr4xfAVL4wSxQAWB+L0nNgBBCgAIERPkFiFDsgAAAABJRU5ErkJggg==') +} + +.aui-dropdown2.aui-style-default .aui-dropdown2-checkbox.aui-dropdown2-checked:hover, +.aui-dropdown2.aui-style-default .aui-dropdown2-checkbox.aui-dropdown2-checked.aui-dropdown2-active { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAASUlEQVR4AWMYwuC/1f94/NKf/v/4L4MqyPxfC0n61/9AdF0L/3/+b40pjVAQABT+/D8dIY1Nybf/X2HS2JXEAhUE4vee2ACEKQBagDbBsEzisQAAAABJRU5ErkJggg==') +} + +.aui-dropdown2.aui-style-default .aui-dropdown2-checkbox.aui-dropdown2-checked.aui-dropdown2-disabled, +.aui-dropdown2.aui-style-default .aui-dropdown2-checkbox.aui-dropdown2-checked.aui-dropdown2-disabled.aui-dropdown2-active { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAT0lEQVR4AWMYwuCU1Zl4vNKnP53+cUIGRXAV8wktJOlfJwPRdJ1eePrzaWsMaQQ4E3D6F1BJOkIam5Jvp7+iSqNbE3v6K1AaH7goNgBhCgCP+y953/+bowAAAABJRU5ErkJggg==') +} + +.aui-dropdown2.aui-style-default .aui-dropdown2-radio.aui-dropdown2-checked { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAALElEQVR4AWMYaoBNrV3tORC2M7BhlQdK/4fCduwKnsMVPCeogKAVhB05tAAAMmMgObCgTXMAAAAASUVORK5CYII=') +} + +.aui-dropdown2.aui-style-default .aui-dropdown2-radio.aui-dropdown2-checked:hover, +.aui-dropdown2.aui-style-default .aui-dropdown2-radio.aui-dropdown2-checked.aui-dropdown2-active { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAALUlEQVR4AWMYYuA/2//2/8+BsP0/G1YFQAkYaMeu4DlcwXOCCghaQdiRQwsAAFixP1V4DeDZAAAAAElFTkSuQmCC') +} + +.aui-dropdown2.aui-style-default .aui-dropdown2-radio.aui-dropdown2-checked.aui-dropdown2-disabled, +.aui-dropdown2.aui-style-default .aui-dropdown2-radio.aui-dropdown2-checked.aui-dropdown2-disabled.aui-dropdown2-active { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAM0lEQVR4AWMYYmAV28H2A88PPD/YvooNq4KD7Qf/Q2E7VgVAvVAFB54TVEDQCsKOHFoAAO6tNjk82BlWAAAAAElFTkSuQmCC') +} + +.aui-dropdown2.aui-dropdown2-tailed { + border: 1px solid #ccc; + margin-top: 10px +} + +.aui-dropdown2.aui-dropdown2-tailed:before, +.aui-dropdown2.aui-dropdown2-tailed:after { + border-color: transparent; + border-style: outset outset solid outset; + border-width: 8px; + bottom: 100%; + content: ""; + display: block; + height: 0; + position: absolute; + width: 0 +} + +.aui-dropdown2.aui-dropdown2-tailed:before { + border-bottom-color: #ccc; + margin-bottom: 1px +} + +.aui-dropdown2.aui-dropdown2-tailed:after { + border-bottom-color: #fff +} + +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1 { + padding: 5px 8px; + text-decoration: none +} + +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1:hover, +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1:focus, +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1.active, +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1.aui-dropdown2-active { + background-color: #326ca6; + border-radius: 4px; + color: #fff; + text-decoration: none +} + +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1.active, +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1.aui-dropdown2active { + border-radius: 4px 4px 0 0 +} + +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1[aria-disabled="true"], +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1[aria-disabled="true"]:hover, +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1[aria-disabled="true"]:focus, +.aui-dropdown2-trigger.aui-style-dropdown2triggerlegacy1[aria-disabled="true"]:active { + background: inherit; + color: #99b6d3; + cursor: default +} + +.aui-dropdown2.aui-style-default.aui-dropdown2-in-toolbar, +.aui-dropdown2.aui-style-default.aui-dropdown2-in-buttons { + margin-top: -1px; + border-top-color: #ccc +} + +.aui-dropdown2.aui-style-default.aui-dropdown2-in-header { + margin-top: 1px +} + +.aui-dropdown2.aui-style-default.aui-dropdown2-in-header.aui-dropdown2-in-buttons { + margin-top: 0 +} + +.aui-dropdown2.aui-style-default.aui-dropdown2-in-header.aui-dropdown2-tailed { + margin-top: 4px +} + +.aui-dropdown2-sub-trigger { + position: relative +} + +.aui-dropdown2-sub-trigger:after { + border: 5px solid transparent; + border-left-color: #333; + content: ""; + height: 0; + margin-left: -16px; + margin-top: -5px; + left: 100%; + position: absolute; + top: 50%; + width: 0 +} + +.aui-dropdown2-sub-trigger.active:after, +.aui-dropdown2-sub-trigger.aui-dropdown2-active:after { + border-left-color: #fff +} + +.aui-dropdown2-sub-trigger.disabled:after, +.aui-dropdown2-sub-trigger.aui-dropdown2-disabled:after { + border-left-color: #999 +} + +.aui-dropdown2.aui-dropdown2-sub-menu, +.aui-dropdown2.aui-dropdown2-in-header.aui-dropdown2-sub-menu { + margin-top: -3px +} + +.aui-dropdown2.aui-style-default:hover .aui-dropdown2-checkbox, +.aui-dropdown2.aui-style-default:hover .aui-dropdown2-radio, +.aui-dropdown2.aui-style-default:hover a { + background-color: #fff; + color: #333 +} + +.aui-dropdown2.aui-style-default:hover .aui-dropdown2-checkbox.aui-dropdown2-disabled, +.aui-dropdown2.aui-style-default:hover .aui-dropdown2-radio.aui-dropdown2-disabled, +.aui-dropdown2.aui-style-default:hover a.aui-dropdown2-disabled { + color: #999 +} + +.aui-dropdown2.aui-style-default:hover .aui-dropdown2-checkbox:not(.aui-dropdown2-disabled):hover, +.aui-dropdown2.aui-style-default:hover .aui-dropdown2-radio:not(.aui-dropdown2-disabled):hover, +.aui-dropdown2.aui-style-default:hover a:not(.aui-dropdown2-disabled):hover { + background-color: #3572b0; + color: #fff +} + +.aui-dropdown2.aui-style-default .active, +.aui-dropdown2.aui-style-default .aui-dropdown2-active { + background-color: #3572b0; + color: #fff +} + +.aui-dropdown2.aui-style-default .active.aui-dropdown2-disabled, +.aui-dropdown2.aui-style-default .aui-dropdown2-active.aui-dropdown2-disabled { + background-color: #f5f5f5; + color: #999 +} + +.aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless) { + padding-right: 23px !important; + position: relative +} + +.aui-button.aui-dropdown2-trigger.active:first-child, +.aui-button.aui-dropdown2-trigger.active { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + border-bottom-width: 0; + padding-bottom: 5px +} + +.aui-button-link.aui-dropdown2-trigger.active:first-child, +.aui-button-link.aui-dropdown2-trigger.active, +.aui-button-text.aui-dropdown2-trigger.active:first-child, +.aui-button-text.aui-dropdown2-trigger.active { + border-bottom-width: 1px; + box-shadow: none; + padding-bottom: 5px +} + +.aui-buttons .aui-button.aui-button-subtle.aui-dropdown2-trigger.active, +.aui-button.aui-button-subtle.aui-dropdown2-trigger.active { + border-color: #ccc +} + +.aui-button.aui-button-subtle.aui-dropdown2-trigger:hover { + border-color: #999 +} + +.aui-button.aui-button-compact.aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless) { + padding-right: 21px !important +} + +.aui-button.aui-button-compact.aui-dropdown2-trigger:after { + margin-left: -16px +} + +.aui-button.aui-button-compact.aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless):after { + top: 11px +} + +.aui-button.aui-dropdown2-trigger.aui-button-compact.active:first-child:not(.aui-dropdown2-trigger-arrowless), +.aui-button.aui-dropdown2-trigger.aui-button-compact.active:not(.aui-dropdown2-trigger-arrowless) { + padding-bottom: 3px +} + +.aui-button.aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless):after { + border: 4px solid transparent; + content: ""; + height: 0; + left: 100%; + margin-left: -18px; + margin-top: -2px; + opacity: 0.8; + position: absolute; + top: 50%; + width: 0 +} + +.aui-button.aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless):after, +.aui-buttons .aui-button.aui-button-primary.aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless):after { + border-top-color: #333 +} + +.aui-button.aui-button-primary.aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless):after { + border-top-color: #fff +} + +.aui-button.aui-button-primary.aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless).aui-button-primary:after { + border-top-color: #fff +} + +.aui-button.aui-dropdown2-trigger:hover:after, +.aui-button.aui-dropdown2-trigger.active:after { + opacity: 1 +} + +.aui-button.aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless):after { + margin-top: 0; + top: 13px +} + +.aui-button.aui-dropdown2-trigger>.icon-dropdown, +.aui-button.aui-dropdown2-trigger>.aui-icon-dropdown { + display: none +} + +input.aui-button.aui-dropdown2-trigger, +.aui-button.aui-button-text.aui-dropdown2-trigger { + padding-right: 10px !important +} + +input.aui-button.aui-dropdown2-trigger:after, +.aui-button.aui-button-text.aui-dropdown2-trigger:after { + display: none +} + +.aui-buttons .aui-button.aui-dropdown2-trigger.aui-button-split-more, +.aui-buttons .aui-button.aui-dropdown2-trigger.aui-button-split-more.active { + padding-left: 5px; + padding-right: 10px; + text-align: left; + text-indent: -9999em +} + +.aui-button.aui-button-split-main:hover+.aui-button.aui-dropdown2-trigger.aui-button-split-more.active:hover:before, +.aui-button.aui-dropdown2-trigger.aui-button-split-more.active:hover:before, +.aui-button.aui-button-split-main:hover+.aui-button.aui-dropdown2-trigger.aui-button-split-more.active:before, +.aui-button.aui-dropdown2-trigger.aui-button-split-more.active:before, +.aui-button.aui-button-split-main:hover+.aui-button.aui-dropdown2-trigger.aui-button-split-more:focus:before, +.aui-button.aui-dropdown2-trigger.aui-button-split-more:focus:before, +.aui-button.aui-button-split-main:hover+.aui-button.aui-dropdown2-trigger.aui-button-split-more:hover:before, +.aui-button.aui-dropdown2-trigger.aui-button-split-more:hover:before { + border-left-color: #999; + bottom: -1px; + top: -1px +} + +.aui-button.aui-button-split-main:hover+.aui-button.aui-dropdown2-trigger.aui-button-split-more.active:hover.aui-button-primary:before, +.aui-button.aui-dropdown2-trigger.aui-button-split-more.active:hover.aui-button-primary:before, +.aui-button.aui-button-split-main:hover+.aui-button.aui-dropdown2-trigger.aui-button-split-more.active.aui-button-primary:before, +.aui-button.aui-dropdown2-trigger.aui-button-split-more.active.aui-button-primary:before, +.aui-button.aui-button-split-main:hover+.aui-button.aui-dropdown2-trigger.aui-button-split-more:focus.aui-button-primary:before, +.aui-button.aui-dropdown2-trigger.aui-button-split-more:focus.aui-button-primary:before, +.aui-button.aui-button-split-main:hover+.aui-button.aui-dropdown2-trigger.aui-button-split-more:hover.aui-button-primary:before, +.aui-button.aui-dropdown2-trigger.aui-button-split-more:hover.aui-button-primary:before { + border-left: 1px solid rgba(0, 0, 0, 0.3) +} + +.aui-header .aui-button-primary.aui-button-split-main:hover+.aui-button.aui-dropdown2-trigger.aui-button-split-more:before, +.aui-header .aui-button-primary.aui-dropdown2-trigger.aui-button-split-more.active:hover:before, +.aui-header .aui-button-primary.aui-dropdown2-trigger.aui-button-split-more.active:before, +.aui-header .aui-button-primary.aui-dropdown2-trigger.aui-button-split-more:hover:before, +.aui-header .aui-button-primary.aui-dropdown2-trigger.aui-button-split-more:before { + border-color: #1f4d7d; + bottom: 0; + top: 0 +} + +.aui-header .aui-dropdown2-trigger.active, +.aui-header a:focus, +.aui-header a:hover, +.aui-header a:active { + background-color: #3572b0 +} + +.aui-header .aui-dropdown2-trigger.active .aui-icon, +.aui-header a:focus .aui-icon, +.aui-header a:hover .aui-icon, +.aui-header a:active .aui-icon { + opacity: 1 +} + +.aui-header .aui-dropdown2-trigger .aui-icon-dropdown { + display: none +} + +.aui-header .aui-dropdown2-trigger:not(.aui-dropdown2-trigger-arrowless):after { + border: 4px solid transparent; + border-top-color: #fff; + content: ""; + height: 0; + margin-left: -18px; + margin-top: -2px; + opacity: 0.8; + left: 100%; + position: absolute; + text-indent: -99999px; + top: 50%; + width: 0 +} + +.aui-header .aui-dropdown2-trigger:hover:after, +.aui-header .aui-dropdown2-trigger.active:after { + opacity: 1 +} + +.aui-header .aui-button.aui-dropdown2-trigger:after { + margin-top: 0 +} + +aui-dropdown-group, +aui-section { + display: block +} + +aui-dropdown-menu.aui-dropdown2 .aui-dropdown2-heading:empty, +aui-dropdown-menu.aui-dropdown2 .aui-style-default .aui-dropdown2-section>strong:empty, +aui-dropdown-menu.aui-dropdown2 .aui-dropdown2.aui-style-default>strong:empty { + display: none +} + +aui-dropdown-menu:not([resolved]) { + display: none +} + +aui-dropdown-menu .aui-dropdown-loading { + padding: 5px +} + +aui-dropdown-menu .aui-dropdown-loading .spinner { + display: inline-block; + margin: 5px +} + +/* module-key = 'com.atlassian.auiplugin:aui-dropdown2', location = 'src/less/dropdown2-temp.css' */ +.aui-dropdown2-tailed[data-dropdown2-alignment="left"]:before, +.aui-dropdown2-tailed[data-dropdown2-alignment="left"]:after, +.aui-dropdown2-tailed.aui-alignment-snap-left:before, +.aui-dropdown2-tailed.aui-alignment-snap-left:after { + left: 20px +} + +.aui-dropdown2-tailed[data-dropdown2-alignment="right"]:before, +.aui-dropdown2-tailed[data-dropdown2-alignment="right"]:after, +.aui-dropdown2-tailed.aui-alignment-snap-right:before, +.aui-dropdown2-tailed.aui-alignment-snap-right:after { + right: 20px +} + +/* module-key = 'com.atlassian.auiplugin:fancy-file-input', location = 'node_modules/fancy-file-input/dist/fancy-file-input.css' */ +.ffi { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: inset 0 1px 3px #ddd; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: #333; + display: inline-block; + font-size: 14px; + line-height: 28px; + margin: 0; + max-width: 350px; + overflow: hidden; + padding: 0; + position: relative; + text-overflow: ellipsis; + vertical-align: top; + white-space: nowrap; + width: 100% +} + +.ffi input[type="file"] { + border: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + font-size: inherit; + height: 100%; + line-height: 28px; + left: 0; + margin: 0; + opacity: 0; + outline: 0; + padding: 0 5px; + position: absolute; + top: 0; + width: 100% +} + +.ffi input[type="file"]:hover { + cursor: pointer +} + +.ffi input[type="file"][disabled] { + cursor: not-allowed +} + +.ffi[data-ffi-value]:after { + -moz-box-sizing: border-box; + box-sizing: border-box; + color: #333; + content: attr(data-ffi-value); + display: block; + font-style: normal; + overflow: hidden; + padding: 0 5px; + text-overflow: ellipsis; + z-index: -1 +} + +.ffi:before { + background: #eee; + border-left: 1px solid #ccc; + -moz-box-sizing: border-box; + box-sizing: border-box; + color: #333; + content: attr(data-ffi-button-text); + cursor: pointer; + float: right; + line-height: 28px; + margin: 0; + padding: 0 10px; + white-space: nowrap +} + +.ffi:hover:before { + background: #f7f7f7; + color: #000 +} + +.ffi.is-focused { + border-color: #707070; + outline: 0 +} + +.ffi.is-disabled { + background-color: #eee +} + +.ffi.is-disabled:before { + border-color: #ccc; + color: #707070 +} + +.ffi.is-disabled:hover:before, +.ffi.is-disabled:active:before, +.ffi.is-disabled:active:hover:before { + background: #eee; + box-shadow: none +} + +.ffi.is-disabled:hover:before { + color: #707070 +} + +.ffi-clear { + background: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20viewBox%3D%220%200%2016%2016%22%20style%3D%22background-color%3A%23ffffff00%22%20version%3D%221.1%22%20xml%3Aspace%3D%22preserve%22%20x%3D%220px%22%20y%3D%220px%22%20width%3D%2216px%22%20height%3D%2216px%22%3E%3Cg%3E%3Cpath%20d%3D%22M%208%200%20C%203.6%200%200%203.6%200%208%20C%200%2012.4%203.6%2016%208%2016%20C%2012.4%2016%2016%2012.4%2016%208%20C%2016%203.6%2012.4%200%208%200%20ZM%2012.8%2011%20L%2010.9%2012.8%20L%208%209.8%20L%205%2012.8%20L%203.1%2011%20L%206.1%208%20L%203.1%205%20L%205%203.2%20L%208%206.2%20L%2010.9%203.2%20L%2012.8%205%20L%209.8%208%20L%2012.8%2011%20Z%22%20fill%3D%22%23000000%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E") no-repeat 0 0; + border: 0; + color: #333; + cursor: pointer; + float: right; + height: 16px; + line-height: 16px; + margin: 6px; + opacity: .56; + overflow: hidden; + padding: 0; + position: relative; + text-align: left; + text-indent: 999em; + white-space: nowrap; + width: 16px +} + +.ffi-clear:hover { + opacity: 1 +} + +@media screen and (-ms-high-contrast:active), +(-ms-high-contrast:none) { + .ffi input[type="file"] { + line-height: normal + } +} + +/* module-key = 'com.atlassian.auiplugin:fancy-file-input', location = 'src/less/adg-fancy-file-input.less' */ +.ffi { + background-color: #fff; + border-color: #ccc; + border-radius: 3.01px; + box-shadow: none; + color: #333; + font-size: 14px; + max-width: 250px +} + +form.aui .field-group .ffi { + float: none; + margin: 0; + padding: 0; + word-wrap: normal; + text-align: left; + width: 100% +} + +form.aui.top-label .field-group .ffi { + display: inline-block; + margin: 0; + width: 100% +} + +form.aui.long-label .field-group .ffi { + margin: 0; + width: 100% +} + +.ffi input[type="file"] { + padding: 0 5px +} + +.ffi[data-ffi-value]:after { + color: #333; + padding: 0 5px +} + +.ffi:before { + background: #f2f2f2; + background: -webkit-linear-gradient(top, #fff 0, #f2f2f2 100%); + background: linear-gradient(to bottom, #fff 0, #f2f2f2 100%); + border-left-color: #ccc; + color: #333; + padding: 0 10px; + text-shadow: 0 3px 6px #fff +} + +.ffi:hover:before { + background: #f7f7f7; + background: -webkit-linear-gradient(top, #fff 0, #f7f7f7 100%); + background: linear-gradient(to bottom, #fff 0, #f7f7f7 100%); + color: #000; + text-shadow: 0 3px 6px #fff +} + +.ffi:active:before, +.ffi:active:hover:before { + background-color: #f2f2f2; + background-image: none; + text-decoration: none; + text-shadow: none +} + +.ffi.is-focused { + border-color: #707070 +} + +.ffi.is-disabled { + background-color: #f5f5f5; + color: #999 +} + +.ffi.is-disabled:before, +.ffi.is-disabled:hover:before, +.ffi.is-disabled:active:before, +.ffi.is-disabled:active:hover:before { + background: -webkit-linear-gradient(top, #fff 0, #f2f2f2 100%); + background: linear-gradient(to bottom, #fff 0, #f2f2f2 100%); + border-color: #ccc; + box-shadow: none; + color: #999; + text-shadow: none +} + +.ffi.is-disabled:after { + color: #999 +} + +.ffi-clear { + background-image: none; + opacity: 1; + -ms-filter: none +} + +.ffi-clear:hover { + opacity: 1; + -ms-filter: none +} + +.ffi-clear:before { + color: #707070; + content: "\f188"; + font-family: "Atlassian Icons"; + font-size: 16px; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-weight: normal; + left: 0; + line-height: 1; + margin-top: -8px; + position: absolute; + speak: none; + text-indent: 0; + top: 50% +} + +.ffi-clear:hover:before { + color: #333 +} + +/* module-key = 'com.atlassian.auiplugin:dialog', location = 'src/less/dialog.less' */ +.aui-dialog-shadow-parent { + position: fixed; + overflow: hidden; + left: 50%; + top: 50% +} + +.aui-popup { + background-color: #fff; + left: 50%; + position: fixed; + top: 50%; + z-index: 3000 +} + +.aui-dialog { + background: #f5f5f5; + border: 1px solid #ccc; + border-radius: 5px; + overflow: hidden +} + +.aui-dialog .dialog-blanket { + position: absolute; + top: 0; + left: 0; + opacity: 0.2; + background: #000 +} + +.aui-dialog .dialog-title { + border-bottom: 1px solid #ccc; + box-sizing: border-box; + height: 56px; + margin: 0; + overflow: hidden; + padding: 15px 20px; + position: relative; + text-overflow: ellipsis; + white-space: nowrap +} + +.aui-dialog h2.dialog-title { + color: #333; + font-weight: normal; + font-size: 20px; + line-height: 1.5 +} + +.aui-dialog .dialog-page-menu { + background: #fff; + border-right: 1px solid #ccc; + box-sizing: border-box; + float: left; + height: 100%; + list-style: none; + margin: 0; + overflow-x: hidden; + overflow-y: auto; + padding: 10px 10px 20px 10px; + width: 25% +} + +.aui-dialog .dialog-page-menu li.page-menu-item { + margin: 0; + padding: 0 +} + +.aui-dialog .dialog-page-menu li.page-menu-item button.item-button { + background: none; + border: 0; + color: #3572b0; + cursor: pointer; + font-family: inherit; + font-size: inherit; + line-height: 1.1428; + padding: 7px 10px; + margin: 0; + text-align: left; + text-decoration: none; + width: 100% +} + +.aui-dialog .dialog-page-menu li.page-menu-item button.item-button:hover, +.aui-dialog .dialog-page-menu li.page-menu-item button.item-button:focus { + background-color: #e6e6e6 +} + +.aui-dialog .dialog-page-menu li.page-menu-item.selected button.item-button { + color: #333; + font-weight: bold +} + +.aui-dialog .dialog-page-menu li.page-menu-item button.item-button:active, +.aui-dialog .dialog-page-menu li.page-menu-item.selected button.item-button:active { + background-color: #3572b0; + color: #fff +} + +.aui-dialog .dialog-page-body { + background: #fff +} + +.aui-dialog .dialog-panel-body { + box-sizing: border-box; + overflow: auto; + padding: 20px +} + +.aui-dialog .dialog-panel-body>*:first-child { + margin-top: 0 +} + +.aui-dialog .dialog-button-panel { + border-top: 1px solid #ccc; + box-sizing: border-box; + clear: both; + height: 51px; + overflow: hidden; + padding: 10px; + text-align: right; + width: 100% +} + +.aui-dialog .dialog-button-panel button.button-panel-button { + box-sizing: border-box; + background: #fff; + border: 1px solid #ccc; + border-radius: 3.01px; + color: #333; + cursor: pointer; + display: inline-block; + font-size: 14px; + font-family: Arial, sans-serif; + font-variant: normal; + line-height: 20px; + padding: 4px 10px; + text-decoration: none; + text-shadow: 0 1px 0 white; + vertical-align: baseline +} + +.aui-dialog .dialog-button-panel button.button-panel-button::-moz-focus-inner { + border: 0; + padding: 0 +} + +.aui-dialog .dialog-button-panel button.button-panel-button:focus, +.aui-dialog .dialog-button-panel button.button-panel-button:hover { + background: #e9e9e9; + border-color: #999; + color: #000; + text-decoration: none +} + +.aui-dialog .dialog-button-panel button.button-panel-button:active { + box-shadow: inset 0 3px 6px 0 rgba(0, 0, 0, 0.1); + background: #f5f5f5; + text-shadow: none; + text-decoration: none +} + +.aui-dialog .dialog-button-panel a.button-panel-link { + background: transparent; + border-color: transparent; + color: #3572b0; + display: inline-block; + padding: 5px 0; + text-decoration: none; + text-shadow: none +} + +.aui-dialog .dialog-button-panel a.button-panel-link:focus, +.aui-dialog .dialog-button-panel a.button-panel-link:hover, +.aui-dialog .dialog-button-panel a.button-panel-link:active { + background: transparent; + border-color: transparent; + box-shadow: none; + text-decoration: underline +} + +.aui-dialog .dialog-button-panel button.button-panel-button, +.aui-dialog .dialog-button-panel a.button-panel-link { + margin: 0 10px 0 0 +} + +.aui-dialog .dialog-button-panel button.button-panel-button.left, +.aui-dialog .dialog-button-panel a.button-panel-link.left { + float: left; + margin: 0 0 0 10px +} + +/* module-key = 'com.atlassian.auiplugin:internal-inline-dialog-common', location = 'src/less/inline-dialog.less' */ +/*! AUI Inline Dialog */ +aui-inline-dialog { + display: block; + position: absolute; + z-index: 100 +} + +aui-inline-dialog:not([resolved]) { + display: none +} + +aui-inline-dialog .aui-inline-dialog-contents, +aui-inline-dialog .contents { + overflow-y: auto +} + +aui-inline-dialog.aui-layer[aria-hidden="true"] { + opacity: 0; + transition: opacity .2s, visibility .2s; + transition-delay: 0s; + visibility: hidden; + display: block +} + +aui-inline-dialog.aui-layer[aria-hidden="false"] { + opacity: 1; + transition: opacity .2s; + transition-delay: 0s; + visibility: visible +} + +aui-inline-dialog.aui-layer { + height: auto +} + +aui-inline-dialog.aui-alignment-side-top { + padding-bottom: 10px; + padding-top: 0 +} + +aui-inline-dialog.aui-alignment-side-top:before, +aui-inline-dialog.aui-alignment-side-top:after { + top: calc(100% - 10px); + -ms-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + transform: rotate(180deg) +} + +aui-inline-dialog.aui-alignment-side-top:after { + top: calc(100% - 11px) +} + +aui-inline-dialog.aui-alignment-side-top.aui-alignment-element-attached-top { + padding-bottom: 0; + padding-top: 10px +} + +aui-inline-dialog.aui-alignment-side-top.aui-alignment-element-attached-top:before, +aui-inline-dialog.aui-alignment-side-top.aui-alignment-element-attached-top:after { + -ms-transform: rotate(0deg); + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + top: 2px +} + +aui-inline-dialog.aui-alignment-side-top.aui-alignment-element-attached-top:after { + top: 3px +} + +aui-inline-dialog.aui-alignment-side-bottom { + padding-bottom: 0; + padding-top: 10px +} + +aui-inline-dialog.aui-alignment-side-bottom:before { + top: 2px +} + +aui-inline-dialog.aui-alignment-side-bottom:after { + top: 3px +} + +aui-inline-dialog.aui-alignment-side-bottom.aui-alignment-element-attached-bottom { + padding-bottom: 10px; + padding-top: 0 +} + +aui-inline-dialog.aui-alignment-side-bottom.aui-alignment-element-attached-bottom:before, +aui-inline-dialog.aui-alignment-side-bottom.aui-alignment-element-attached-bottom:after { + top: calc(100% - 10px); + -ms-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + transform: rotate(180deg) +} + +aui-inline-dialog.aui-alignment-side-bottom.aui-alignment-element-attached-bottom:after { + top: calc(100% - 11px) +} + +aui-inline-dialog.aui-alignment-side-left { + padding-left: 0; + padding-right: 10px +} + +aui-inline-dialog.aui-alignment-side-left:before, +aui-inline-dialog.aui-alignment-side-left:after { + left: calc(100% - 14px); + -ms-transform: rotate(90deg); + -webkit-transform: rotate(90deg); + transform: rotate(90deg) +} + +aui-inline-dialog.aui-alignment-side-left:after { + left: calc(100% - 15px) +} + +aui-inline-dialog.aui-alignment-side-left.aui-alignment-element-attached-left { + padding-left: 10px; + padding-right: 0 +} + +aui-inline-dialog.aui-alignment-side-left.aui-alignment-element-attached-left:before, +aui-inline-dialog.aui-alignment-side-left.aui-alignment-element-attached-left:after { + -ms-transform: rotate(-90deg); + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + left: -2px +} + +aui-inline-dialog.aui-alignment-side-left.aui-alignment-element-attached-left:after { + left: -1px +} + +aui-inline-dialog.aui-alignment-side-right { + padding-left: 10px; + padding-right: 0 +} + +aui-inline-dialog.aui-alignment-side-right:before, +aui-inline-dialog.aui-alignment-side-right:after { + -ms-transform: rotate(-90deg); + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + left: -2px +} + +aui-inline-dialog.aui-alignment-side-right:after { + left: -1px +} + +aui-inline-dialog.aui-alignment-side-right.aui-alignment-element-attached-right { + padding-left: 0; + padding-right: 10px +} + +aui-inline-dialog.aui-alignment-side-right.aui-alignment-element-attached-right:before, +aui-inline-dialog.aui-alignment-side-right.aui-alignment-element-attached-right:after { + left: calc(100% - 14px); + -ms-transform: rotate(90deg); + -webkit-transform: rotate(90deg); + transform: rotate(90deg) +} + +aui-inline-dialog.aui-alignment-side-right.aui-alignment-element-attached-right:after { + left: calc(100% - 15px) +} + +aui-inline-dialog.aui-alignment-snap-left:before, +aui-inline-dialog.aui-alignment-snap-left:after { + left: 6px +} + +aui-inline-dialog.aui-alignment-snap-center:before, +aui-inline-dialog.aui-alignment-snap-center:after { + left: calc(50% - 8px) +} + +aui-inline-dialog.aui-alignment-snap-right:before, +aui-inline-dialog.aui-alignment-snap-right:after { + left: calc(100% - 22px) +} + +aui-inline-dialog.aui-alignment-snap-top:before, +aui-inline-dialog.aui-alignment-snap-top:after { + top: 10px +} + +aui-inline-dialog.aui-alignment-snap-middle:before, +aui-inline-dialog.aui-alignment-snap-middle:after { + top: calc(50% - 4px) +} + +aui-inline-dialog.aui-alignment-snap-bottom:before, +aui-inline-dialog.aui-alignment-snap-bottom:after { + top: calc(100% - 18px) +} + +aui-inline-dialog:before, +aui-inline-dialog:after { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-bottom: 8px solid #fff; + border-top: 0px; + content: ""; + display: inline-block; + height: 0; + position: absolute; + width: 0 +} + +aui-inline-dialog:before { + border-bottom-color: #ccc +} + +.aui-inline-dialog { + display: none; + position: absolute; + z-index: 100 +} + +aui-inline-dialog .aui-inline-dialog-contents, +.aui-inline-dialog .aui-inline-dialog-contents, +aui-inline-dialog .contents, +.aui-inline-dialog .contents { + background: #fff; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); + overflow: hidden; + padding: 20px +} + +aui-inline-dialog .aui-inline-dialog-contents.aui-inline-dialog-no-shadow, +.aui-inline-dialog .aui-inline-dialog-contents.aui-inline-dialog-no-shadow, +aui-inline-dialog .contents.aui-inline-dialog-no-shadow, +.aui-inline-dialog .contents.aui-inline-dialog-no-shadow { + box-shadow: none +} + +aui-inline-dialog .aui-inline-dialog-contents.aui-inline-dialog-auto-width, +.aui-inline-dialog .aui-inline-dialog-contents.aui-inline-dialog-auto-width, +aui-inline-dialog .contents.aui-inline-dialog-auto-width, +.aui-inline-dialog .contents.aui-inline-dialog-auto-width { + width: auto +} + +aui-inline-dialog .aui-inline-dialog-contents form.aui h2:first-child, +.aui-inline-dialog .aui-inline-dialog-contents form.aui h2:first-child, +aui-inline-dialog .contents form.aui h2:first-child, +.aui-inline-dialog .contents form.aui h2:first-child { + border-bottom: 1px solid #ccc; + margin: -7px 0 11px 0; + padding: 0 0 12px 0 +} + +aui-inline-dialog .aui-inline-dialog-contents form.aui .buttons-container, +.aui-inline-dialog .aui-inline-dialog-contents form.aui .buttons-container, +aui-inline-dialog .contents form.aui .buttons-container, +.aui-inline-dialog .contents form.aui .buttons-container { + margin-top: 16px; + padding: 0 +} + +aui-inline-dialog .aui-inline-dialog-contents .submit+.cancel, +.aui-inline-dialog .aui-inline-dialog-contents .submit+.cancel, +aui-inline-dialog .contents .submit+.cancel, +.aui-inline-dialog .contents .submit+.cancel { + margin-left: 0 +} + +aui-inline-dialog .aui-inline-dialog-arrow, +.aui-inline-dialog .aui-inline-dialog-arrow, +aui-inline-dialog .arrow, +.aui-inline-dialog .arrow { + position: absolute; + height: 16px; + top: -7px; + width: 16px +} + +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow, +aui-inline-dialog .arrow.aui-css-arrow, +.aui-inline-dialog .arrow.aui-css-arrow { + width: 1px +} + +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow::after, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow::after, +aui-inline-dialog .arrow.aui-css-arrow::after, +.aui-inline-dialog .arrow.aui-css-arrow::after, +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow::before, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow::before, +aui-inline-dialog .arrow.aui-css-arrow::before, +.aui-inline-dialog .arrow.aui-css-arrow::before { + border-color: #ccc transparent; + border-style: solid; + border-width: 0 8px 8px; + content: ""; + left: -8px; + position: absolute; + top: 0 +} + +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow:after, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow:after, +aui-inline-dialog .arrow.aui-css-arrow:after, +.aui-inline-dialog .arrow.aui-css-arrow:after { + border-bottom-color: #fff; + top: 1px +} + +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-bottom-arrow:after, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-bottom-arrow:after, +aui-inline-dialog .arrow.aui-css-arrow.aui-bottom-arrow:after, +.aui-inline-dialog .arrow.aui-css-arrow.aui-bottom-arrow:after, +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-bottom-arrow:before, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-bottom-arrow:before, +aui-inline-dialog .arrow.aui-css-arrow.aui-bottom-arrow:before, +.aui-inline-dialog .arrow.aui-css-arrow.aui-bottom-arrow:before { + border-width: 8px 8px 0 +} + +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-bottom-arrow:after, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-bottom-arrow:after, +aui-inline-dialog .arrow.aui-css-arrow.aui-bottom-arrow:after, +.aui-inline-dialog .arrow.aui-css-arrow.aui-bottom-arrow:after { + border-top-color: #fff; + top: -1px +} + +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-right-arrow, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-right-arrow, +aui-inline-dialog .arrow.aui-css-arrow.aui-right-arrow, +.aui-inline-dialog .arrow.aui-css-arrow.aui-right-arrow { + right: -7px +} + +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-left-arrow:after, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-left-arrow:after, +aui-inline-dialog .arrow.aui-css-arrow.aui-left-arrow:after, +.aui-inline-dialog .arrow.aui-css-arrow.aui-left-arrow:after, +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-left-arrow:before, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-left-arrow:before, +aui-inline-dialog .arrow.aui-css-arrow.aui-left-arrow:before, +.aui-inline-dialog .arrow.aui-css-arrow.aui-left-arrow:before { + border-width: 8px 8px 8px 0; + border-color: transparent #ccc +} + +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-left-arrow:after, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-left-arrow:after, +aui-inline-dialog .arrow.aui-css-arrow.aui-left-arrow:after, +.aui-inline-dialog .arrow.aui-css-arrow.aui-left-arrow:after { + border-color: transparent #ffffff transparent transparent; + top: 0; + right: 0 +} + +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-right-arrow:after, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-right-arrow:after, +aui-inline-dialog .arrow.aui-css-arrow.aui-right-arrow:after, +.aui-inline-dialog .arrow.aui-css-arrow.aui-right-arrow:after, +aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-right-arrow:before, +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-right-arrow:before, +aui-inline-dialog .arrow.aui-css-arrow.aui-right-arrow:before, +.aui-inline-dialog .arrow.aui-css-arrow.aui-right-arrow:before { + border-width: 8px 0 8px 8px; + border-color: transparent #ccc; + left: -7px +} + +.aui-inline-dialog .aui-inline-dialog-arrow.aui-css-arrow.aui-right-arrow:after, +.aui-inline-dialog .arrow.aui-css-arrow.aui-right-arrow:after { + border-color: transparent transparent transparent #ffffff; + top: 0; + right: 0; + left: -8px +} + +.inline-dialog-shim { + border: none; + display: block; + height: 0; + left: 0; + position: absolute; + top: 0; + width: 0; + z-index: -2 +} + +#inline-dialog-shim { + display: none +} + +/* module-key = 'com.atlassian.auiplugin:tabs', location = 'src/less/tabs.less' */ +/*! AUI Tabs */ +aui-tabs { + display: block +} + +.aui-tabs { + font-size: 14px; + line-height: 1.46 +} + +.aui-tabs>.tabs-pane { + display: none +} + +.aui-tabs>.tabs-pane.active-pane { + display: block +} + +.aui-tabs>.tabs-menu>.menu-item>a, +.aui-tabs>.tabs-menu>.menu-item>a strong { + background: transparent; + font-weight: normal; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer +} + +.aui-tabs>.tabs-menu>.menu-item.active-tab>a, +.aui-tabs>.tabs-menu>.menu-item.active-tab>a strong { + font-weight: bold +} + +.aui-tabs>.tabs-menu .menu-item a, +.aui-tabs>.tabs-menu .menu-item a:link, +.aui-tabs>.tabs-menu .menu-item a:visited { + background: #e9e9e9; + color: #333 +} + +.aui-tabs>.tabs-menu .menu-item a:focus, +.aui-tabs>.tabs-menu .menu-item a:hover { + background: #fff; + color: #333 +} + +.aui-tabs>.tabs-menu .menu-item.active-tab a, +.aui-tabs>.tabs-menu .menu-item.active-tab a:link, +.aui-tabs>.tabs-menu .menu-item.active-tab a:visited, +.aui-tabs>.tabs-menu .menu-item.active-tab a:focus, +.aui-tabs>.tabs-menu .menu-item.active-tab a:hover, +.aui-tabs>.tabs-menu .menu-item.active-tab a:active { + background: #fff; + color: #333 +} + +.aui-tabs.vertical-tabs>.tabs-menu { + position: relative; + float: left; + width: 11em; + list-style-type: none; + margin: 0; + padding: 0 +} + +.aui-tabs.vertical-tabs>.tabs-menu>.menu-item, +.aui-tabs.vertical-tabs>.tabs-menu>.aui-responsive-tabs-trigger { + border: 1px solid #ccc; + border-right: none; + margin: -1px 0 0 0 +} + +.aui-tabs.vertical-tabs>.tabs-menu>.menu-item:first-child { + margin-top: 1em +} + +.aui-tabs.vertical-tabs>.tabs-menu>.menu-item.active-tab { + margin-left: -0.5em; + margin-right: -1px +} + +.aui-tabs.vertical-tabs>.tabs-menu>.menu-item.active-tab>a>strong { + padding: 4px 10px +} + +.aui-tabs.vertical-tabs>.tabs-menu>.menu-item>a { + display: block; + text-decoration: none; + overflow: hidden; + padding: 3px 10px 4px 10px +} + +.aui-tabs.vertical-tabs>.tabs-menu>.menu-item strong { + padding-right: 0 +} + +.aui-tabs.vertical-tabs>.tabs-pane { + background: #fff; + border: 1px solid #ccc; + border-radius: 3px; + margin: 0 0 0 11em; + padding: 20px; + position: relative +} + +.aui-tabs.horizontal-tabs>.tabs-menu~.tabs-pane { + border-top: 1px solid #ccc +} + +.aui-tabs.horizontal-tabs>.tabs-menu { + display: inline-block; + margin: 0; + padding: 0; + vertical-align: top; + width: 100% +} + +.aui-tabs.horizontal-tabs[data-aui-responsive]:not([data-aui-responsive="false"])>.tabs-menu { + font-size: 0; + margin: 0 0 -1px 0; + overflow: hidden; + white-space: nowrap +} + +.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item { + background: #eee; + display: block; + float: left; + margin: 0 +} + +.aui-tabs.horizontal-tabs[data-aui-responsive]:not([data-aui-responsive="false"])>.tabs-menu>.menu-item { + border-bottom: 1px solid #ccc; + display: inline-block; + float: none; + font-size: 14px +} + +.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item:first-child { + margin-left: 20px +} + +.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item:first-child a { + border-top-left-radius: 3px; + border-left: 1px solid #ccc +} + +.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item:last-child a { + border-top-right-radius: 3px +} + +.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item>a, +.aui-tabs.aui-tabs-disabled.horizontal-tabs>.tabs-menu>.menu-item>a:focus, +.aui-tabs.aui-tabs-disabled.horizontal-tabs>.tabs-menu>.menu-item>a:hover, +.aui-tabs.aui-tabs-disabled.horizontal-tabs>.tabs-menu>.menu-item>a:active { + display: block; + border-right: 1px solid #ccc; + border-top: 1px solid #ccc; + padding: 5px 10px 4px 10px; + text-decoration: none +} + +.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item.active-tab, +.aui-tabs.horizontal-tabs[data-aui-responsive]>.tabs-menu>.menu-item.active-tab, +.aui-tabs.aui-tabs-disabled.horizontal-tabs>.tabs-menu>.active-tab:focus, +.aui-tabs.aui-tabs-disabled.horizontal-tabs>.tabs-menu>.active-tab:hover, +.aui-tabs.aui-tabs-disabled.horizontal-tabs>.tabs-menu>.active-tab:active { + border-bottom: 1px solid #fff; + margin-bottom: -1px; + position: relative +} + +.aui-tabs.horizontal-tabs>.tabs-menu>.active-tab>a, +.aui-tabs.horizontal-tabs>.tabs-menu>.active-tab>a strong { + font-weight: normal +} + +.aui-tabs.aui-tabs-disabled>.tabs-menu>.menu-item>a { + cursor: default +} + +.active-tab.reloadable-tab a, +.active-tab.reloadable-tab a strong { + cursor: pointer !important +} + +.aui-tabs.vertical-tabs.aui-legacystyle2011>.tabs-menu .menu-item strong { + text-overflow: clip +} + +.aui-tabs.vertical-tabs.aui-legacystyle2011>.tabs-menu .menu-item.active-tab { + margin-right: 0 +} + +.aui-tabs.vertical-tabs.aui-legacystyle2011>.tabs-pane { + border-radius: 0 +} + +.aui-tabs.horizontal-tabs>.tabs-menu>.menu-item.hidden { + display: none +} + +/* module-key = 'com.atlassian.auiplugin:internal-ajs-no-context-path', location = 'src/less/firebug.less' */ +#firebug-warning { + background: #ffd; + border: 1px solid #f7df92; + color: #333; + margin: 0 0 0.2em 0; + text-align: center +} + +#firebug-warning p { + margin: 0 1em; + padding: 0.3em +} + +#firebug-warning a.close { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEXf4ueZmZnu7u53d3fvpLkJAAAAT0lEQVR4XhXMsRWAIBAE0b31yC8xtwpTKIHEfijJEqAjYrkn4gQ/HAkZQ/cLDzMQOJNU0rRwqlWiRRDdFyvCdBEbKN4T3+5lO4GDNzDkX30CUBR89RT7QQAAAABJRU5ErkJggg==") no-repeat 0 0; + cursor: pointer; + display: block; + float: right; + height: 16px; + line-height: 12px; + margin: -1.5em .4em 0 0; + text-indent: -9999px; + width: 16px +} + +/* module-key = 'com.atlassian.auiplugin:aui-labels', location = 'src/less/aui-experimental-labels.less' */ +/*! AUI Label */ +.aui-label { + background: #f5f5f5; + border: 1px solid #ccc; + border-radius: 3.01px; + color: #3572b0; + display: inline-block; + font-size: 14px; + font-weight: normal; + line-height: 1; + padding: 1px 5px; + margin: 0 5px 0 0; + text-align: left; + text-decoration: none +} + +a.aui-label { + color: #3572b0 +} + +span.aui-label { + color: #333 +} + +.aui-label.aui-label-closeable.aui-label-split:hover, +a.aui-label:focus, +a.aui-label:hover, +a.aui-label:active { + border-color: #707070; + text-decoration: none +} + +.aui-label-split .aui-label-split-main:hover, +.aui-label-split .aui-label-split-main:active, +.aui-label-split .aui-label-split-main:focus { + text-decoration: none +} + +.aui-label.aui-label-closeable { + padding-right: 18px; + position: relative +} + +.aui-label-closeable .aui-icon-close { + background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAQAAABuBnYAAAAAKUlEQVQI12NgYFj0nwEKwKxF/9P+Q4TgLAgDIQEVQuJiCKBpwWoosrUAzbg31XT4p6QAAAAASUVORK5CYII=') 0 0 no-repeat; + cursor: pointer; + display: block; + float: right; + height: 8px; + position: absolute; + right: 5px; + top: 4px; + width: 8px +} + +/* module-key = 'com.atlassian.auiplugin:aui-restfultable', location = 'src/less/aui-experimental-restfultable.less' */ +span.aui-restfultable-throbber { + background: url(/wiki/s/6.1.4-confluence/_/download/resources/com.atlassian.auiplugin:aui-restfultable/wait.gif) center center no-repeat; + display: inline-block; + height: 16px; + text-align: left; + text-indent: -999px; + visibility: hidden; + width: 20px +} + +.aui-restfultable-init { + text-align: center; + vertical-align: middle; + padding: 20px +} + +.aui-restfultable-init .aui-restfultable-loading { + top: -4px; + position: relative +} + +.aui-restfultable-init .aui-restfultable-throbber, +.aui-restfultable .aui-restfultable-row.loading .aui-restfultable-throbber { + visibility: visible +} + +table.aui.aui-restfultable>thead>tr>th { + background-color: #fff +} + +.aui-restfultable .aui-restfultable-status { + width: 1px; + white-space: nowrap +} + +.aui-restfultable-row td { + vertical-align: top +} + +.aui-restfultable-row .aui-restfultable-order { + width: 8px +} + +.aui-restfultable-row .aui-restfultable-operations { + width: 160px; + white-space: nowrap +} + +.aui-restfultable-row .aui-restfultable-throbber { + width: 20px +} + +.aui-restfultable-row .aui-restfultable-operations input.button, +.aui-restfultable .aui-restfultable-row select { + margin-top: 2px +} + +.aui-restfultable .aui-restfultable-row input.text, +.aui-restfultable .aui-restfultable-row select { + box-sizing: border-box; + margin: 0; + max-width: none; + width: 100% +} + +.aui-restfultable .aui-restfultable-order { + width: 8px +} + +.aui-restfultable .aui-restfultable-row .aui-restfultable-draghandle { + display: inline-block; + width: 8px; + min-height: 24px; + margin-bottom: -6px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAADCAYAAABWKLW/AAAAGklEQVR4XmNgAIJz507/B9FgxooVSyAcZAAA9ukJwPIcIAcAAAAASUVORK5CYII="); + cursor: move +} + +.aui-restfultable-create td { + border: solid #ccc; + border-width: 1px 0 +} + +.aui-restfultable .aui-restfultable-create .aui-restfultable-draghandle { + display: none +} + +.aui-restfultable-row.aui-restfultable-focused td { + background-color: #ebf2f9 +} + +.aui-restfultable-row.aui-restfultable-disabled td { + opacity: 0.5 +} + +.aui-restfultable-readonly.ui-sortable-helper { + white-space: nowrap +} + +.aui-restfultable-readonly.aui-restfultable-movable>div { + background-color: #f5f5f5 !important; + box-sizing: border-box; + display: table-cell; + height: 100%; + min-height: 40px; + padding: 7px 10px; + vertical-align: middle +} + +.aui-restfultable-readonly>.aui-restfultable-movable { + height: 100% +} + +.aui-restfultable-readonly .aui-restfultable-editable-no-value .aui-restfultable-editable { + visibility: hidden +} + +.aui-restfultable-readonly .aui-restfultable-operations a { + visibility: visible +} + +.aui-restfultable-readonly .aui-restfultable-editable { + display: block; + box-sizing: border-box; + margin: 0; + padding: 3px 24px 2px 4px; + position: relative +} + +.aui-restfultable-readonly .aui-restfultable-editable .aui-iconfont-edit, +.aui-restfultable-readonly .aui-restfultable-editable .icon-edit-sml { + margin: 0; + position: absolute; + right: 4px; + top: 4px; + visibility: hidden +} + +.aui-restfultable-allowhover td .aui-restfultable-editable .aui-iconfont-edit, +.aui-restfultable-allowhover td .aui-restfultable-editable .icon-edit-sml { + visibility: hidden +} + +.aui-restfultable-allowhover .aui-restfultable-readonly td:hover .aui-restfultable-editable .aui-iconfont-edit, +.aui-restfultable-allowhover .aui-restfultable-readonly td:hover .aui-restfultable-editable .icon-edit-sml { + visibility: visible +} + +.aui-restfultable-readonly .aui-restfultable-editable em { + color: #999 +} + +.aui-restfultable-row.aui-restfultable-active { + background-color: #f5f5f5 +} + +.aui-restfultable-allowhover tr:hover td { + background-color: #f5f5f5 +} + +.aui-restfultable-allowhover tr.aui-restfultable-focused td { + background-color: #ebf2f9 +} + +.aui-restfultable-allowhover td:hover .aui-restfultable-editable { + visibility: visible; + background: #fffdf6; + cursor: pointer +} + +.aui-restfultable .error { + clear: both; + color: #d04437; + display: block; + margin: 5px 0 0 0 +} + +/* module-key = 'com.atlassian.auiplugin:aui-tipsy', location = 'src/css-vendor/jquery/jquery.tipsy.css' */ +.tipsy { + font-size: 10px; + position: absolute; + padding: 5px; + word-wrap: break-word; + z-index: 100000 +} + +.tipsy-inner { + background-color: #000; + color: #FFF; + max-width: 200px; + padding: 5px 8px 4px 8px; + text-align: center +} + +.tipsy-inner { + border-radius: 3px; + -moz-border-radius: 3px; + -webkit-border-radius: 3px +} + +.tipsy-arrow { + position: absolute; + width: 0; + height: 0; + line-height: 0; + border: 5px dashed #000 +} + +.tipsy-arrow-n { + border-bottom-color: #000 +} + +.tipsy-arrow-s { + border-top-color: #000 +} + +.tipsy-arrow-e { + border-left-color: #000 +} + +.tipsy-arrow-w { + border-right-color: #000 +} + +.tipsy-n .tipsy-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-bottom-style: solid; + border-top: 0; + border-left-color: transparent; + border-right-color: transparent +} + +.tipsy-nw .tipsy-arrow { + top: 0; + left: 10px; + border-bottom-style: solid; + border-top: 0; + border-left-color: transparent; + border-right-color: transparent +} + +.tipsy-ne .tipsy-arrow { + top: 0; + right: 10px; + border-bottom-style: solid; + border-top: 0; + border-left-color: transparent; + border-right-color: transparent +} + +.tipsy-s .tipsy-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-style: solid; + border-bottom: 0; + border-left-color: transparent; + border-right-color: transparent +} + +.tipsy-sw .tipsy-arrow { + bottom: 0; + left: 10px; + border-top-style: solid; + border-bottom: 0; + border-left-color: transparent; + border-right-color: transparent +} + +.tipsy-se .tipsy-arrow { + bottom: 0; + right: 10px; + border-top-style: solid; + border-bottom: 0; + border-left-color: transparent; + border-right-color: transparent +} + +.tipsy-e .tipsy-arrow { + right: 0; + top: 50%; + margin-top: -5px; + border-left-style: solid; + border-right: 0; + border-top-color: transparent; + border-bottom-color: transparent +} + +.tipsy-w .tipsy-arrow { + left: 0; + top: 50%; + margin-top: -5px; + border-right-style: solid; + border-left: none; + border-top-color: transparent; + border-bottom-color: transparent +} + +/* module-key = 'com.atlassian.auiplugin:aui-tooltips', location = 'src/less/aui-experimental-tooltip.less' */ +.tipsy { + font-size: 12px; + line-height: 20px; + font-family: Arial, sans-serif; + padding: 4px; + text-align: left +} + +.tipsy-inner { + background: rgba(51, 51, 51, 0.9); + padding: 5px 10px +} + +.tipsy-arrow { + border-color: rgba(51, 51, 51, 0.9); + border-width: 4px +} + +.tipsy-arrow-n { + border-bottom-color: rgba(51, 51, 51, 0.9); + margin-left: -4px +} + +.tipsy-arrow-s { + border-top-color: rgba(51, 51, 51, 0.9); + margin-left: -4px +} + +.tipsy-arrow-e { + border-left-color: rgba(51, 51, 51, 0.9); + margin-top: -4px +} + +.tipsy-arrow-w { + border-right-color: rgba(51, 51, 51, 0.9); + margin-top: -4px +} + +.tipsy a, +.tipsy a:visited { + color: white; + text-decoration: underline +} + +.tipsy p { + color: #ccc; + margin: 0 +} + +.aui-tooltip-title { + color: #fff; + font-weight: bold; + margin: 0 +} + +/* module-key = 'com.atlassian.auiplugin:aui-lozenge', location = 'src/less/aui-lozenge.less' */ +/*! AUI Lozenge */ +.aui-lozenge { + background: #ccc; + border: 1px solid #ccc; + border-radius: 3px; + color: #333; + display: inline-block; + font-size: 11px; + font-weight: bold; + line-height: 99%; + margin: 0; + padding: 2px 5px; + text-align: center; + text-decoration: none; + text-transform: uppercase +} + +.aui-lozenge.aui-lozenge-subtle { + background-color: #fff; + border-color: #ccc; + color: #333 +} + +.aui-lozenge-success { + background-color: #14892c; + border-color: #14892c; + color: #fff +} + +.aui-lozenge-success.aui-lozenge-subtle { + background-color: #fff; + border-color: #60b070; + color: #14892c +} + +.aui-lozenge-error { + background-color: #d04437; + border-color: #d04437; + color: #fff +} + +.aui-lozenge-error.aui-lozenge-subtle { + background-color: #fff; + border-color: #e8a29b; + color: #d04437 +} + +.aui-lozenge-current { + background-color: #f6c342; + border-color: #f6c342; + color: #594300 +} + +.aui-lozenge-current.aui-lozenge-subtle { + background-color: #fff; + border-color: #ffe9a8; + color: #594300 +} + +.aui-lozenge-complete { + background-color: #4a6785; + border-color: #4a6785; + color: #fff +} + +.aui-lozenge-complete.aui-lozenge-subtle { + background-color: #fff; + border-color: #a5b3c2; + color: #4a6785 +} + +.aui-lozenge-moved { + background-color: #815b3a; + border-color: #815b3a; + color: #fff +} + +.aui-lozenge-moved.aui-lozenge-subtle { + background-color: #fff; + border-color: #c0ad9d; + color: #815b3a +} + +/* module-key = 'confluence.web.resources:aui-experimental', location = 'includes/css/aui-experimental-overrides.css' */ +.aui-header .aui-quicksearch input[type='text'] { + width: 135px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + -webkit-transition: width 100ms linear; + transition: width 100ms linear +} + +@media screen and (min-width :1280px) { + .aui-header .aui-quicksearch input[type='text'] { + width: 220px + } +} + +.aui-header .aui-quicksearch input[type='text'] { + line-height: normal; + line-height: 1.42857142857143\9 +} + +.aui-icon-small:before { + margin-top: -8px +} + +.aui-header .aui-header-logo img { + max-height: 24px; + padding: 8px 0 +} + +.aui-datepicker-dialog .arrow.aui-css-arrow:after { + top: 1.6px +} + +/* module-key = 'confluence.web.resources:dialog', location = 'includes/css/dialog.less' */ +.dialog-header { + display: flex; + align-items: center; + height: 56px; + padding: 0 20px; + border-bottom: 1px solid #ccc +} + +.dialog-header .dialog-title { + color: #333; + font-weight: normal; + font-size: 20px; + line-height: 1.5; + margin-right: auto; + border: none; + padding: 0; + height: auto; + flex-grow: 1; + outline: 0 +} + +.dialog-tip { + float: left; + line-height: 30px; + color: #707070; + text-align: left +} + +.dialog-help-link { + font-weight: normal; + font-size: 14px; + float: right; + margin-left: 5px +} + +.dialog-button-panel .dialog-back-link { + float: left +} + +.aui-dialog .dialog-panel-body>.aui-message { + margin: 20px +} + +.aui-dialog .dialog-button-panel a.button-panel-link.disabled, +.aui-dialog .dialog-button-panel a.button-panel-link[disabled], +.aui-dialog .dialog-button-panel a.button-panel-link[aria-disabled="true"], +.aui-dialog .dialog-button-panel a.button-panel-link.disabled:hover, +.aui-dialog .dialog-button-panel a.button-panel-link[disabled]:hover, +.aui-dialog .dialog-button-panel a.button-panel-link[aria-disabled="true"]:hover, +.aui-dialog .dialog-button-panel a.button-panel-link.disabled:focus, +.aui-dialog .dialog-button-panel a.button-panel-link[disabled]:focus, +.aui-dialog .dialog-button-panel a.button-panel-link[aria-disabled="true"]:focus, +.aui-dialog .dialog-button-panel a.button-panel-link.disabled:active, +.aui-dialog .dialog-button-panel a.button-panel-link[disabled]:active, +.aui-dialog .dialog-button-panel a.button-panel-link[aria-disabled="true"]:active { + color: #999; + cursor: default; + text-decoration: none +} + +/* module-key = 'com.atlassian.auiplugin:aui-flag', location = 'src/less/flag.less' */ +#aui-flag-container { + pointer-events: none; + position: fixed; + top: 71px; + right: 30px; + z-index: 4000 +} + +.aui-flag { + left: 0; + max-height: 300px; + opacity: 0; + position: relative; + top: -10px; + transition: opacity .2s, top .5s +} + +.aui-flag[aria-hidden="true"] { + left: 300px; + max-height: 0; + opacity: 0; + overflow: hidden; + top: 0; + transition: max-height .5s .5s, margin-bottom .5s .5s, opacity .8s, left 1s +} + +.aui-flag[aria-hidden="false"] { + margin-bottom: 20px; + opacity: 1; + top: 0; + left: 0 +} + +.aui-flag .aui-message { + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-radius: 3px; + pointer-events: auto; + width: 300px +} + +/* module-key = 'confluence.web.resources:aui-overrides', location = 'includes/css/aui-overrides.css' */ +a, +a:visited, +a:focus, +a:hover, +a:active { + color: #0052cc +} + +.aui-header a.aui-button { + line-height: 1.4285714285714; + display: inline-block; + padding: 4px 10px +} + +.aui-button-primary[aria-disabled="true"] .aui-icon-wait { + background-image: url(data:image/gif;base64,R0lGODlhEAAQAPQAAJy72////6G+3MjZ6qfC3+Lr9M7d7f///9zm8fD0+bvQ5rTL4/b4+8HU6Pz8/env9tXi7wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAAFdyAgAgIJIeWoAkRCCMdBkKtIHIngyMKsErPBYbADpkSCwhDmQCBethRB6Vj4kFCkQPG4IlWDgrNRIwnO4UKBXDufzQvDMaoSDBgFb886MiQadgNABAokfCwzBA8LCg0Egl8jAggGAA1kBIA1BAYzlyILczULC2UhACH5BAkKAAAALAAAAAAQABAAAAV2ICACAmlAZTmOREEIyUEQjLKKxPHADhEvqxlgcGgkGI1DYSVAIAWMx+lwSKkICJ0QsHi9RgKBwnVTiRQQgwF4I4UFDQQEwi6/3YSGWRRmjhEETAJfIgMFCnAKM0KDV4EEEAQLiF18TAYNXDaSe3x6mjidN1s3IQAh+QQJCgAAACwAAAAAEAAQAAAFeCAgAgLZDGU5jgRECEUiCI+yioSDwDJyLKsXoHFQxBSHAoAAFBhqtMJg8DgQBgfrEsJAEAg4YhZIEiwgKtHiMBgtpg3wbUZXGO7kOb1MUKRFMysCChAoggJCIg0GC2aNe4gqQldfL4l/Ag1AXySJgn5LcoE3QXI3IQAh+QQJCgAAACwAAAAAEAAQAAAFdiAgAgLZNGU5joQhCEjxIssqEo8bC9BRjy9Ag7GILQ4QEoE0gBAEBcOpcBA0DoxSK/e8LRIHn+i1cK0IyKdg0VAoljYIg+GgnRrwVS/8IAkICyosBIQpBAMoKy9dImxPhS+GKkFrkX+TigtLlIyKXUF+NjagNiEAIfkECQoAAAAsAAAAABAAEAAABWwgIAICaRhlOY4EIgjH8R7LKhKHGwsMvb4AAy3WODBIBBKCsYA9TjuhDNDKEVSERezQEL0WrhXucRUQGuik7bFlngzqVW9LMl9XWvLdjFaJtDFqZ1cEZUB0dUgvL3dgP4WJZn4jkomWNpSTIyEAIfkECQoAAAAsAAAAABAAEAAABX4gIAICuSxlOY6CIgiD8RrEKgqGOwxwUrMlAoSwIzAGpJpgoSDAGifDY5kopBYDlEpAQBwevxfBtRIUGi8xwWkDNBCIwmC9Vq0aiQQDQuK+VgQPDXV9hCJjBwcFYU5pLwwHXQcMKSmNLQcIAExlbH8JBwttaX0ABAcNbWVbKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICSRBlOY7CIghN8zbEKsKoIjdFzZaEgUBHKChMJtRwcWpAWoWnifm6ESAMhO8lQK0EEAV3rFopIBCEcGwDKAqPh4HUrY4ICHH1dSoTFgcHUiZjBhAJB2AHDykpKAwHAwdzf19KkASIPl9cDgcnDkdtNwiMJCshACH5BAkKAAAALAAAAAAQABAAAAV3ICACAkkQZTmOAiosiyAoxCq+KPxCNVsSMRgBsiClWrLTSWFoIQZHl6pleBh6suxKMIhlvzbAwkBWfFWrBQTxNLq2RG2yhSUkDs2b63AYDAoJXAcFRwADeAkJDX0AQCsEfAQMDAIPBz0rCgcxky0JRWE1AmwpKyEAIfkECQoAAAAsAAAAABAAEAAABXkgIAICKZzkqJ4nQZxLqZKv4NqNLKK2/Q4Ek4lFXChsg5ypJjs1II3gEDUSRInEGYAw6B6zM4JhrDAtEosVkLUtHA7RHaHAGJQEjsODcEg0FBAFVgkQJQ1pAwcDDw8KcFtSInwJAowCCA6RIwqZAgkPNgVpWndjdyohACH5BAkKAAAALAAAAAAQABAAAAV5ICACAimc5KieLEuUKvm2xAKLqDCfC2GaO9eL0LABWTiBYmA06W6kHgvCqEJiAIJiu3gcvgUsscHUERm+kaCxyxa+zRPk0SgJEgfIvbAdIAQLCAYlCj4DBw0IBQsMCjIqBAcPAooCBg9pKgsJLwUFOhCZKyQDA3YqIQAh+QQJCgAAACwAAAAAEAAQAAAFdSAgAgIpnOSonmxbqiThCrJKEHFbo8JxDDOZYFFb+A41E4H4OhkOipXwBElYITDAckFEOBgMQ3arkMkUBdxIUGZpEb7kaQBRlASPg0FQQHAbEEMGDSVEAA1QBhAED1E0NgwFAooCDWljaQIQCE5qMHcNhCkjIQAh+QQJCgAAACwAAAAAEAAQAAAFeSAgAgIpnOSoLgxxvqgKLEcCC65KEAByKK8cSpA4DAiHQ/DkKhGKh4ZCtCyZGo6F6iYYPAqFgYy02xkSaLEMV34tELyRYNEsCQyHlvWkGCzsPgMCEAY7Cg04Uk48LAsDhRA8MVQPEF0GAgqYYwSRlycNcWskCkApIyEAOwAAAAAAAAAAAA==) +} + +#com-atlassian-confluence .tipsy { + line-height: 16px +} + +.aui-navgroup-inner>div:first-child>.aui-nav-heading, +.aui-navgroup-inner>div:first-child>div:first-child .aui-nav-heading { + border-top: 0; + margin-top: 0; + padding-top: 0 +} + +.aui-button { + -webkit-appearance: none +} + +form.aui .field-group .upfile { + padding: 0; + position: relative; + bottom: -4px; + font-size: 13px; + margin: 0 +} + +.aui-dropdown2 { + z-index: 1000 +} + +form.aui div.checkbox>.checkbox[disabled]+label { + color: #707070 +} + +form.aui .textarea.max-textarea { + width: 100%; + max-width: none +} + +#footer .footer-body { + background-image: none +} + +body .aui-datepicker-dialog .ui-datepicker { + position: static +} + +.aui-datepicker-dialog div.ui-datepicker .ui-datepicker-prev, +.aui-datepicker-dialog div.ui-datepicker .ui-datepicker-next { + background-image: none +} + +.aui-datepicker-dialog .ui-datepicker td .ui-state-default { + background: 0; + color: inherit +} + +.aui-datepicker-dialog .ui-datepicker .ui-datepicker-unselectable { + opacity: 1 +} + +.aui-datepicker-dialog .ui-icon { + text-indent: 0 +} + +.aui-datepicker-dialog .ui-datepicker .ui-datepicker-prev span, +.aui-datepicker-dialog .ui-datepicker .ui-datepicker-next span { + background: 0; + height: auto; + width: auto +} + +.aui-inline-dialog.aui-datepicker-dialog .hasDatepicker .ui-widget-header { + background: #f5f5f5 +} + +.aui-avatar-big img { + height: 48px; + width: 48px +} + +.ia-quick-links-header-title { + font-size: 12px; + text-transform: uppercase +} + +.ap-aui-dialog2 .aui-dialog2-content { + padding: 0 +} + +.aui-inline-dialog .aui-inline-dialog-contents, +.aui-inline-dialog .contents { + overflow: hidden +} + +.aui-dialog2.aui-layer[aria-hidden="true"].ap-aui-dialog2-chromeless>* { + opacity: 0; + visibility: hidden +} + +.aui-dialog2.aui-layer[aria-hidden="false"].ap-aui-dialog2-chromeless>* { + opacity: 1; + transition: visibility .2s, opacity .2s; + transition-delay: 0; + visibility: visible +} + +.aui-dialog2.aui-layer[aria-hidden="false"].ap-aui-dialog2-chromeless { + -webkit-transform: translateZ(0); + transform: translateZ(0); + will-change: opacity, visibility +} + +.aui-button.aui-button-text, +.aui-button.aui-button-text:visited { + background: transparent; + border-color: transparent; + color: #3572b0; + padding: 4px 0; + text-decoration: none; + box-shadow: none +} + +.aui-button.aui-button-text:focus, +.aui-button.aui-button-text:hover, +.aui-button.aui-button-text:active, +.aui-buttons .aui-button.aui-button-text:focus, +.aui-buttons .aui-button.aui-button-text:hover, +.aui-buttons .aui-button.aui-button-text:active, +.aui-buttons .aui-button.aui-button-text[aria-pressed="true"] { + background: transparent; + border-color: transparent; + box-shadow: none; + text-decoration: underline +} + +.aui-button.aui-button-text, +.aui-button.aui-button-text:visited { + border: 0; + font-size: inherit; + height: inherit; + line-height: normal; + padding: 0 +} + +.aui-button.aui-button-text[disabled], +.aui-button.aui-button-text[disabled]:hover, +.aui-button.aui-button-text[disabled]:focus, +.aui-button.aui-button-text[disabled]:active, +.aui-button.aui-button-text[aria-disabled="true"], +.aui-button.aui-button-text[aria-disabled="true"]:hover, +.aui-button.aui-button-text[aria-disabled="true"]:focus, +.aui-button.aui-button-text[aria-disabled="true"]:active { + background: transparent; + border-color: transparent; + color: #999; + text-decoration: none +} + +.aui-button.aui-button-text[disabled] .aui-icon, +.aui-button.aui-button-text[aria-disabled="true"] .aui-icon { + color: #999 +} + +.aui-inline-dialog.aui-datepicker-dialog .aui-inline-dialog-contents, +.aui-inline-dialog.aui-datepicker-dialog .contents { + padding: 0 +} + +.aui-dialog .dialog-button-panel button.button-panel-button[disabled], +.aui-dialog .dialog-button-panel button.button-panel-button[disabled]:hover, +.aui-dialog .dialog-button-panel button.button-panel-button[disabled]:focus, +.aui-dialog .dialog-button-panel button.button-panel-button[disabled]:active { + background: #f2f2f2; + background: linear-gradient(to bottom, #fff 0, #f2f2f2 100%); + border-color: #ccc; + box-shadow: none; + color: #999; + cursor: default; + text-shadow: none +} + +.aui-select2-container .select2-choices .select2-search-choice.cql-exclude { + border-color: #e9e9e9 !important; + color: #707070; + background-color: #f5f5f5 +} + +.aui-datepicker-dialog { + z-index: 40000 +} + +.aui-dropdown2.aui-layer { + top: auto; + left: auto; + right: auto; + bottom: auto +} + +.nav-links a:hover>.nav-link-label, +.nav-links a:focus>.nav-link-label, +.nav-links a:hover>.nav-link-description, +.nav-links a:focus>.nav-link-description, +.nav-links a:hover>.nav-link-edit, +.nav-links a:focus>.nav-link-edit { + color: inherit +} + +/* module-key = 'confluence.web.resources:userlink', location = 'includes/css/userlink.css' */ +.ajs-content-hover { + position: absolute; + display: none; + z-index: 3100; + text-align: left +} + +.ajs-content-hover .contents { + border-radius: 3px; + border: 1px solid #bbb; + background: white; + float: left +} + +.ajs-content-hover .vcard { + padding: 7px; + border-bottom: 1px solid #ccc +} + +.ajs-content-hover .profile-info { + padding: 7px +} + +.greybox #peoplelist .profile-macro { + width: 300px; + float: left; + margin: 20px; + height: 65px +} + +.profile-macro .vcard { + position: relative; + min-height: 48px; + white-space: nowrap +} + +.profile-macro .vcard .userLogoLink { + display: inline-block +} + +.profile-macro .vcard .user-status { + white-space: normal +} + +.profile-macro .vcard .userLogo { + float: left; + margin-right: 10px +} + +.profile-macro .vcard .values { + display: inline-block; + padding: 0; + margin: 0; + overflow: hidden; + width: 225px +} + +.profile-macro .vcard .notloggedin { + white-space: normal +} + +.profile-macro .vcard .notloggedin { + white-space: normal +} + +.profile-macro .user-status { + padding-top: 7px; + display: block; + clear: both +} + +.profile-macro .profile-info { + border-spacing: 0 +} + +.profile-macro .profile-info tr, +.profile-macro .profile-info td, +.profile-macro .profile-info th { + font-size: 14px; + padding: 0 0 2px +} + +.profile-macro .profile-info th { + padding-right: 10px +} + +.ajs-content-hover .actions .ajs-menu-bar .section-secondary li a { + padding-left: 10px +} + +.ajs-content-hover .actions .popup-follow a, +.ajs-content-hover .actions ul li a.user-popup-more { + display: block; + text-align: center; + background-color: #f5f5f5; + color: #707070; + line-height: 2 +} + +.ajs-content-hover .actions ul li { + width: 150px; + float: left +} + +.ajs-content-hover .actions ul.single-item li { + width: 300px +} + +.ajs-content-hover .actions ul li div.ajs-drop-down ul li { + width: auto; + float: none; + text-align: left +} + +.ajs-content-hover .actions .ajs-menu-bar { + float: none +} + +.ajs-content-hover .actions ul.ajs-menu-bar .popup-follow { + width: 149px +} + +.ajs-content-hover .actions ul.ajs-menu-bar .popup-follow { + border-right: 1px solid #ccc +} + +.ajs-content-hover .ajs-menu-bar .ajs-menu-item .trigger>span { + background: 0 +} + +.ajs-content-hover .ajs-menu-bar .ajs-menu-item a, +.ajs-content-hover .ajs-menu-bar .ajs-button a { + border-radius: 0; + text-decoration: none; + white-space: nowrap +} + +.ajs-content-hover .actions ul.ajs-menu-bar .ajs-menu-item a span, +.ajs-content-hover .actions ul.ajs-menu-bar .ajs-menu-item a span span { + display: inline +} + +.ajs-content-hover .actions ul.ajs-menu-bar .ajs-menu-item.opened a span span { + background: 0 +} + +.ajs-content-hover .popup-icon span { + padding-left: 20px; + background-repeat: no-repeat; + background-position: center left +} + +.ajs-content-hover .waiting span { + background-image: url(/wiki/s/1000.0.0-345b15b66054/_/download/resources/confluence.web.resources:userlink/../../../images/icons/wait.gif); + padding-left: 20px +} + +.ajs-content-hover .actions .ajs-menu-bar .unfollow-item a.follow, +.ajs-content-hover .actions .ajs-menu-bar .follow-item a.unfollow { + display: none +} + +.ajs-content-hover .actions .ajs-menu-bar .follow-item a.follow, +.ajs-content-hover .actions .ajs-menu-bar .unfollow-item a.unfollow { + display: block +} + +.ajs-content-hover .actions .ajs-menu-bar, +.ajs-content-hover .actions .ajs-menu-bar li, +.ajs-content-hover .actions .ajs-menu-bar li a, +.ajs-content-hover .actions .ajs-menu-bar .ajs-drop-down li a span { + padding-left: 0 +} + +.ajs-content-hover .actions .ajs-menu-bar .ajs-menu-item a:hover, +.ajs-content-hover .actions .ajs-menu-bar .ajs-menu-item a:focus, +.ajs-content-hover .actions .ajs-menu-bar .ajs-menu-item a:active, +.ajs-content-hover .ajs-menu-bar .ajs-menu-item.opened a.trigger { + color: #333; + background-color: #e9e9e9 +} + +.ajs-content-hover .ajs-menu-bar .ajs-menu-item .trigger span span::after { + content: "â–¾"; + padding: 0 10px 0 5px +} + +/* module-key = 'confluence.web.resources:core', location = 'includes/css/components/quicksearchdropdown.css' */ +a.search-for span:before { + font-family: "Atlassian Icons"; + font-weight: normal; + -webkit-font-smoothing: antialiased; + font-style: normal; + font-size: 16px; + border: 0; + line-height: 1; + content: "\f18c" +} + +#com-atlassian-confluence .aui-dd-parent .aui-dropdown { + background-color: #fff; + border: 1px solid #ccc; + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; + -moz-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); + box-shadow: 0 3px 6px rgba(0, 0, 0, 0.2); + padding: 0 +} + +#quick-search .aui-dd-parent .aui-dropdown { + margin-top: -2px +} + +#com-atlassian-confluence .aui-dd-parent .aui-dropdown ol { + padding: 3px 0 +} + +#quick-search .aui-dropdown li a span { + background-position: 6px center; + padding-left: 30px; + line-height: 25px +} + +#quick-search .aui-dropdown .search-for span { + padding-left: 0 +} + +#header .aui-dd-parent, +#header .aui-dropdown { + width: 315px; + position: absolute +} + +#header .quick-nav-drop-down li a, +.aui-header .quick-nav-drop-down li a { + color: #000; + padding: 0 +} + +#header .quick-nav-drop-down li.active a, +.aui-header .quick-nav-drop-down li.active a { + color: #fff +} + +#header .quick-nav-drop-down .aui-dropdown li a.space-name, +.aui-header .quick-nav-drop-down .aui-dropdown li a.space-name { + height: 13px; + line-height: 13px; + font-size: 11px; + padding-left: 30px; + color: #666; + overflow: hidden; + text-overflow: ellipsis +} + +#header .quick-nav-drop-down .aui-dropdown li.active a.space-name, +.aui-header .quick-nav-drop-down .aui-dropdown li.active a.space-name { + color: #FFF +} + +.quick-nav-drop-down li, +.quick-nav-drop-down li span { + cursor: pointer +} + +.quick-nav-drop-down li span em { + font-style: normal +} + +.quick-nav-drop-down .aui-dropdown li.with-space-name { + height: auto; + padding-top: 3px; + padding-bottom: 3px +} + +/* module-key = 'confluence.web.resources:core', location = 'includes/css/components/dropdown.css' */ +#autocomplete-dropdown, +#autocomplete-dropdown .aui-dropdown { + width: 300px +} + +.autocomplete { + position: relative +} + +.autocomplete li a span { + color: #333 +} + +.autocomplete li a span em { + font-style: normal +} + +.autocomplete li .no-results span { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABA0lEQVR42p2QP0tCURiH7zdQRA3u4OJUiyDY4CDtTuEXuXs0JEQ4uDk5C0EuKoEu+SWcg5baLCS7tNTx98IzyMWjXoeHe95/z3vODdzi2kdTvIo30fL1+YbLIhYOfsV5GsFAOL59zsNjBRfij60lEXKbf1E5RvDExl4URYGwXJfc6JCgwqZYhBp2hs5n4odadZ9gzKYu2x1YrUPt2SeosWEtijsEBfGN5HKXYErxweKkAMk9PbOkoE5hJXI+AbUVvfVtwZzkHTECAGptel8cgisSnyJDk+8GRlZ8MdOwxITghoa9ArhlZmzB+/abDjwh+c8+LBgRnMLEBHnxKJYpBpfMFDbGjWcGPFD11gAAAABJRU5ErkJggg==") no-repeat 13px 50% +} + +.autocomplete-user-target img, +.autocomplete-group-target img, +.autocomplete-user-or-group-target img { + border-radius: 3px +} + +.autocomplete .aui-dropdown li.active .no-results span { + color: #333; + background-color: #fff; + cursor: default +} + +.autocomplete li a { + position: relative +} + +.autocomplete li a .icon { + position: absolute; + top: 2px; + left: 0; + z-index: 10; + float: none +} + +.aui-dropdown ol { + border-bottom: solid 1px #f0f0f0; + list-style: none; + margin: 0; + padding: 5px 0 +} + +.aui-dropdown ol.last { + border-bottom: 0 +} + +.aui-dropdown ol li { + color: #333; + height: 24px; + line-height: 24px; + padding: 0; + margin: 2px 0; + position: relative; + white-space: nowrap; + text-overflow: ellipsis +} + +.aui-dropdown li.active, +.aui-dropdown li.active span { + background-color: #3572b0; + color: #fff +} + +.aui-dropdown li img { + position: absolute; + left: 0; + top: 0; + margin: 4px 7px; + width: 16px; + height: 16px; + border-radius: 2px; + z-index: 1 +} + +.aui-dropdown a.content-type-userinfo span { + background-image: none +} + +.aui-dropdown li a { + display: block; + outline: 0; + position: relative; + text-decoration: none +} + +.aui-dropdown li a, +.aui-dropdown li a:hover, +.aui-dropdown li a:focus, +.aui-dropdown li a:active { + text-decoration: none +} + +.aui-dropdown li a span { + background-position: 8px 50%; + background-repeat: no-repeat; + display: block; + padding-left: 33px +} + +.aui-dropdown li a span.icon { + padding: 0; + margin-left: 6px +} + +.aui-dropdown li a.search-for span { + padding-left: 0 +} + +.aui-dropdown li a.search-for span:before { + margin: 0 8px +} + +/* module-key = 'confluence.web.resources:jquery-autocomplete', location = 'includes/css/autocomplete.css' */ +div.auto_complete { + width: 350px; + background: #fff +} + +div.auto_complete ul { + border: 1px solid #888; + margin: 0; + padding: 0; + width: 100%; + list-style-type: none +} + +div.auto_complete ul li { + margin: 0; + padding: 3px +} + +div.auto_complete ul li.selected { + background-color: #ffb +} + +div.auto_complete ul strong.highlight { + color: #800; + margin: 0; + padding: 0 +} + +ol.autocompleter { + background: #fff; + border: 1px solid #888; + font-size: .9em; + list-style: none; + margin: 0; + padding: 0; + width: 15em +} + +ol.autocompleter li { + margin: 0; + padding: 3px; + cursor: default +} + +ol.autocompleter q, +ol.autocompleter i { + display: none +} + +ol.autocompleter li.focused { + background: #ccf +} + +.username-in-autocomplete-list { + color: #666; + font-size: 1em +} + +div.resize-to-input .aui-dropdown { + width: 100% +} + +/* module-key = 'confluence.web.resources:print-styles', location = 'includes/css/print.css' */ +@media print { + #main { + padding-bottom: 1em !important + } + + body { + font-family: Arial, Helvetica, FreeSans, sans-serif; + font-size: 10pt; + line-height: 1.2 + } + + body, + #full-height-container, + #main, + #page, + #content, + .has-personal-sidebar #content { + background: #fff !important; + color: #000 !important; + border: 0 !important; + width: 100% !important; + height: auto !important; + min-height: auto !important; + margin: 0 !important; + padding: 0 !important; + display: block !important + } + + a, + a:link, + a:visited, + a:focus, + a:hover, + a:active { + color: #000 + } + + #content h1, + #content h2, + #content h3, + #content h4, + #content h5, + #content h6 { + font-family: Arial, Helvetica, FreeSans, sans-serif; + page-break-after: avoid + } + + pre { + font-family: Monaco, "Courier New", monospace + } + + #header, + .aui-header-inner, + #navigation, + #sidebar, + .sidebar, + #personal-info-sidebar, + .ia-fixed-sidebar, + .page-actions, + .navmenu, + .ajs-menu-bar, + .noprint, + .inline-control-link, + .inline-control-link a, + a.show-labels-editor, + .global-comment-actions, + .comment-actions, + .quick-comment-container, + #addcomment { + display: none !important + } + + #splitter-content { + position: relative !important + } + + .comment .date::before { + content: none !important + } + + h1.pagetitle img { + height: auto; + width: auto + } + + .print-only { + display: block + } + + #footer { + position: relative !important; + margin: 0; + padding: 0; + background: 0; + clear: both + } + + #poweredby { + border-top: 0; + background: 0 + } + + #poweredby li.print-only { + display: list-item; + font-style: italic + } + + #poweredby li.noprint { + display: none + } + + .wiki-content .table-wrap, + .wiki-content p, + .panel .codeContent, + .panel .codeContent pre, + .image-wrap { + overflow: visible !important + } + + #children-section, + #comments-section .comment, + #comments-section .comment .comment-body, + #comments-section .comment .comment-content, + #comments-section .comment p { + page-break-inside: avoid + } + + #page-children a { + text-decoration: none + } + + #comments-section.pageSection .section-header, + #comments-section.pageSection .section-title, + #children-section.pageSection .section-header, + #children-section.pageSection .section-title, + .children-show-hide { + padding-left: 0; + margin-left: 0 + } + + .children-show-hide.icon { + display: none + } + + .has-personal-sidebar #content { + margin-right: 0 + } + + .has-personal-sidebar #content .pageSection { + margin-right: 0 + } + + .no-print, + .no-print * { + display: none !important + } +} + +/* module-key = 'confluence.web.resources:panel-styles', location = 'includes/css/panels.css' */ +.panel, +.alertPanel, +.infoPanel { + color: #333; + padding: 0; + margin: 10px 0; + border: 1px solid #ddd; + overflow: hidden; + border-radius: 3px +} + +.alertPanel, +.infoPanel, +.panelContent { + padding: 10px +} + +.alertPanel { + border-color: #c00 +} + +.infoPanel { + border-color: #69c +} + +.panelHeader { + padding: 10px; + border-bottom: 1px solid #ddd; + background-color: #f7f7f7 +} + +.basicPanelContainer { + border-width: 1px; + border-style: solid; + margin-top: 2px; + margin-bottom: 8px; + width: 100% +} + +.basicPanelContainer:first-child { + margin-top: 0 +} + +.basicPanelTitle { + padding: 10px; + margin: 0; + background-color: #f0f0f0; + border-bottom: 1px solid #ddd +} + +.basicPanelBody { + padding: 5px; + margin: 0 +} + +/* module-key = 'confluence.web.resources:content-styles', location = 'includes/css/master.css' */ +fieldset { + border: 0; + margin: 0; + padding: 0 +} + +.smalltext { + font-size: 12px; + color: #707070 +} + +#title-text { + margin: 0; + font-size: 28px +} + +#title-text a:hover { + text-decoration: none +} + +body.error-page #main { + padding-top: 0 +} + +body.error-page #main-header { + margin: 0 -20px; + padding: 20px; + border-bottom: 1px solid #ccc; + background-color: #f5f5f5 +} + +#main-header, +#preview-header { + margin-bottom: 20px +} + +.content-type-page #main #main-header, +.content-type-blogpost #main #main-header { + margin-top: -10px +} + +#preview-header #title-text { + color: #333; + margin-top: 10px +} + +a img { + border: 0 +} + +.hidden { + display: none +} + +.ia-splitter .aui-page-panel { + width: auto +} + +#quick-search-submit { + display: none +} + +#quick-search { + margin: 0 +} + +#quick-search.quick-search-loading:after { + display: none +} + +.aui-nav-link span+span { + margin-left: 5px +} + +.aui-nav-vertical li a:link, +.aui-nav-vertical li a:focus, +.aui-nav-vertical li a:visited, +.aui-nav-vertical li a:active { + color: #666 +} + +.in-page-menu { + padding: 10px +} + +.in-page-menu-content { + border-left: 1px solid #CCC; + padding: 0 0 20px 10px +} + +#messageContainer { + list-style-type: none; + margin: 0; + padding: 0 +} + +#messageContainer li { + display: block +} + +#messageContainer .aui-message { + margin: 0; + border-radius: 0 +} + +#breadcrumbs li.hidden-crumb { + display: none +} + +.page-metadata ul { + overflow: hidden; + margin: 0; + padding: 0 +} + +.page-metadata ul li { + list-style: none; + float: left; + padding: 0 5px 0 0; + margin: 0; + line-height: 1.5 +} + +.page-metadata ul li:first-child:before { + display: none +} + +.page-metadata ul li:before { + content: '•'; + color: #707070; + padding: 0 5px +} + +.page-metadata ul li img { + vertical-align: text-bottom +} + +.page-metadata ul a.page-tinyurl span { + float: left; + height: 16px; + width: 10px; + text-indent: -9999em +} + +.page-metadata ul a.action-view-attachments span.page-metadata-attachments-count { + margin-left: 3px +} + +#main { + margin: 0; + padding: 20px; + clear: both; + min-height: 600px +} + +.pages-collector-mode #main, +.view-blogposts-mode #main, +.content-type-page #main, +.content-type-blogpost #main { + padding: 20px 40px +} + +#main .connect-theme-background-cover { + display: none +} + +#main.themed { + padding: 0; + background: 0 +} + +#title-heading { + margin: 0; + padding: 0 +} + +#title-text a { + color: #333 +} + +.navBackgroundBox { + padding: 5px; + font-size: 22px; + font-weight: bold; + text-decoration: none +} + +.simple-confirmation>form>.buttons-container { + padding-left: 0; + margin-top: 20px +} + +#content { + clear: none !important +} + +#content::before { + display: none !important +} + +.aui-layout #footer .footer-body>ul>li.print-only { + display: none +} + +#com-atlassian-confluence .hidden { + display: none +} + +#status { + margin: 10px 0 +} + +#status table { + margin: 10px 0 +} + +#taskProgressBar { + background: #ebf2f9; + border-radius: 3px +} + +#taskGreenBar { + background: #3b7fc4 +} + +#status .smalltext { + text-align: center; + color: #707070 +} + +#content { + position: static !important +} + +hr { + border: 0; + border-bottom: 1px solid #ccc +} + +#bloglist { + display: none +} + +.children-show-hide.icon { + display: none +} + +.child-display { + padding: 2px 2px 2px 12px; + display: block +} + +#page-history-warning { + margin-bottom: 20px +} + +.page-history-view a:before { + display: inline-block; + content: "·"; + padding: 0 10px +} + +.page-history-view a:before:hover { + text-decoration: none +} + +.page-history-view a:first-child:before { + display: none; + content: ''; + padding: 0 +} + +.version-navigation-block { + padding-top: 10px +} + +.current-version-margin { + display: inline-block; + padding-left: 10px +} + +.current-version-margin:first-child { + padding: 0 +} + +.alternative-page-list { + list-style: none; + padding-left: 30px; + line-height: 20px +} + +.alternative-page-list .excerpt { + margin-left: 20px +} + +.page-section, +.page-group { + display: table; + margin: 0; + padding: 0; + width: 100% +} + +.page-section .page-group { + display: table-row; + margin: 0; + padding: 0; + width: 100% +} + +.page-item { + display: table-cell; + margin: 0; + min-width: 256px; + padding: 0 0 0 16px; + vertical-align: top +} + +body.people .dashboard { + margin-top: 0 +} + +body.people .dashboard-group>div { + margin-top: 0 +} + +body.people #main { + padding: 0 +} + +body.people #main-header { + padding: 27px 0 0 50px; + margin-bottom: 0; + background-color: #f5f5f5 +} + +.pagecontent.people-directory { + padding-left: 34px +} + +.people-directory .dashboard-section { + display: table; + width: 100% +} + +body.people .dashboard-group>.aui-page-panel { + border-bottom: 0 +} + +body.people .dashboard-group .aui-page-panel .aui-page-panel-nav { + height: 523px +} + +body.people .dashboard-group .aui-navgroup-inner { + margin-left: -10px +} + +body.people .active-tab>a { + color: #333; + font-weight: bold +} + +#people-search-title-bar { + overflow: hidden; + margin-bottom: 10px +} + +#people-search-title-bar h2 { + float: left +} + +body.people #people-search { + margin-top: 0; + text-align: right +} + +.people-directory .aui-tabs>.tabs-menu { + padding: 0 30px +} + +.people-directory .greybox { + position: relative; + margin: 0 +} + +.people-directory .greyboxfilled { + width: 100% +} + +body.people #people-search input { + vertical-align: top +} + +body.people #people-search .field-group { + display: inline-block; + width: auto; + padding: 0 10px 0 0; + margin: 0 +} + +body.people .aui-message.error { + margin-bottom: 10px +} + +body.people .greybox #peoplelist .profile-macro { + margin: 10px 40px 20px 0 +} + +#people-search .field-group { + padding-left: 0 +} + +body.people .blank-experience-people { + margin-top: 50px +} + +.blank-experience-people { + min-height: 100px; + background: url(/wiki/s/1000.0.0-345b15b66054/_/download/resources/confluence.web.resources:content-styles/../../../images/icons/people-empty-placeholder.png) no-repeat right bottom +} + +.watches .tableview-action-icon { + text-align: right +} + +.blank-experience-container { + border: 1px solid #CCC; + border-radius: 3px; + width: 65%; + margin: 100px auto; + padding: 30px +} + +.blank-experience-container p { + color: #707070; + line-height: 24px; + font-size: 16px; + width: 70%; + margin-top: 0; + margin-bottom: 26px +} + +.blank-experience-blog { + background: url('/wiki/s/1000.0.0-345b15b66054/_/download/resources/confluence.web.resources:content-styles/../../images/icons/blog-empty-placeholder.png') no-repeat right bottom +} + +.blank-experience-page { + background: url('/wiki/s/1000.0.0-345b15b66054/_/download/resources/confluence.web.resources:content-styles/../../images/icons/pages-empty-placeholder.png') no-repeat right bottom +} + +.blog-post-listing { + position: relative; + padding: 30px 20px 20px 68px; + margin-top: -10px +} + +#link-browser-tab-items+.blog-post-listing { + padding-top: 10px +} + +#link-browser-tab-items+.blog-post-listing .logoBlock { + top: 10px +} + +.blog-post-listing+.blog-post-listing { + border-top: 1px solid #ccc; + margin-top: 0 +} + +.logoBlock, +.blogHeading { + display: inline-block +} + +.userLogo, +.userLogo-48 { + width: 48px; + height: 48px; + border-radius: 3px +} + +.userLogo-96 { + width: 96px; + height: 96px; + border-radius: 3px +} + +.userLogo-144 { + width: 144px; + height: 144px; + border-radius: 3px +} + +.userLogoLink { + display: inline +} + +.page-metadata { + line-height: 1.25 !important +} + +.logo-heading-block { + margin-bottom: 20px +} + +.logoBlock { + position: absolute; + left: 0; + top: 30px +} + +.userLogoLink { + line-height: 30px +} + +#title-heading .userLogoLink { + float: left +} + +.logo-heading-block .userLogo { + width: 48px; + border-radius: 3px; + display: inline-block +} + +span.blogHeading { + display: block +} + +.blogHeading .page-metadata { + margin: 0; + line-height: 16px !important; + margin-top: 2px; + margin-right: 10px +} + +a.blogHeading { + font-size: 24px +} + +.blog-post-listing>.wiki-content { + padding: 0 !important +} + +.blog-post-listing .endsection { + clear: both; + margin-top: 20px +} + +.blank-experience-container { + border: 1px solid #CCC; + border-radius: 3px; + width: 65%; + margin: 100px auto; + padding: 30px +} + +.blank-experience-container p { + color: #707070; + line-height: 24px; + font-size: 16px; + width: 70%; + margin-top: 0; + margin-bottom: 26px +} + +.blank-experience-blog { + background: url('/wiki/s/1000.0.0-345b15b66054/_/download/resources/confluence.web.resources:content-styles/../../images/icons/blog-empty-placeholder.png') no-repeat right bottom +} + +#squaretab { + margin-left: 0; + padding-left: 0; + white-space: nowrap; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 14px; + line-height: 20px +} + +#squaretab li { + display: inline; + list-style-type: none +} + +#squaretab a { + padding: 5px 7px 3px 7px; + border-width: 1px; + border-style: solid +} + +#squaretab a:link, +#squaretab a:visited { + color: #fff; + text-decoration: none +} + +#squaretab a:hover { + text-decoration: none +} + +.admin-sidebar-group~.admin-sidebar-group { + margin-top: 20px +} + +#main.aui-page-panel { + border-top: 0 +} + +.recently-updated-concise .update-item .update-item-desc, +.recently-updated-concise .update-item .update-item-changes { + font-size: 12px; + margin-left: 5px; + line-height: 20px +} + +::-webkit-input-placeholder { +   color: #999 +} + +:-moz-placeholder { +   color: #999; +   +} + +::-moz-placeholder { +     color: #999; +   +} + +:-ms-input-placeholder { +     color: #999; +   +} + +.default-macro-spinner { + width: 40px; + height: 40px; + position: relative +} + +.aui-iconfont-page-default, +.aui-iconfont-page-blogpost { + display: none +} + +​ .hidden { + display: none +} + +/* module-key = 'confluence.web.resources:content-styles', location = 'includes/css/wiki-content.less' */ +.wiki-content .header, +.wiki-content .footer, +.wiki-content .cell { + margin: 8px 0; + box-sizing: border-box; + word-wrap: break-word; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px +} + +.wiki-content .columnLayout { + display: table; + table-layout: fixed; + width: 100%; + *clear: both +} + +.wiki-content .columnLayout .cell { + vertical-align: top +} + +.wiki-content .columnLayout .cell.aside { + width: 29.9% +} + +.wiki-content .columnLayout .cell.sidebars { + width: 19.9% +} + +.wiki-content .cell { + display: table-cell; + padding: 0 10px +} + +.wiki-content .innerCell { + overflow-x: auto +} + +.wiki-content .placeholder { + background: #f5f5f5; + border: 1px dotted #ccc; + color: #707070; + font-style: italic; + margin: 0; + padding: 10px +} + +.wiki-content .placeholder .activation-content { + display: none +} + +.wiki-content .placeholder .display-content { + display: inherit +} + +.wiki-content li>ul, +.wiki-content li>ol, +.wiki-content ul>ul, +.wiki-content ol>ol { + margin-top: 0 +} + +.wiki-content ul { + list-style-type: disc +} + +.wiki-content ol, +.wiki-content ol ol ol ol, +.wiki-content ol ol ol ol ol ol ol, +.wiki-content ol ol ol ol ol ol ol ol ol ol { + list-style-type: decimal +} + +.wiki-content ol ol, +.wiki-content ol ol ol ol ol, +.wiki-content ol ol ol ol ol ol ol ol, +.wiki-content ol ol ol ol ol ol ol ol ol ol ol { + list-style-type: lower-alpha +} + +.wiki-content ol ol ol, +.wiki-content ol ol ol ol ol ol, +.wiki-content ol ol ol ol ol ol ol ol ol, +.wiki-content ol ol ol ol ol ol ol ol ol ol ol ol { + list-style-type: lower-roman +} + +.wiki-content h1 { + font-size: 1.714em; + font-weight: normal; + line-height: 1.166 +} + +.wiki-content h2 { + font-size: 1.43em; + font-weight: normal; + line-height: 1.2 +} + +.wiki-content h3 { + font-size: 1.142em; + line-height: 1.5 +} + +.wiki-content h4 { + font-size: 1em; + line-height: 1.428 +} + +.wiki-content h5 { + font-size: 0.857em; + line-height: 1.333 +} + +.wiki-content h6 { + line-height: 1.454; + font-size: 0.785em +} + +.wiki-content h1:first-child, +.wiki-content h2:first-child, +.wiki-content h3:first-child, +.wiki-content h4:first-child, +.wiki-content h5:first-child, +.wiki-content h6:first-child { + margin-top: 0 +} + +.wiki-content h1+h2, +.wiki-content h2+h3, +.wiki-content h3+h4, +.wiki-content h4+h5, +.wiki-content h5+h6 { + margin-top: 10px +} + +.wiki-content h1+h1, +.wiki-content h2+h2, +.wiki-content h3+h3, +.wiki-content h4+h4, +.wiki-content h5+h5, +.wiki-content h6+h6 { + margin-top: 10px +} + +.wiki-content .confluence-content-image-border { + border: 1px solid black +} + +.wiki-content div.error>span.error { + color: #333; + padding: 6px 10px; + position: relative; + background: #fffdf6; + border: 1px solid #ffeaae; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + border-radius: 5px +} + +.wiki-content .columnLayout, +.wiki-content .cell, +.wiki-content .header, +.wiki-content .footer { + *display: block; + *float: left; + *width: 100% +} + +.wiki-content .innerCell { + *border: 2px dashed #ccc; + *margin: 8px 4px; + *padding: 4px 8px +} + +.wiki-content .text-placeholder { + background: #f5f5f5; + color: #707070; + font-style: italic; + min-width: 10px; + display: block +} + +.wiki-content .text-placeholder.selected { + color: #333 +} + +.wiki-content .aui-lozenge { + padding: 3px 5px 2px 5px +} + +#tinymce h6 { + color: #6B778C +} + +.contentLayout .innerCell>*:first-child .innerCell>*:first-child, +.contentLayout2 .innerCell>*:first-child { + margin-top: 0 +} + +.contentLayout2 .columnLayout { + margin-bottom: 8px +} + +.view .wiki-content .cell:first-child, +.content-preview .wiki-content .cell:first-child { + padding: 0 +} + +li[style*='text-align: center'], +li[style*='text-align: right'] { + list-style-position: inside +} + +#main .wiki-content .footer p, +#main .wiki-content .footer a { + font-family: arial, sans-serif; + font-size: 14px +} + +.wiki-content .cell, +.mceContentBody.wiki-content .cell, +.twoColumns .cell, +.threeColumns .cell, +.twoColumns .large, +.mceContentBody.wiki-content .header, +.mceContentBody.wiki-content .footer, +.threeColumns .large { + *border: 0; + *margin: 0; + *padding: 0; + *overflow: hidden +} + +.twoColumns .cell { + *width: 49.9% +} + +.threeColumns .cell { + *width: 33.3% +} + +.twoColumns .large { + *width: 69.9% +} + +.threeColumns .large { + *width: 59.9% +} + +div.aside+div.large, +div.large+div.aside, +div.large+div.sidebars, +.twoColumns div.cell+div.cell, +.threeColumns div.cell+div.cell+div.cell { + *float: right +} + +.two-equal .normal { + *width: 49.9% +} + +.two-left-sidebar .normal, +.two-right-sidebar .normal { + *width: 69.9% +} + +.three-equal .cell { + *width: 33.3% +} + +.three-with-sidebars .normal { + *width: 59.9% +} + +.two-equal div.cell+div.cell { + *float: right +} + +.three-equal div.cell+div.cell+div.cell, +.three-with-sidebars div.cell+div.cell+div.cell { + *float: right +} + +#mw-container div.mw-no-notifications div.subheading p { + line-height: 24px; + margin-top: 8px; + margin-bottom: 8px +} + +/* module-key = 'confluence.web.resources:content-styles', location = 'includes/css/tables.css' */ +.confluenceTable { + border-collapse: collapse +} + +.confluenceTh, +.confluenceTd { + border: 1px solid #ddd; + padding: 7px 10px; + vertical-align: top; + text-align: left; + min-width: 8px +} + +.confluenceTable ol, +.confluenceTable ul { + margin-left: 0; + padding-left: 22px +} + +.confluenceTable, +.table-wrap { + margin: 10px 0 0 0; + overflow-x: auto +} + +.confluenceTable:first-child, +.table-wrap:first-child { + margin-top: 0 +} + +table.confluenceTable th.confluenceTh, +table.confluenceTable th.confluenceTh>p, +table.confluenceTable th.confluenceTh.highlight-grey, +table.confluenceTable th.confluenceTh.highlight-grey>p, +table.confluenceTable td.confluenceTd.highlight-grey, +table.confluenceTable td.confluenceTd.highlight-grey>p { + background-color: #f0f0f0 +} + +table.confluenceTable th.confluenceTh.highlight-blue, +table.confluenceTable th.confluenceTh.highlight-blue>p, +table.confluenceTable td.confluenceTd.highlight-blue, +table.confluenceTable td.confluenceTd.highlight-blue>p { + background-color: #e0f0ff +} + +table.confluenceTable th.confluenceTh.highlight-green, +table.confluenceTable th.confluenceTh.highlight-green>p, +table.confluenceTable td.confluenceTd.highlight-green, +table.confluenceTable td.confluenceTd.highlight-green>p { + background-color: #ddfade +} + +table.confluenceTable th.confluenceTh.highlight-red, +table.confluenceTable th.confluenceTh.highlight-red>p, +table.confluenceTable td.confluenceTd.highlight-red, +table.confluenceTable td.confluenceTd.highlight-red>p { + background-color: #ffe7e7 +} + +table.confluenceTable th.confluenceTh.highlight-yellow, +table.confluenceTable th.confluenceTh.highlight-yellow>p, +table.confluenceTable td.confluenceTd.highlight-yellow, +table.confluenceTable td.confluenceTd.highlight-yellow>p { + background-color: #ffd +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#091e42"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#091e42"] { + background-color: #091e42 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#172b4d"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#172b4d"] { + background-color: #172b4d +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#253858"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#253858"] { + background-color: #253858 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#344563"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#344563"] { + background-color: #344563 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#42526e"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#42526e"] { + background-color: #42526e +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#505f79"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#505f79"] { + background-color: #505f79 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#5e6c84"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#5e6c84"] { + background-color: #5e6c84 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#6b778c"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#6b778c"] { + background-color: #6b778c +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#7a869a"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#7a869a"] { + background-color: #7a869a +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#8993a4"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#8993a4"] { + background-color: #8993a4 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#97a0af"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#97a0af"] { + background-color: #97a0af +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#a5adba"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#a5adba"] { + background-color: #a5adba +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#b3bac5"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#b3bac5"] { + background-color: #b3bac5 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#c1c7d0"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#c1c7d0"] { + background-color: #c1c7d0 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#dfe1e6"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#dfe1e6"] { + background-color: #dfe1e6 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ebecf0"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ebecf0"] { + background-color: #ebecf0 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#f4f5f7"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#f4f5f7"] { + background-color: #f4f5f7 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#fafbfc"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#fafbfc"] { + background-color: #fafbfc +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ffffff"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ffffff"] { + background-color: #fff +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#bf2600"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#bf2600"] { + background-color: #bf2600 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#de350b"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#de350b"] { + background-color: #de350b +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ff5630"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ff5630"] { + background-color: #ff5630 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ff7452"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ff7452"] { + background-color: #ff7452 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ff8f73"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ff8f73"] { + background-color: #ff8f73 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ffbdad"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ffbdad"] { + background-color: #ffbdad +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ffebe6"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ffebe6"] { + background-color: #ffebe6 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ff8b00"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ff8b00"] { + background-color: #ff8b00 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ff991f"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ff991f"] { + background-color: #ff991f +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ffab00"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ffab00"] { + background-color: #ffab00 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ffc400"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ffc400"] { + background-color: #ffc400 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#ffe380"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#ffe380"] { + background-color: #ffe380 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#fff0b3"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#fff0b3"] { + background-color: #fff0b3 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#fffae6"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#fffae6"] { + background-color: #fffae6 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#006644"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#006644"] { + background-color: #064 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#00875a"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#00875a"] { + background-color: #00875a +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#36b37e"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#36b37e"] { + background-color: #36b37e +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#57d9a3"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#57d9a3"] { + background-color: #57d9a3 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#79f2c0"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#79f2c0"] { + background-color: #79f2c0 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#abf5d1"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#abf5d1"] { + background-color: #abf5d1 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#e3fcef"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#e3fcef"] { + background-color: #e3fcef +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#008da6"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#008da6"] { + background-color: #008da6 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#00a3bf"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#00a3bf"] { + background-color: #00a3bf +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#00b8d9"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#00b8d9"] { + background-color: #00b8d9 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#00c7e6"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#00c7e6"] { + background-color: #00c7e6 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#79e2f2"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#79e2f2"] { + background-color: #79e2f2 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#b3f5ff"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#b3f5ff"] { + background-color: #b3f5ff +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#e6fcff"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#e6fcff"] { + background-color: #e6fcff +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#0747a6"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#0747a6"] { + background-color: #0747a6 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#0052cc"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#0052cc"] { + background-color: #0052cc +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#0065ff"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#0065ff"] { + background-color: #0065ff +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#2684ff"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#2684ff"] { + background-color: #2684ff +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#4c9aff"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#4c9aff"] { + background-color: #4c9aff +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#b3d4ff"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#b3d4ff"] { + background-color: #b3d4ff +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#deebff"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#deebff"] { + background-color: #deebff +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#403294"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#403294"] { + background-color: #403294 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#5243aa"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#5243aa"] { + background-color: #5243aa +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#6554c0"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#6554c0"] { + background-color: #6554c0 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#8777d9"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#8777d9"] { + background-color: #8777d9 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#998dd9"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#998dd9"] { + background-color: #998dd9 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#c0b6f2"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#c0b6f2"] { + background-color: #c0b6f2 +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#eae6ff"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#eae6ff"] { + background-color: #eae6ff +} + +table.confluenceTable th.confluenceTh[data-highlight-colour="\#000000"], +table.confluenceTable td.confluenceTd[data-highlight-colour="\#000000"] { + background-color: #000 +} + +table.confluenceTable th.confluenceTh, +table.confluenceTable th.confluenceTh>p { + font-weight: bold +} + +table.confluenceTable th.confluenceTh.nohighlight, +table.confluenceTable th.confluenceTh.nohighlight>p { + font-weight: normal; + background-color: transparent +} + +table.confluenceTable td.confluenceTd img, +table.confluenceTable td.confluenceTd .confluence-embedded-file-wrapper img, +table.confluenceTable th.confluenceTh .confluence-embedded-file-wrapper img { + max-width: none +} + +table.confluenceTable td.numberingColumn { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: default +} + +/* module-key = 'confluence.web.resources:content-styles', location = 'includes/css/renderer-macros.css' */ +.searchMacro { + font-size: 10pt; + margin: 10px 0 +} + +.searchMacro .result { + margin-top: 3px; + padding: 0 5px 5px 5px; + border-bottom: 1px solid #ddd +} + +.searchMacro .resultSummary { + margin-bottom: 7px +} + +.rssMacro { + font-size: 10pt +} + +.rssMacro table { + margin: 10px 0; + width: 100%; + border-collapse: collapse +} + +.rssMacro table th, +.rssMacro table td { + border: 1px solid #ccc; + padding: 4px +} + +.rssMacro table th { + background: #f0f0f0 +} + +.code, +.preformatted { + background-color: #fff; + overflow: auto +} + +.code pre, +.preformatted pre { + font-family: "Courier New", Courier, monospace; + line-height: 1.3 +} + +.wiki-content .code-keyword { + color: #000091; + background-color: inherit +} + +.wiki-content .code-object { + color: #910091; + background-color: inherit +} + +.wiki-content .code-quote { + color: #009100; + background-color: inherit +} + +.wiki-content .code-comment { + color: gray; + background-color: inherit +} + +.wiki-content .code-xml .code-keyword { + color: inherit; + font-weight: bold +} + +.wiki-content .code-tag { + color: #000091; + background-color: inherit +} + +.recentlyUpdatedItem { + border-bottom: #f0f0f0 1px solid; + border-top: #f0f0f0 1px solid; + margin: 10px 0 0 0; + padding: 0; + border-spacing: 0; + width: 100%; + text-decoration: none; + border-collapse: collapse +} + +.recentlyUpdatedItem td { + padding: 10px; + border-bottom: #f0f0f0 1px solid; + vertical-align: top +} + +.recentlyUpdatedItem .authorAndDate { + background-color: #f0f0f0; + width: 25% +} + +.recentlyUpdatedItem .date { + margin-top: 4px; + font-size: 90%; + color: #666 +} + +.recentlyUpdatedItem .profilePic { + float: right; + background-color: #f0f0f0; + margin: 0 2px +} + +.recentlyUpdatedItem .twixie { + padding: 10px 0 0 4px +} + +.recentlyUpdatedItem td.icon { + padding: 8px 0 0 1px +} + +.recentlyUpdatedItem .details { + padding-left: 7px +} + +.recentlyUpdatedItem .summary, +.recentlyUpdatedItem .thumbnail { + margin-top: 3px; + color: #666 +} + +.moreRecentlyUpdatedItems { + text-align: right; + margin-top: 10px; + font-size: 10pt +} + +/* module-key = 'confluence.web.resources:master-styles', location = 'includes/css/icons.css' */ +.icon, +.icon-container { + display: inline-block; + height: 16px; + min-width: 16px; + text-align: left; + text-indent: -9999em; + background-repeat: no-repeat; + background-position: left center; + font-size: 0; + vertical-align: text-bottom +} + +.search-result-title .icon { + position: absolute; + left: -26px; + top: 4px +} + +.search-result-title .icon img { + width: 16px; + height: 16px; + left: 0 +} + +.icon-container>* { + text-indent: 0; + font-size: 14px; + margin-left: 24px +} + +img.emoticon { + vertical-align: text-bottom +} + +a.content-type-page span, +a.content-type-blogpost span, +a.content-type-space span, +a.content-type-spacedesc span, +a.content-type-comment span, +a.content-type-status span, +a.content-type-user span, +a.content-type-userinfo span, +a.content-type-attachment-image span, +a.content-type-attachment-pdf span, +a.content-type-attachment-html span, +a.content-type-attachment-text span, +a.content-type-attachment-text-html span, +a.content-type-attachment-text-xml span, +a.content-type-attachment-xml span, +a.content-type-attachment-zip span, +a.content-type-attachment-java span, +a.content-type-attachment-css span, +a.content-type-attachment-js span, +a.content-type-attachment-unknown span { + background-repeat: no-repeat; + background-position: left center +} + +.icon-edit { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAVUlEQVQoz2NgIAcUpBW8K/hfsKpAEJf0fyhchV8aCAlIF7zDL/2/II2O0oJ4pYEKQpFdjiENVNBRUF5wBiptjC1wzhQogV2BXRqo4F3BbqApLgw0AQCBhnfEgf2VHQAAAABJRU5ErkJggg==) +} + +.aui-button>.icon-edit { + padding-right: 6px +} + +#labels-section .icon-edit { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAASklEQVQoz2NgoAkoMMYvPbPgf8E7nIrA0iD4Dr80CBrjl55JZ2kXvNJABR0F5QVncEoDFawqEAQqwSUNVPAOqL+jIBR34ApSEHEAoZNTWJsXIJoAAAAASUVORK5CYII=) +} + +.icon-remove-fav { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAgElEQVQoz41RSRHAIBDDAhawgAUsYIF3ZOAJC1jAAhboAlPKPd18liSzF4wNAQPDboGAcJM1EkGfDa4Y3ElWRc5QPW0JDr6JLzyxpOW50wWmlo5bMbZWkBtLhOwn4ZMlgo8b8KUC352ox3guWqjS9svWGzqIkov6mj9JTy0D+xcP2z2f/6cFFckAAAAASUVORK5CYII=) no-repeat right top +} + +.icon-add-fav { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA4klEQVQoz31RMQqDQBD0LX7Bt+QL9kqQq4QggnBVSourbAQRAhdIcZ112hQphICQJmHNDyarCcYc6G6zezPszs45zl8UeZE7axEjxgpcZgIRymyRIElxSlqAKz9CRzfaovJnz8rkZ0kphWCA0KItmBIg5Un5WRnWzQ0aulBPGAloX9ydKGHaeFPlC+zx+IKf7ElC/FbVGwGJ50TpRrjezJRoV+A6ERoS0O7fBdoNcZ8IF5ZsEQaLHqRpx04eWa6w7VImZRUhlFEmQIIdV5aHASRpb6gPnuQVlp+xNbLMVj9tHm+oBsKYaoGVtwAAAABJRU5ErkJggg==) no-repeat right top +} + +.icon-wait { + background: url(/wiki/s/1000.0.0-345b15b66054/_/download/resources/confluence.web.resources:master-styles/../../images/icons/wait.gif) no-repeat left top +} + +.icon-refresh { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAoElEQVQoFa3BQXHDMBQFwE/BFErBFETBFHxeGKIgCqFgCqYQCqLwmmnqmRyS6aW7VaVp9WA1RMRdt9TFplfZRZy67i6mr3rSHTYxbfVLNy31ZIgp1nphqYtDxKhPTBFxs9U74nTodq3+iabrDlPqHc0wRaQ+MUQcdfFVL6xiiltdTMNSPzRT7A69Lk4xdd0pYq/S7XWx6O4iYljrQdPqL9/pwHQAAyEFYgAAAABJRU5ErkJggg==) +} + +.ui-tree li a, +a.content-type-page span, +div.content-type-page, +span.content-type-page, +.icon-page { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAiElEQVQoz72NMQrDMAxFdRbfqfcQmkKmQkedonMpdMk5SsmUQVf4uyHwO9ihNqZbqd6opycREXkkh1JplYn3k7TjmLkig8FgZCjnXjFudVlQ3tBVjO2aoWRc0VRGoTDxi3BgvxaOz4X/FzLGwo5GeGG83z6C48In9k5acaajCktyGHuUjiWJvAGUIE/eIh8szwAAAABJRU5ErkJggg==); + background-repeat: no-repeat +} + +a.content-type-blogpost span, +div.content-type-blogpost, +span.content-type-blogpost, +.icon-blog, +.icon-blogpost { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAvklEQVQoz3XQMarCQBSF4VlL9vT2cZnGYBWwEaZyCdYPQQhuYdogVhazgsDpUgSE32KiZoy5p7wfZy7jnHPuXAUZhp9Sc/pz8wnactMoEok0ytiWxHOfljnGv4oWz3xNMkhHzVqWIKdmBbziS9CqVadBqyDXbohaAaReUQ32JouGDVGD9tTkhxY3HDCioozuF4giHWgYZLTfYFSvhl6tDFIGD83AVctfuH9A0I5OjwLd1BA0gUsV5CljBF0q557ZLU6zeFb3iwAAAABJRU5ErkJggg==); + background-repeat: no-repeat +} + +a.content-type-attachment-image span, +div.content-type-attachment-image, +span.content-type-attachment-image, +.icon-file-image { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAuklEQVR4AYXRoWrEQBAG4LzfvcyKyDUXqImKO1lTVag5Vc5UV9QGak7VXGRURLivI5ajIQvN8LMD840I06RDOyX1ismhaacR228GjEGatBmtUXdDJDokOzDodYaoKuDDGW/xqoEvbQwFaqPfgLJjlT1FVgoo40F2BS+WiL/gorcYHS24lzzAp84MXqOAqxQp4OQGWBx9E4m1yM/+L0Zd8BxEkH4PeJZdAKcamGXTo08qx7p53xzrn3P/AhEiwzbuFeKCAAAAAElFTkSuQmCC); + background-repeat: no-repeat +} + +a.content-type-attachment-pdf span, +div.content-type-attachment-pdf, +span.content-type-attachment-pdf, +.icon-file-pdf { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAjklEQVR4AaXRIQsCMRiH8X3YqwfvGIJwYDLZ7juYZMEiyJLRL3CgUTAZLAsiEx6HsKC3KcPnrT94w1+1jQlC/kxoG2XCQKkhEiV8SxgBz5pJCZzZ0mGRd3DjxJ4VM+ZYrvAJpixYsuNCSiMI9wTGCdDhq8CDAxt6XAk4+giOEQLov1/oqhe5sRJ4jfVr7icQhcMrYdZaZQAAAABJRU5ErkJggg==); + background-repeat: no-repeat +} + +.expand-control-icon, +.ui-tree li.closed>.click-zone, +#children-section.children-hidden a.children-show-hide.icon, +.icon-section-closed { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAALElEQVQoz2NgGGSg4EzBTPwKOgr+F6ThVzKTsJK7Bf/JN4GgG4C+6GAYigAASNYUTGaVYwsAAAAASUVORK5CYII=) +} + +.expand-control-icon.expanded, +.ui-tree li.opened>.click-zone, +#children-section.children-showing a.children-show-hide.icon, +.icon-section-opened { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAMUlEQVQoz2NgGGag4ExBB5TVUXAGm4KOgv8FM4H0TAiNTUkaUOouEKfhtiYNr/SQBQAsPRRMJnnlygAAAABJRU5ErkJggg==) +} + +a.content-type-comment span, +div.content-type-comment, +span.content-type-comment, +.icon-comment { + background: no-repeat left center url(data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%3E%3Cdefs%3E%3Cpath%20d%3D%22M2.553%207.62c0-2.363%202.443-4.285%205.445-4.285%203.001%200%205.444%201.922%205.444%204.284%200%202.363-2.443%204.285-5.444%204.285-3.002%200-5.445-1.922-5.445-4.285Zm11.538%206.041v-.001s-1.215-1.758-.596-2.423l-.028.015c.953-.998%201.528-2.26%201.528-3.633%200-3.22-3.139-5.841-6.997-5.841C4.139%201.778%201%204.398%201%207.619s3.139%205.842%206.998%205.842a8.088%208.088%200%200%200%203.076-.603c.78.795%201.778%201.222%202.518%201.336l.003-.002c.04.013.082.026.127.026a.4.4%200%200%200%20.369-.557Z%22%20id%3D%22a%22/%3E%3C/defs%3E%3Cuse%20fill%3D%22%233F4F71%22%20xlink%3Ahref%3D%22%23a%22%20fill-rule%3D%22evenodd%22/%3E%3C/svg%3E) +} + +.icon-open-comment { + background: no-repeat left center url(data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%3E%3Cdefs%3E%3Cpath%20id%3D%22a%22%20d%3D%22M2.553%207.62c0-2.363%202.443-4.285%205.445-4.285%203.001%200%205.444%201.922%205.444%204.284%200%202.363-2.443%204.285-5.444%204.285-3.002%200-5.445-1.922-5.445-4.285zm11.538%206.041v-.001s-1.215-1.758-.596-2.423l-.028.015c.953-.998%201.528-2.26%201.528-3.633%200-3.22-3.139-5.841-6.997-5.841C4.139%201.778%201%204.398%201%207.619s3.139%205.842%206.998%205.842a8.088%208.088%200%200%200%203.076-.603c.78.795%201.778%201.222%202.518%201.336l.003-.002a.41.41%200%200%200%20.127.026.4.4%200%200%200%20.369-.557z%22/%3E%3C/defs%3E%3Cuse%20xlink%3Ahref%3D%22%23a%22%20fill%3D%22%233F4F71%22%20fill-rule%3D%22evenodd%22/%3E%3Crect%20rx%3D%22.9%22%20height%3D%224.185%22%20width%3D%222.031%22%20y%3D%224.271%22%20x%3D%226.838%22%20fill%3D%22%233F4F71%22/%3E%3Cellipse%20ry%3D%22.808%22%20rx%3D%22.868%22%20cy%3D%229.695%22%20cx%3D%227.802%22%20fill%3D%22%233F4F71%22/%3E%3C/svg%3E) +} + +.icon-like { + background: no-repeat left center url(data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%3E%3Cdefs%3E%3Cpath%20d%3D%22M1%208v6.182a.862.862%200%200%200%20.857.883h.892V7.117h-.892A.862.862%200%200%200%201.001%208Zm13.371-.848a2.655%202.655%200%200%200-2.031-.937h-2.305c.035-.16.07-.318.097-.47.45-2.59%200-3.532-.442-4.057A2.12%202.12%200%200%200%208.066.935a2.703%202.703%200%200%200-2.597%202.43c-.344%201.624-.397%201.766-.848%202.406l-.67.962a1.787%201.787%200%200%200-.319%201.007v5.54a1.77%201.77%200%200%200%201.775%201.766h6.341a2.644%202.644%200%200%200%202.623-2.214l.592-3.532a2.633%202.633%200%200%200-.592-2.148Zm-1.749%205.387a.883.883%200%200%201-.874.738h-6.34V7.74l.67-.961a6.73%206.73%200%200%200%201.14-3.1c.032-.478.378-.878.848-.978.67%200%20.503%201.692.317%202.738a17.53%2017.53%200%200%201-.76%202.545l4.717-.007a.883.883%200%200%201%20.874%201.029l-.592%203.533Z%22%20id%3D%22a%22/%3E%3C/defs%3E%3Cuse%20fill%3D%22%233F4F71%22%20fill-rule%3D%22nonzero%22%20xlink%3Ahref%3D%22%23a%22/%3E%3C/svg%3E) +} + +.icon-reaction { + background: no-repeat left center url(data:image/svg+xml,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20xmlns%3Axlink%3D%22http%3A//www.w3.org/1999/xlink%22%3E%3Cdefs%3E%3Cpath%20d%3D%22M8%201a7%207%200%201%201%200%2014A7%207%200%200%201%208%201Zm0%2012.5c3.033%200%205.5-2.467%205.5-5.5S11.033%202.5%208%202.5A5.506%205.506%200%200%200%202.5%208c0%203.033%202.467%205.5%205.5%205.5Zm-1.5-6a1%201%200%201%201%200-2%201%201%200%200%201%200%202Zm3%200a1%201%200%201%201%200-2%201%201%200%200%201%200%202Zm.27%201.583a.626.626%200%200%201%20.932.834A3.63%203.63%200%200%201%208%2011.125a3.63%203.63%200%200%201-2.698-1.204.625.625%200%200%201%20.93-.835c.901%201.003%202.639%201.003%203.538-.003Z%22%20id%3D%22a%22/%3E%3C/defs%3E%3Cuse%20fill%3D%22%2345526C%22%20fill-rule%3D%22nonzero%22%20xlink%3Ahref%3D%22%23a%22/%3E%3C/svg%3E) +} + +.reactions-container { + margin-bottom: 3px; + margin-left: 2px; + margin-right: -2px +} + +.reactions-image { + height: 20px; + width: 20px +} + +#tree-root-div li a, +a.content-type-space span, +div.content-type-space, +span.content-type-space, +a.content-type-spacedesc span, +div.content-type-spacedesc, +span.content-type-spacedesc, +.icon-space, +.icon-create-space, +.icon-browse-space { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA20lEQVQoz32RsWrDMBRF37f4C42gYDxl0eQheMgg6KrZQ+g3mEKGTqWLCiV4yHIhY6bTQYqq0NL7QCB0OKB3zUpimJMjz5xisDZL5zXyrJMuuuikwIDX0pXnYzewRyL9zEWegWNGvHb03PUjZ5FIV+3xMrMYnnjnRs6NviJnOWKwSSttepaKzEwy18g3oAdiQVY5rH+Qb/RlRkhqgbt8KzcH6SqHuQbI8q0Cr3LYpK8KVHkBDkyyGA48xpXzI3/TzOvtT2DKi8qrXn8BIwMvXVNW4LMCidCW9X/d38Isc6NA/Bf0AAAAAElFTkSuQmCC); + background-repeat: no-repeat +} + +a.content-type-user span, +div.content-type-user, +span.content-type-user, +a.content-type-userinfo span, +div.content-type-userinfo, +span.content-type-userinfo, +.icon-user { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAZklEQVQoz2NggIMCwYLdBf+BcHeBIAM2AJUGK8Gu4D8CkqmAoBWEHEkQFJQDdb8Dwv8FHdikQ5EdWRCKaf87FAXv0NxR0IEiDYLlqArOYCi4iyythCENgsYIBWlYFZRjBhEyJDa4AJqwlYCFLdbdAAAAAElFTkSuQmCC); + background-repeat: no-repeat +} + +.ui-tree li a.home-node, +.icon-home-page { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAASFBMVEX///+1tbWwsLCtra3///+Li4urq6uhoaH5+fnGxsb8/PzZ2dnT09PR0dHPz89wcHBycnJ/f391dXV6enp4eHh8fHyAgICDg4N3eN+2AAAAD3RSTlMAIiJV3e7u7u7u7u7u7u4Pv12NAAAAaUlEQVR42nXKSRKAIAxE0agJ4NhRHO5/U0UQdOGv3uRViKgWQK/WhmLiB8fMDj6J9nwHk36UE7D1zQeu1gglzdCi/YBZsJgX2BnAbAtsQJACDIT9guOnLsKYob9BjqmL97BLgEo0BanoBKPaBxtncPCIAAAAAElFTkSuQmCC) +} + +a.content-type-personalspacedesc span, +div.content-type-personalspacedesc, +span.content-type-personalspacedesc, +.icon-personal-space { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA4klEQVQoz31RsQqDQAy9b7kvlMPhKK5ODnIUCkJXpy4F6da9FAS34uLSpTgYcCgdX3NG6glt702X95K8JErNryxcZyBwXVmo8B11Sgn2VFPPqKmARUpHPdOVtsgxELoFPaUsqkSS0hYvpp/kEDEcnvwbKecqU+94zhZaJP5/JwP2knFHKRthgUQcMlIGN/oluHANFU39v7VAN6wFa5MeoxcYtKsBQ1y9YDF5pohnt1zjMKfsvMmyMLhzoKHQZMORVsaURT3IIhRYjmSyKFl1sqI9EhaddHCsGJsPuUEcHuv/ud8LtmF1ADDSbwAAAABJRU5ErkJggg==); + background-repeat: no-repeat +} + +a.content-type-status span, +div.content-type-status, +span.content-type-status, +.icon-status { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAy0lEQVQoz5XPMYrCQBjF8ZwlV8hZcoXUjwGJTDdYRBYsLaZKZeEuK0iahbR7CGFJYWM5go1Y/S0ccBJkwde+H2++ybIkP3nbOwwGg2U9dEXaZvvSsqDjBJz5pcHSlQlwrLnwzJUWRwIMR8b5wzyAKqHS4bmNwDfzCIJQvy8tH3HlxgGPYesfACHUt4Vjg8cyw9CEXR1f1xBJvQoGx9dyV4++qEKDUFDRhDj6ZrQU6oWq13UVL+AlUa6QgKB8CnxSIzQ9clIjpuDz/4U77zDaEho7C94AAAAASUVORK5CYII=); + background-repeat: no-repeat +} + +a.content-type-attachment-css span, +div.content-type-attachment-css, +span.content-type-attachment-css, +.icon-file-css, +a.content-type-attachment-java span, +div.content-type-attachment-java, +span.content-type-attachment-java, +.icon-file-java, +a.content-type-attachment-text-html span, +div.content-type-attachment-text-html, +span.content-type-attachment-text-html, +a.content-type-attachment-html span, +div.content-type-attachment-html, +span.content-type-attachment-html, +a.content-type-attachment-text-xml span, +div.content-type-attachment-text-xml, +span.content-type-attachment-text-xml, +a.content-type-attachment-xml span, +div.content-type-attachment-xml, +span.content-type-attachment-xml, +a.content-type-attachment-js span, +div.content-type-attachment-js, +span.content-type-attachment-js, +.icon-file-js, +.icon-file-html, +.icon-file-xml { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAo0lEQVR4AYXRMWpCQRCA4Xc/LzOCvlNo4RUSCw/wghaewUIQktrFwhsIyhcLl8Uh4c2W+xU/M11MZtfw93v+TLrZ9eS/OT1JF97nx0qb8AJnCwV8GTLgYG7jAVa+MxiEHeCmd8sgfKaCYuHcwN7UFq3gYWPuUAFHvbX7W8FOGCqgWLqkgg/RAHkHW1P7DOoO7tZ6RzKoBRdLhQRSgQrGjzVy7l9oKsRYZqUf+AAAAABJRU5ErkJggg==); + background-repeat: no-repeat +} + +.icon-add-page { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAL0lEQVQoz2NgoDIomFnwv2AmPgX/QZAmCsB2o8OZGDrRISETVtHXFyhuWcVAXwAAzDhOqi+KwO8AAAAASUVORK5CYII=) +} + +.icon-add-page-disabled { + background-image: url(data:image/gif;base64,R0lGODlhEAAQAPMMAMzMzPf39+bm5tbW1sPDw////+7u7r6+vt7e3rW1taysrKampgAAAAAAAAAAAAAAACH5BAUUAAwALAAAAAAQABAAQARkUMhJBbsXlcB7GAQhKAQiFJtXCEM7XMNWdcNxXCeqo4IRWLiNYUgcIgiAjLBoGCQSiMUBEdtZUS9G7ir4YbQo5mroBV/DQ6DGwyYEEspfJTEwAQSEGNtzGChgBUxiWS6Fhi0XEQA7) +} + +.icon-recently-updated-page { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACGUlEQVR42pWSS28SURiG+Skm7ly5duPKvf6DCoWmEqX/wHItsUYXxp2XRpRhBga0F25VqbpQN6aSNDFN1URM1AJlKMOZK339zgANHcXEJ3lzTibnPOf7zhzPmPnbbzB36xUCN1/Cv/wCgeXn8N3YxOVkBd6lMmYSJaxs1C96puGnjdMov/+KjnKI8IMtPFzfDv5V0O5q4FjWAKpmoNPT0ewwfP+l4P7aNn23wBgjSQ3he1snJafE/dC5tRbOb7RRbOiwbZIwEwpJWgrDyvpHcEzThKqquCO9xd3su+B48wUKxjkt7WO3a8OwbDDdIpGFR6U6OIPBAJqmOZKZiIyxIEbBZNKfNVp8BJPaMUwbQnUHwuYO5NonPHu9i9qHb/CGc8eCS25B/cByBDaF2nGq6Wvm8F4UFRxfNIvJOwifkZs4W2gitcew96UBMV+lVJCRq8jkKXIFT7JlpMQSOP4YVTCJblj4F7wSyxqGE4hlTwp88VVwxELVOV0aj1SFIJch5MtIUwWPxSI48/GcSxB7imkcDf/AqAp7JJBcgmgBBD+N934cgXpPy6Xh6VIRqVEFwcQfgjw4fWZCM0wYpuVEpznTDPT6OpTDPr1OFZxrSfcdRHIg+OtzFquMx3DGbq+PdqeHny0FjR8H4CwkJbcgi/8htOQSzEZEeBcz8F6nLArwOUljlsZAOI25iIArUQFX4wJCiQwWKB7iN4oVwIAKUPY0AAAAAElFTkSuQmCC) +} + +.icon-group { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAn0lEQVR4AYXPQQ3DMAxAUVMwhVAohVIohZz/rRRCYRRKIRRGwRRCwWtXS9bUSMs/+kVx5PegdPyso8iVcFdYKUiMb5KAinFgVDxLUDAUQRlz0M7kW8dmT1ReAYx1vqTRUA4akiVYGSwIFWXHGWdOYEExlvAbnrHdoMUGz18M9AJGCdBikO0XcCR6P4Ahea/gkxYhok7BnkDpj3FHhT99AOcV5bz26Bu6AAAAAElFTkSuQmCC) +} + +.icon-trackback { + background-image: url(data:image/gif;base64,R0lGODlhEAAQAOYAAA5+C9jo2G9/omd5l27mSpyrwEC0PXWudej0+zG0IEaUYLS80OTz8YCPryeeLYO6g0bDL4XzWvf7/SORK+Do8DikOIzSjMbW1UTBLVW2V5n/ZoPxV1zcPXeIrPD48KXGtDGoMSqrHIqun/b6/YiYuKa1weTx+nCAn16nbh+bGHO6fdrt+EW1SHOMre/3/DuzPDGxM4mZrNns2Tq3JvX89bvE1////2t8m3CCp4OTtHqJq4r2XKu1xnSzdOT06c7U4Z6ytiylMODy6On0+tPl4nuMte//76a3xEq4SYyZtOb37wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAUUADYALAAAAAAQABAAAAe1gDaCg4SFgiQkOQ0dOD8eBwGGJIQ4DT8PAD2Fk4ISOJ8yKQmagw2DEhIUJx4pHCkepZ2oNTUXIQQzH4M6Nj4ZPi4kFiAQGxgTKoIdHjARLwwkEkgRGjsOR4IlBjsaESwFNjQvETBEJ4IoFRgbEEEKgkoZQi43gjwiMwQhQAs2qBIu6A1i5cpDBxsjArpAUG9QjwQpZAiwoRCBiQGFegB4kMTGkI8mVmAsFOBAjBsoUzY0xFJQIAA7) +} + +.icon-mail { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABkUlEQVR4AcXST4hSQRwH8O+bHqJGSwtBREtQdE6CIAo6CR02gqhT1L1A6NCpQ4cOQUSniI6dIi9Bhy2KhECQolAro6DMlAp9hun6ttTnezPzbYdS0BBJD33gBzPMH+Y3fDEvCzPYderGZvzWtvYmkgxHN4JaQ6+XQZrxcD6yppWClMF6+VB+AOw5e5vvv7b4r96Uatx+/CqF1+tggxC4/6ICt9PHNK21LpKplxDCgtfrArtP36TxutTgvaefWK67DKSiUppGX2rW3YA9X/LDlwZvPcjySbZIY/HwRWLnyes02j89flvt8lHuMwuV7zS8gHTWSKnJfNHh3fQ7VpxVOs0fNBbiF2jjj0jIxqaoQDy2hEyhBLVjESrwsGALSGmjWqviyIEYlAZ8qTEglFIY5yOMh5lXGEg9K6CPCMaZs1g6cW1iCyvpnKmJLUQOnSe2Hbsy8yeGDp4jth69zI/VNleel80rOE3T7fDO4zzflh3a+xO0tixfokkZTdo4mjwO0vdXStVwj2XtO4N5CAD/94Jf/IjNWQWaCu8AAAAASUVORK5CYII=) +} + +.icon-show-more { + background-image: url(data:image/gif;base64,R0lGODlhDAAMAKEDAGRkZJ6ensHBwf///yH5BAEKAAMALAAAAAAMAAwAAAIjnAcJxyixmgEvSgqZSnVTAYYgBARm8Jzk1ilaJU1wXGa0exQAOw==) +} + +.icon-show-less { + background-image: url(data:image/gif;base64,R0lGODlhDAAMAKEDAGRkZJ6ensHBwf///yH5BAEKAAMALAAAAAAMAAwAAAIVnI+py30Ao4yiWhtg2LzPDzniSBoFADs=) +} + +a.content-type-attachment-text span, +div.content-type-attachment-text, +span.content-type-attachment-text, +.icon-file-text { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAN0lEQVR4AWMo8C55VfAfOwTKeDOUvLr6Hxe4ClTCUPAfDwCaQhUFWCA9rCigqRVUDyiCkUUwugHql8hZ8aVWFwAAAABJRU5ErkJggg==); + background-repeat: no-repeat +} + +a.content-type-attachment-jar span, +div.content-type-attachment-jar, +span.content-type-attachment-jar, +.icon-file-jar, +a.content-type-attachment-zip span, +div.content-type-attachment-zip, +span.content-type-attachment-zip, +.icon-file-zip { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAWklEQVR4AWMoKCjwLikpeQWk/5OCoXq8GUCMq1ev/kcH+QUFYIwLgPSA9DIUoCoiySCQXpgBhDUSNgATjLpg1AWFhYXImHYG4MpMEE0INs7MhCs7o7sAZ3YGAOZ0XQZ3CJ7bAAAAAElFTkSuQmCC); + background-repeat: no-repeat +} + +.icon-file-word97-template, +.icon-file-word97, +.icon-file-word, +.icon-file-word-template, +div.content-type-attachment-word97, +span.content-type-attachment-word97, +a.content-type-attachment-word97 span, +div.content-type-attachment-word, +span.content-type-attachment-word, +a.content-type-attachment-word span { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAY0lEQVR4AWNoSan5XfAfO6z53ZLCUPP76n9c4CpQCUPBfzwAaAoZCpBdAVFQiIAQBUD86/+y/99wm/Dxf9//pf/r/p/DpaD+/04gff9/J5oVuNxAuTcLcUAgoIoVBCOLYHQDAKWzwZeLCSdPAAAAAElFTkSuQmCC); + background-repeat: no-repeat +} + +.icon-file-excel97-template, +.icon-file-excel97, +.icon-file-excel-macro, +.icon-file-excel, +.icon-file-excel-template, +div.content-type-attachment-excel97, +span.content-type-attachment-excel97, +a.content-type-attachment-excel97 span, +div.content-type-attachment-excel, +span.content-type-attachment-excel, +a.content-type-attachment-excel span { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAPklEQVR4AWMo8C55VfAfOwTKeDOUvLr6HwyAAujgKlAJA0gYUwFCjD4K8EA0EzBZpCkYxFZgjawCpMgiGN0AxP+8DyygjdoAAAAASUVORK5CYII=); + background-repeat: no-repeat +} + +.icon-file-powerpoint97-template, +.icon-file-powerpoint97, +.icon-file-powerpoint, +.icon-file-powerpoint-macro, +.icon-file-powerpoint-slideshow, +.icon-file-powerpoint-template, +div.content-type-attachment-powerpoint97, +span.content-type-attachment-powerpoint97, +a.content-type-attachment-powerpoint97 span, +div.content-type-attachment-powerpoint, +span.content-type-attachment-powerpoint, +a.content-type-attachment-powerpoint span { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAgElEQVR4AY2RMQoCMRBFc7+9zC+WIFqYC6T2NoK1jcUszBkWLIXtnltIqlmT/8p5fEh+0jSvIma/TGleF46y7EoS/yKaYFQyFYsFo+AIp2CRUHFAgFMjIfPhgXizkQHQj9Zw5caLM/e4wbjgbDw5YSOvUGP8HzqCYoYa+mN15v4CO+6/8fIppa4AAAAASUVORK5CYII=); + background-repeat: no-repeat +} + +.icon-file-multimedia, +div.content-type-attachment-multimedia, +span.content-type-attachment-multimedia, +a.content-type-attachment-multimedia span { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAb0lEQVR4AWNoSan5XfAfO6z53ZLCUPP76v///2//rwJidPoqUAlDAU5pIACaAlSAB0IU4AHoCt4QUlD+/xx2BQhu6/9l/3/iU/Dj/9L/bf+f4FYAAov/V/x/R8AEst1Q/v8s6eEAjiwcABxZBKMbAAECxHQ0fv1eAAAAAElFTkSuQmCC); + background-repeat: no-repeat +} + +a.content-type-attachment-unknown span, +div.content-type-attachment-unknown, +span.content-type-attachment-unknown, +.icon-file-unknown { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAeklEQVR4AcXRMW6DQBCGUW7MiJbV3gRxjNCEU6DkELGRbLcrPW+JtEaUma/5i9dN1+co4aTS5y7KAkY38CcB+KqkC0DQLMIJGK5AfAbDFYh/BslT9utH9pBaMPu2SbWtrrkFu2T1qq2SvQXcTcbaVJcDKIvmjs+6evcby6+/ulPhtqsAAAAASUVORK5CYII=); + background-repeat: no-repeat +} + +.icon-people-directory span.icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACCElEQVR42rVSS6tSURi1TiMxlCAc3ARFxfSoXA++3w98i28FH6ipWAYSEgo6EPsFDSIaBBE0aNK4X1CTBkGNmwRB0bjJrWD1fQdq4o26RBsW53DOt9Zea+2t+K/L6XSVXS7XnVAo9Npud6fPSHbeqtcbmEwmWC6XaDSa8Hi8r1qtlvBXApLkeT6bXcdiscB8Psdms0GlUoUoOpN/JJtMpstkG+PxGJ1OB91uF71eD6PRCDab7d6ppFQqtavX629qtdrDeDx+1eWSThqNBprNJtrttoxqtQqr1bo+IAcCARNlw263w3a7Rb/ff2y1ik+z2SzZroBEZUSjURgMBu9PHoBz8kskErkxHA4xm82wWq0wGAze0uBtcoJ8Po9isQgS490/0bhwIOD1eg2lUomzsggLPBJFUWU0Gt8lk0lkMhkEg0HodLqbPH8gwCuRSLygnFzaV8ru5m9ms/mu3+8HOeHd+XnhtwK5XO4+OyB8Xq/XF7Va7UKv15+ws3A4jFgsBrvd/mC/318CcP4X8fj4OOh2u19yWdPpVD7ro6Mr3xwOBwqFAiRJgs/n4zJZiEv8YrFYnhHKAATOzw2zdVBm0B0AxZFtswgNyvbpSsuFsst0Oi3/02g0TxSckQl8RGq1GlwauQLlPwCLMZHjlMtlqFSq7wpq9j3t/IF2+ahUKnFWKARBuPYv+AENIQe8Xo67ZAAAAABJRU5ErkJggg==) +} + +.icon-rss-feed-small span.icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAiklEQVR4AYWRoa7DMAxF8wv9U9PQ0NHQ0tLRSkPlYaGhpaEPnsV6JrWy9h7oc2VLDrLIR5gzJkvwY68EQcmDuWLCfwrpRrAccyGzUkypM6HwJg1OW/VjxUGkoVm9cIJ1Ix3oXhASFc020Lz8kRtCta5mvwp/2iFZtwHtKlQ60W7J7E645fFZj+/+ArQ1iZLN9n6PAAAAAElFTkSuQmCC) +} + +.icon-create-user-macro span.icon { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAnElEQVQ4y2NISUkxBuL/RGJjBnQAktiwYQNYwf379/FikBq8BhACOA2AYZgidAyyAKcByAaR5QJ0A3DZTh8XkBUL6AYQmybISg/5W/P/M3QyQGh8BoBobBik+f//K2AamwE4kzTMZhCe+S0XzsbqEqwAqLjpZRwGxuoSbABsUxgDGEdcsIeziXcBkkssD2oSbzM6SJuZBrYZTEMBABbrsiDsDoD0AAAAAElFTkSuQmCC) +} + +.icon-remove { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAOElEQVQoz2NgIAUU/IfCd7gUvEOlUaTguv9jNYegAlIcCIfDU8FdNAV30RUYF+xGkt5dYExkAAIAkDqa2DO/hCIAAAAASUVORK5CYII=) +} + +.icon-tick { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAxUlEQVR42q2TQQsBcRDFfachIkRKykHJyWVPvhMisiIl5aDk5OLkO/15oynTW7KtqV/TzP+999/d2txfSsYSPQkpgUfNIMi5H+Q++glo4fEBt+g7hw4M6DpzwHX4mX1bDSjTcsBlkMyupWIr03LAqRdk08AS3c3vZVoOOHb9Y67rZLY9tBRg72mVaF5VoVM4YNt0JjIvyqoxOCCuBZmXkm7GHucODlhWXsyK7ltgxp6gAAiNaQGH6LYjOGCSTwMFZPqZMvEAnpXvZz3qUlcAAAAASUVORK5CYII=) +} + +.icon-cross { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABPklEQVR4Aa2TPYrCcBDFBRExKlgIKgGRIGJhYSM2CoKNZQRBsEplZWEj2LmFvUfwCB7BI3iUmWW/P9i3zoMI8m921x34ERje/JhJSOJfShKJuzP4FZzhMIGh2+2PiPNXAl2voasVdDiEVKuQTgc6n0OnU0ijwZ6GoeWIK1gsoP0+npdLfByPeN3tIK0WtFDA++HA3sNgAB2PmXUFUQSdzTjwJQKrxzDksJU9uUUUEVcwmRBpNjloRRH4NDE3jHOuYDS6IL6Pt/0ecdnqEgRXGVfQ64F0u5BsFp+nE+Li+6hU4gxxBe02kWIRL5sNrEzCM+ItSqVLzhXU61DfZzC++75W41e5eg9BwKwrKJchmQxvt0/2FEU8RTzPTrAeZZrPM+sKcjnoWSCpFCSZhKbTYM/znJ7hCP4EBbf/TLfxDcX1CCmVYhzWAAAAAElFTkSuQmCC) +} + +.icon-opts { + background-image: url(data:image/gif;base64,R0lGODdhEAAQAPZMANjX2O7u7s/b/cLBwk2DuVlwflO491K493HE+Juxwd2SkswzM////5uwwZuxwJvV+oiIh8bn/HaOmHqgpm+HkXOLlGqXxXuToebDw1mLtGB3g2yDjWR7hmh/inLD+HO36X/J+XiRm4SWn3/K+aq90uKrq8TW6JHR+nqSnnSIk8jP1IDK+XmiyrzM6JLR+vn5+bfH4Lq6uZuwwMjV9NLR0tp/f/f398PR7rDC2Z+0xaS5y7bH4b3M6KPZ+nLE+KPY+lK3962trIuhsMzY+bHC2czZ+aTZ+p+0xsfV9IugsMLR76S4y3uTowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEAAQAAAHuIAmFgSEhYaEFiYsHz0uKyMrICAjJ0YnPx8sGQgRDwgePgifD50RCBkTB0AGBwcGr6yurhMXAra3uLgXKENMvr/AvkUoIUhMA8jJykwzIRI3TAHSASXT0kxKEhU80RgBCgs0yQBMLRUUMEwYC+AKQRDwMUw7FBs40TXsAS8M/TZMRDZ0IBGNmrVpTEh04KCj4EGESzhoOBKsIpMcGkQkaZDAQQOPCWQkGOlAiAgVKQqoXMlSZQoVgQAAOw==) +} + +.icon-stop-watching { + background-image: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAYElEQVQoz2NgoB8oUCqYWfCu4D8QvgOylNClO8BSyLADISlYsBtDGgR3FwhCpM/AhJrufn339V3TXbiSM0AlCOmC/1/f/QfCr++QTDlDhAJCVqC6AgVCpInwJlEBRUsAAP3sq7etYofPAAAAAElFTkSuQmCC) +} + +.icon-start-watching { + background-image: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAuklEQVQoz72QLQpCQRSF71rcwmzhbcF9XAaUCWITmT7lBYNgsk0SETRYpxlMN70oHgTBYjgGFZ9i1VO/A+dH5H/KLlmgpzIwWXYfeFYHDrnBGQesERk4nbfwZNVnxhERnsqIExboMdkDJwssICK0aEedWgRREO6WJyaU6kREtFISxB4DJpNknrt3Q9e3DSLJBtziigg1rbS6R2zRf7Woi2fGBRH6reRz5phrNGiwxIj+fWb7KP/9qF/qBpqJq0pmijfwAAAAAElFTkSuQmCC) +} + +.icon-info { + background-image: url(data:image/gif;base64,R0lGODlhEAAQAOZcAPhqRq84OMdycvLf358PD+O5uZ4MDMdzc/l1Uvp9W/////yXefyOb8w5Jv2fg/qFZfuOb/uFZb5cXPhvS/p9XOVhR/zTxvRlQ/lvS/6njM5BLf2Xef+0mt6Ng//Rwv6tk/2gg/mMb+NTN/uwnP+8pf7s5v/QwPXLwtZ0aNZxZfV9X/JkQs47J/2qkv3Dsv6/rPvGtv/o4Oh5Y/27qeh8Zf/Uxf+ymv2ni/7OwP/39fy1o/yli/6xmf+5ov/t6PmFZ/2XevaHafl1U/l0U/ufh/p8W/2ynP/59/luTP6uk/RqSPuNbv3Owfl+XvWJbPqSd/+9qPRqR/65o/qFZP65of6ymfluS9h1aPzHuP3Zz/7TxdhzZf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAFwALAAAAAAQABAAAAfXgFyCXAUCAQQEAQIFg4MDBwYdJyUlJx0GBwOOEigWJiQcHCQmFigSmlwHKR49H1A1WjZJVB4pB4QGWFUZHwoxRz4ZNzwwBoVXLQ4gDkYgLwpSDg4tW4YyGxsLQAsLOAo73As0h0EQDAwQEDMKLufmTogqEVMRD0s5TPUP9SqJFQkJiiQgouBHAgoAKVRQpAHBEAQImuiASFGIhkUGlEyYgCFElhBWMCCZEMVYqgYAUo5QMCJlyga3uAyQ0OBCyicuLzQ45QgSCxErVohggQlVo0KHEi1qFAgAOw==) +} + +.icon-marketplace { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACeklEQVQ4y2NgwAL88mf4KnvVrAwoml3rmz8jtmbGDiMGYkHzgn1hwnYlHxLql4Q1z9nNNGnNcW3NoOYLi3dfUiaoecnuS7y8lvkfiidujoWJtczfy2efMmGBTVLfUoIG5HSvi2I3zfmT17M+0DaxN9MkqmO2QVjrMgXP6qNSrhU3OhcdEMapuXbWTk9e4+z74o6lN63jezKTm5bZ5Xevkyrq2yCcUL80QMKx9CGPRf7b4gmbNLAa4FswaxqDYux/m8S+JbmdaxW9cqZlqPjUreMyz3vGZJD5T8iu+KGsW+WRkNI5gVgN0Atpnsegl/af1TjrH6dZ7ncGrZT/ICzuWHZLzLH0fu+ywzJ+BbPqgDGTh9UASefyjUz6Gf8ZtFP/e+RMa2+cs9vcIKJ9X0HvhsCIqoUdIDUqfvW3nNMnVWM1QD+87RBIM6Nu2n/1gIYDILHFe66aaQc0npi5+azR0n3XDBjUk/67pE+eiNUAeY/qEwx66f9ZjLL+M2gm/4+tW9oPEl+25wrvjnOPWIGuOcygnvhf1bd+M1YDgPF/jskwE2wAzBDrhL6lqw5e59l88h6/rHv1PVCYSLtWnMZqgKhj6XVGgwy4AYx6Gf+BrjrjWzCz4dD1lzw9K47YMOum/RO2L76D1QAR+5IHyAYw6KT9z+teZ5/eujIsqHTuFHBAu1Q8BIr/xGoAj0XeC1gYMBtm/WcCGpbWvMIwtHxeFRtQTN2/4QAwIX2Qdq08htWA7K61PgLWBc8ZdFL/M4CiExgbgrZFz0UdSm5rBzUt8syempvRtkq7dvp2ZpzJuWH2LlWgTbslHMtOWcb1tPjlz/RNrFsiii//AAB8nwgZ24hxQwAAAABJRU5ErkJggg==) +} + +.icon-blog-large, +.icon-blogpost-large { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAB6klEQVRYw+2YMWvDMBCF/Z/6W/o/zA1BZCheAjWlQyCLhyyBBIIpHTzGc9euWTx5KKXwlmA6dHgdjGNZdWJJdrb6Ji36pLv3ZOmCwPjWh4hiHavi9S5w+RYQCmecD4aiYsiQii/31tOvD0LhFiV+wGIoKoQMKS6IiMK9xdRNhAz5RKHi/tEKIJzxwxFwwjOFwm1iBZjzxxHA4htPtgjhnPbTNwAWJ1uEL8B6Fz6ALzSaiocRPoAMXYTiFeu5ApYMe2JVTAao0IcQTgb4GyfMbgtgof4BEwI2qM/7JVMccQNAV3yK6dlSNwHUkaLCTQEhFd8xESBDhoRRD2SDSVX0hRwmJualVHnL9GhALiFG+SDDMMKxyBE30ItaQg3UwktFEd/QImINkWMymcYs0RRdaaI1zTfCB60DSlxOk5MPEioD0qQq1xDdPTir6Nj5LapzouILe/CS6buW9YgNuIVO4ANdnhnMO4V+mHsbrdRWXBvsDSbSEVAhR64dz62P61JX53FCD0AF1Vlv34RNoZc+gFaIrVsTo9AbdMejAW2S+scjU6RLswuYqMj/F68gCITK6RHoAXB7xvZdEK5e3yMKt6MAOwgfONBK2Fm2Esz4RAqhcH2waIYoi3aIGTMKhQsMNkRc2jndiHpW/wvq3C3j5KdB0wAAAABJRU5ErkJggg==') +} + +.icon-content-template-large { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAABMUlEQVRYw+3Yv2qEQBDHcd8pz5L3WKaQxcLuIOFIcXBNCkstDkKKlD6LVYoQDqaRkOKKbyoLPe92Vi9giPvr96OO459JksEq6hwxZ9+83iUxa6OCkJIF4/E4HJ6Xe/P2RS0Ipb7rSWlC+VKHQ2KIHOFg2LqLw7FF8FQPJkBI+YgEWn1CEMpnE5BxigRovnVrJYQM+/YdQNNaiamA+SymAEft7qnHMDEFeNM+4bnSerHADjeSfWMCdvQz3mpjhHAz4DytplZgavz/AYY1sFZkBW4LXOrfFVgOMFb2vwUsvwahRpt9iX4VWF84M2tw+fm6HGAt8lrkxdbAR/0ETgDifmPPc7z++Z4jlLOASoWcwCihMo4ShvnUgwpCURuGId4wDhkmRRA2GhyIxIxz+slHjv4HivNKijUwO08AAAAASUVORK5CYII=) +} + +.icon-blank-page-large { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAABFUlEQVRYw+3YsWrDMBSFYb9Tn6XvIe5ghAdvgZTQoZClg0d7CJQMHf0smjqUEriLCR0y/J08xDHRlZtABuns+myuDNYpislq+hoxZxv2T0XKWqkglFTReDwOh+fj2bx90wtCq196UkIsR3U4JIWoEXaGrcc4HBsET7c2AULJdyIw6CuC0L6bgIpTIkD41Y2VECrs248AYbASSwHzWywBDjqeqZc4sQT41HPCc+XTSwXecDPZhpsBR50jhJsBlxm0vC9A8BnIQAYeCHCk5fGAPOQ85DzkPOQ85DzkOwI+6RK4AEi7xl7mcP33vUZo/wV0KtREqoTOWCVM86M7FYSmN5Qh3lCHTFMiCCuNFiIpdc556pmn/wM4KkViCznJbQAAAABJRU5ErkJggg==') +} + +.subheading .rss-icon, +.subheading .email-notification-icon { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAiklEQVR4AYWRoa7DMAxF8wv9U9PQ0NHQ0tLRSkPlYaGhpaEPnsV6JrWy9h7oc2VLDrLIR5gzJkvwY68EQcmDuWLCfwrpRrAccyGzUkypM6HwJg1OW/VjxUGkoVm9cIJ1Ix3oXhASFc020Lz8kRtCta5mvwp/2iFZtwHtKlQ60W7J7E645fFZj+/+ArQ1iZLN9n6PAAAAAElFTkSuQmCC) no-repeat left center; + float: right; + height: 16px; + width: 16px; + text-decoration: none; + line-height: 0 +} + +.subheading .email-notification-icon { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAgUlEQVQoz2NgoBgUdBT8xwM7GIDEzAIlrFpdCnYX/AcpEAQyXNAkBYEmrwKSIAVg7hmgYQhpYxgfqgCsZDdQUBDqqrswE+EKwEreAWEoWKEx3CwUE4wLyoEuKgfydheEoiiASIMFlKDKkd2AkEYLn5kwBTMhjsMSDqtACgiFJO0BADTadnUTnqCdAAAAAElFTkSuQmCC) no-repeat left center; + margin-right: 5px +} + +.ui-tree li a.abc, +.icon-order-alphabetical { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAl0lEQVR4AX2RMRHDMAxFRSEUQkEUTOFR6KytFETBFEzBFEohFEoh1Z0Ge1DqN2jQu9O/b8mHAlIhJJ2JLOw2SXIIE0cfBeCN4s9C58PkohY4GEjgaC28AgkUr4SaXaDhCWd94qQFcFELCT0j2rCWJ2KOVZRn0BAO+5qH4DF1FdW3DjRWd64zg65/2JS2Qg6iRwK0/s2//ABfc4q5jXZhygAAAABJRU5ErkJggg==) +} + +.ui-tree li a.rollback, +.icon-undo { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAjUlEQVQoFa3BQW2EABQFwG8BC7WABSysBc4j41tYC1jAAhawgIXXkrYJaZb20pmqv5lM9cFoERG7NtQ3D11lFrFpbReHsT5pq1kcHvVFi8NQJ08RMdWFFl0nq4i1frDb6+QQEYtHXWipk9is2myqCy31G4vUPaNY6o7BJqZ6xWC2i2e9JiK67mizt/o377RxXKGhGxsFAAAAAElFTkSuQmCC) +} + +/* module-key = 'confluence.web.resources:master-styles', location = 'includes/css/tabs.css' */ +#tab-navigation { + margin: 16px -10px; + padding: 0 10px +} + +.tab-navigation { + list-style: none; + display: block; + margin: 0 0 -1px; + padding: 0; + overflow: hidden +} + +.tab-navigation .tab { + float: left; + display: inline; + margin: 0 5px -1px 0 +} + +.tab-navigation .tab a { + padding: .3em .4em; + text-decoration: none; + display: block; + -moz-border-radius-topleft: 3px; + -moz-border-radius-topright: 3px; + -webkit-border-top-left-radius: 3px; + -webkit-border-top-right-radius: 3px; + border-top-left-radius: 3px; + border-top-right-radius: 3px +} + +.tab-navigation .notab { + margin: 1px 1px 0 1px; + padding: .3em; + float: left +} + +ul.tab-navigation .current a { + color: #000; + background-color: #fff; + border-bottom-color: #fff +} + +ul.tab-navigation .current a:hover { + color: #000; + background-color: #fff; + border-bottom-color: #fff +} + +/* module-key = 'confluence.web.resources:master-styles', location = 'includes/css/menu.css' */ +.content-navigation { + float: right; + position: relative; + margin-top: 1px +} + +.content-navigation .ajs-menu-item, +.content-navigation .ajs-button { + padding-left: 5px +} + +.content-navigation .ajs-menu-bar .ajs-button span, +.content-navigation .ajs-menu-bar .ajs-menu-item .ajs-menu-title span { + padding-left: 21px +} + +.content-navigation .ajs-menu-bar .ajs-button a>span>span.aui-icon, +.content-navigation .ajs-menu-bar .ajs-menu-item a>span>span.aui-icon { + margin-left: -21px; + padding-left: 0; + color: #707070 +} + +.ajs-menu-bar .ajs-menu-item, +.ajs-menu-bar .ajs-button { + float: left; + list-style: none; + position: relative +} + +.ajs-menu-bar, +.ajs-menu-bar .ajs-drop-down a, +.ajs-menu-bar .ajs-drop-down a span { + display: block; + margin: 0; + padding: 0 0 0 20px +} + +.ajs-menu-bar .ajs-menu-item .trigger span { + background-position: 100% 50%; + background-repeat: no-repeat +} + +.ajs-menu-bar .ajs-button span { + background-repeat: no-repeat +} + +.ajs-menu-bar .ajs-drop-down ul, +.ajs-menu-bar ul.ajs-drop-down { + border-top: solid 1px #e1e1e1; + margin: 0; + padding: 5px 0; + position: relative; + list-style: none +} + +.ajs-menu-bar .ajs-menu-item div.ajs-drop-down a { + background-position: .5em 50%; + background-repeat: no-repeat; + border: 0; + display: block; + line-height: 2; + margin: 0; + padding: 0 1em 0 28px; + position: relative; + text-decoration: none; + white-space: nowrap +} + +.ajs-menu-bar .ajs-drop-down { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; + background-color: #fff; + border: solid 1px #c1c1c1; + font-weight: normal; + min-width: 192px; + padding: 0; + position: absolute; + left: 0; + white-space: nowrap; + z-index: 1000 +} + +/* module-key = 'confluence.web.resources:default-theme-styles', location = 'includes/css/default-theme.css' */ +#breadcrumbs { + padding: 0; + margin: 0; + font-size: 0 +} + +#breadcrumbs li { + display: inline-block; + font-size: 14px; + color: var(--ds-text-subtle, #333) +} + +#breadcrumbs li:before { + content: "/"; + display: inline-block; + padding: 0 2px 0 6px +} + +#breadcrumbs li:first-child:before { + display: none +} + +#ellipsis { + cursor: pointer +} + +.page-metadata { + margin: 0 0 20px +} + +.page-metadata ul { + padding: 0; + list-style-type: none; + line-height: 16px +} + +.page-metadata, +.page-metadata ul li a:link, +.page-metadata ul li a:focus, +.page-metadata ul li a:hover, +.page-metadata ul li a:active, +.page-metadata ul li a:visited { + font-size: 12px; + color: var(--ds-text-subtlest, #707070); + line-height: 1.5 +} + +.page-metadata .modified { + margin-left: 5px +} + +.has-sidebar #content.edit form.markup, +.has-sidebar .wiki-content, +.has-sidebar.active-wikimarkup .errorBox { + margin-right: 17em +} + +.has-sidebar #content.space { + margin-right: 18em +} + +#sidebar, +.sidebar { + clear: right; + float: right; + width: 16em; + margin-left: 10px; + padding: 10px +} + +.content-preview #main { + min-height: 0 +} + +body.popup-window, +body.content-preview, +.content-preview.aui-theme-default { + background-color: var(--ds-surface, #fff) +} + +.content-preview.aui-theme-default #main.aui-page-panel { + border: 0 +} + +#title-heading.with-breadcrumbs img { + margin-right: 10px; + float: left +} + +.edit-link { + float: right +} + +body.content-type-page #main-header, +body.content-type-blogpost #main-header { + margin-bottom: 0; + padding-bottom: 5px +} \ No newline at end of file From 06156f52e0d695f462fda2a34c865054b18ba637 Mon Sep 17 00:00:00 2001 From: u239230 Date: Thu, 20 Nov 2025 16:04:04 +0100 Subject: [PATCH 2/4] feat: Index Sandbox, persistent sidebar, and metadata injection Implements the offline restructuring workflow for the index of all pages and finalizes the UI/UX. Key Changes: - **Index Sandbox:** Introduced `create_editor.py` and `patch_sidebar.py`. This tooling replaces direct Markdown editing (which caused performance issues in IDEs) with a lightweight, zero-dependency HTML Drag & Drop editor for restructuring the export. - **Navigation & UI:** - Implemented a fully hierarchical sidebar with proper indentation. - Added a robust JavaScript resizer for the sidebar; width is persisted via localStorage. - Fixed hamburger menu positioning and layout margins/paddings. - Resolved issue with duplicate entries in the index. - **Metadata:** Added automatic injection of Page Title, Author, and Modification Date to the top of the HTML body for every page. - **Versioning:** Output directory generation now includes timestamps (e.g., `YYYY-MM-DD HHMM [Title]`) to support clean history management. - **Fixes:** Addressed various edge cases in tree generation and CSS layouting. --- .gitignore | 3 + CHANGELOG.md | 168 +- CONTRIBUTING.md | 86 +- README.md | 154 +- confluenceDumpWithPython.py | 600 +++--- confluence_dump/myModules.py | 362 +++- confluence_products.ini | 14 +- create_editor.py | 659 +++++++ getPageEditorVersion.py | 96 - output/.gitkeep | 0 patch_sidebar.py | 236 +++ requirements.txt | 1 - styles/{ => 01 legacy css}/confluence.css | 0 .../confluencedefaultpdf.css | 1708 ++++++++--------- updatePageLinks.py | 109 -- 15 files changed, 2608 insertions(+), 1588 deletions(-) create mode 100644 create_editor.py delete mode 100644 getPageEditorVersion.py delete mode 100644 output/.gitkeep create mode 100644 patch_sidebar.py rename styles/{ => 01 legacy css}/confluence.css (100%) rename styles/{ => 01 legacy css}/confluencedefaultpdf.css (93%) delete mode 100644 updatePageLinks.py diff --git a/.gitignore b/.gitignore index bb91773..3cb2889 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ __pycache__/ PDS .DS_Store +/styles/00 archive/ +00 archive/ +.idea/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ff6d3a..bb133c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,112 @@ All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](https://www.google.com/search?q=https://keepachangelom.com/en/1.0.0/ "null"), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html "null"). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/ "null"), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html "null"). -# Changelog +## \[2.5.0\] - 2025-11-22 + +Introduction of the "Architecture Sandbox" for offline restructuring. + +### Added + +- **Architecture Sandbox:** Introduced `create_editor.py` and `patch_sidebar.py`. Users can now generate a visual Drag & Drop editor (`editor_sidebar.html`) to restructure the exported documentation offline and apply changes massively using the patcher. + +- **Robust Editor Generation:** The editor generator now uses a safe string concatenation approach to avoid syntax errors and supports creating a working copy of the sidebar structure (`sidebar_edit.md`). + + +### Changed + +- **CSS Strategy:** Refined the "Two-Layer" styling approach (Standard + Custom) to be more robust in the documentation and implementation. + + +## \[2.4.1\] - 2025-11-21 + +UI/UX Improvements and Bug Fixes. + +### Added + +- **Metadata Injection:** Page Title, Author, and Modification Date are now injected directly into the HTML Body (top of the page) for better readability. + +- **Automatic Time-stamping:** Output folders are now automatically named with `YYYY-MM-DD HHMM [Title]` to support clean versioned backups. + +- **Persistent Sidebar:** The sidebar width is now remembered across page loads using `localStorage`. + +- **Absolute Links in Markdown:** The generated `sidebar.md` uses absolute file URIs to support opening links in external editors like Logseq or WebStorm directly. + + +### Fixed + +- **Empty Page Bug:** Fixed an issue where pages with empty bodies (folders) resulted in 0-byte HTML files. Now generates a proper HTML skeleton with title and sidebar. + +- **Markdown Patching:** Updated `patch_sidebar.py` to handle absolute file URIs correctly. + +- **UI Layout:** Optimized Sidebar/Content padding and Hamburger button alignment. + + +## \[2.4.0\] - 2025-11-21 + +Advanced Filtering and Tree Logic Update. + +### Added + +- **Label Forest Mode:** The `label` command now supports deep recursion ("Forest Export"). It finds all pages with the include-label and treats them as roots for full tree exports. + +- **Label Pruning:** Added `--exclude-label` to prune subtrees based on a specific label (e.g., 'archived') during recursion. + + +## \[2.3.0\] - 2025-11-21 + +Enterprise Performance & Usability Release. + +### Added + +- **Recursive Inventory:** Changed scanning logic to use `/child/page` API endpoints. This ensures the export respects the **manual sort order** of Confluence. + +- **Multithreading:** Added `-t/--threads` argument to parallelize page downloads (Phase 2), significantly improving performance on large spaces. + +- **Tree Pruning (ID):** Added `--exclude-page-id` to skip specific branches during recursion. + +- **JS Resizer:** The sidebar now has a robust JavaScript-based drag-handle for resizing. + +- **UX Improvements:** + + - Fixed Hamburger position (top-left). + + - Added "Heartbeat" visualization during inventory scan. + + - Added VPN Reminder for Data Center profiles. + + +### Changed + +- **Architecture:** Split process into a strict "Inventory Phase" (Serial, Recursive for sorting) and "Download Phase" (Parallel). + + +## \[2.2.0\] - 2025-11-20 + +Introduction of Static Sidebar Injection. + +### Added + +- **Static Sidebar Injection:** Automatically generates a hierarchical navigation tree and injects it into every HTML page. + +- **Inventory Phase:** Scans all pages/metadata _before_ downloading content to allow for accurate progress bars (`tqdm`) and global tree generation. + +- **Smart Linking:** Improved detection of dead/external links vs. local links based on the inventory. + +- **CSS Auto-Discovery:** The script automatically detects and applies `site.css` from the local `styles/` folder. + +- **Multi-CSS Support:** Allows layering multiple CSS files (Standard + Custom). + +- **`sidebar.html` Export:** Saves the generated sidebar tree as a separate file. + + +### Changed + +- **HTML Layout:** Pages are now wrapped in a Flexbox layout container to support the sidebar. + +- **Logging:** Cleaned up library logging to support progress bars. + ## \[2.1.0\] - 2025-11-19 @@ -12,32 +115,31 @@ Major functionality restore and improvement ("Visual Copy" release). ### Added -- **HTML Processing with BeautifulSoup:** +- **HTML Processing with BeautifulSoup:** Re-introduced intelligent HTML parsing. - - Re-introduced intelligent HTML parsing. - - **Image Downloading:** Automatically detects embedded images/emoticons, downloads them, and rewrites HTML links to local paths (`../attachments/`). - - **Link Sanitizing:** Attempts to rewrite Confluence internal links. + - **Link Sanitizing:** Attempts to rewrite Confluence internal links to relative filenames. - - **Metadata Injection:** Injects Title, Page ID, and Labels into the HTML ``. + - **Metadata Injection (Head):** Injects Title, Page ID, and Labels into the HTML ``. - **Export View:** Switched API fetch from `storage` format to `export_view` (or `view`) to get rendered HTML (resolves macros like TOC). -- **Attachment Downloading:** Downloads _all_ attachments of a page, not just those embedded in the text. +- **Attachment Downloading:** Downloads _all_ attachments of a page via API list, not just those embedded in the text. ### Changed -- **HTML is now the primary output:** The script always generates a standalone, browsable `.html` file linked to the CSS. +- **HTML First:** The primary output format is now processed HTML (`export_view`). RST export is optional via `-R`. - **Dependencies:** Added `beautifulsoup4` to requirements. - **CSS handling:** Improved relative pathing for robust offline viewing. + ## \[2.0.0\] - 2025-11-17 -This version introduces a major architectural refactoring to support both Confluence Cloud and Data Center, and replaces the CLI mode logic with a robust sub-command architecture. All original functionality (all modes, all formats) is preserved and extended. +This version introduces a major architectural refactoring to support both Confluence Cloud and Data Center. ### Added @@ -47,15 +149,11 @@ This version introduces a major architectural refactoring to support both Conflu - **Data Center Authentication:** Added support for Bearer Token (Personal Access Token) authentication. -- **New `label` Command:** Added support for dumping all pages with a specific label via the `label` sub-command (previously missing from refactoring). - -- **Custom CSS Support:** Added `--css-file` argument to supply a custom CSS stylesheet, ensuring properly styled HTML exports. +- **New `label` Command:** Added support for dumping all pages with a specific label. - **Troubleshooting Hints:** Added specific error messages for Data Center users when authentication fails (Intranet/VPN warning). -- **`CONTRIBUTING.md`:** A new file explaining the new architecture. - -- **`CHANGELOG.md`:** This file. +- **Documentation:** Added `CONTRIBUTING.md` and `CHANGELOG.md`. ### Changed @@ -66,43 +164,13 @@ This version introduces a major architectural refactoring to support both Conflu - **REMOVED:** The `-s`/`--site` argument. - - **ADDED:** Sub-commands: `single`, `tree`, `space`, `all-spaces`, and `label` to select the mode. - - - **CHANGED:** The `-p`/`--pageid` and `-sp`/`--space-key` (formerly `--space`) arguments are now context-specific arguments for their respective commands (e.g., `single --pageid ...`). - - - **ADDED (Global, Required):** `--base-url` argument for the instance URL. - - - **ADDED (Global, Required):** `--profile` argument to select 'cloud' or 'dc'. - - - **ADDED (Global, Optional):** `--context-path` argument for Data Center. - - - **PRESERVED (Global):** `-o`/`--outdir`, `-H`/`--html`, `-R`/`--rst` are now global options. - -- **Refactored `myModules.py`:** - - - All API functions (e.g., `get_page_full`) are now platform-agnostic, driven by the `.ini` file. - - - All hardcoded URLs (e.g., `.atlassian.net`) have been removed. - - - Added helper functions (`_build_api_url`, `_execute_get_request`, `load_platform_config`, `get_auth_config`). - - - Added `get_pages_by_label` to support label-based dumping. - - - Improved directory creation logic (`setup_output_directories`) to be robust against re-runs. - -- **Refactored `confluenceDumpWithPython.py`:** - - - Re-implemented all modes (`single`, `tree`, `space`, `all-spaces`, `label`) using the new sub-command architecture. - - - Preserved all original output logic (JSON, HTML, RST). - - - Improved HTML generation: now produces standalone HTML files linked to a custom CSS stylesheet if provided. + - **ADDED:** Sub-commands: `single`, `tree`, `space`, `all-spaces`, `label`. - - Replaced `if/elif` "spaghetti code" with clean, dedicated handler functions for each mode. + - **ADDED (Global):** `--base-url`, `--profile`, `--context-path`. -- **Updated `README.md`:** The README now reflects the new sub-command architecture, provides examples for all major use cases, documents the `--css-file` option, and includes a troubleshooting section for Data Center VPN issues. +- **Refactored `myModules.py`:** All API functions are now platform-agnostic. Hardcoded URLs removed. -- **Internationalization:** All code comments, docstrings, and user-facing error messages have been translated to English. +- **Internationalization:** All code comments translated to English. _History below this line is from the original author (jgoldin-skillz)._ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 17875ac..c854a43 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,75 +2,59 @@ This document explains the internal architecture of this script, primarily for future contributors or the original author when reviewing pull requests. -## Refactoring Goal +## Architectural Overview -The main goal of the 2024 refactoring was to decouple the script from a specific Confluence platform (Confluence Cloud) and enable robust support for **Confluence Data Center (DC)**. +The codebase has been refactored from a simple linear scraper to a multi-phase, multithreaded export engine designed for enterprise stability. -The original code had hardcoded URLs (e.g., `f"https://{site}.atlassian.net/wiki/..."`) which made it impossible to use with self-hosted instances. +### Core Philosophy -## Core Architecture: `confluence_products.ini` - -The core of this new architecture is the `confluence_products.ini` file. - -This file acts as a **platform definition file**. It defines _how_ to talk to a specific platform, not _which_ instance to talk to. - -It contains profiles (e.g., `[cloud]`, `[dc]`) that specify two key things: - -1. `auth_method`: The authentication required (e.g., `basic_api_token` for Cloud, `bearer_pat` for DC). +- **Inventory First:** We scan the entire structure _before_ downloading content. This allows for accurate progress bars (`tqdm`) and correct sorting. -2. **URL Templates**: A list of API and view paths for all required functions (e.g., `url_get_page`, `url_view_page`). +- **Static & Self-Contained:** The output HTML must work without a server, internet connection, or JavaScript dependencies (Zero-Dependency). + +- **Platform Agnostic:** `confluence_products.ini` abstracts the differences between Cloud and Data Center. -This approach allows the main script logic to be completely platform-agnostic. - -## How It Works: The Data Flow +### The Export Pipeline (`confluenceDumpWithPython.py`) -1. The main script (`confluenceDumpWithPython.py`) no longer accepts a "site" name. It now requires the user to specify: +1. **Inventory Phase (Serial):** - - `--profile "cloud"`: Selects the `[cloud]` section from the `.ini`. + - Uses recursion (e.g., `recursive_scan`) to walk the Confluence tree using `child/page` endpoints. - - `--base-url "https://myteam.atlassian.net"`: Provides the specific instance URL. + - This guarantees the sidebar matches the _manual sort order_ of Confluence (unlike CQL search). -2. At startup, the script calls `myModules.load_platform_config(profile)` to load all URL templates and settings for the chosen profile into a `platform_config` dictionary. - -3. It then calls `myModules.get_auth_config(platform_config)` to get the correct `requests` auth object or header (based on `auth_method` and environment variables). - -4. All API functions in `myModules.py` (e.g., `get_page_full`) are no longer hardcoded. They now receive the `base_url`, `platform_config`, and `auth_info` as arguments. + - Applies pruning (excludes) at this stage to save time. + + - Generates `sidebar.md` (Markdown representation) and `sidebar.html` (HTML Tree). + +2. **Download Phase (Parallel):** -5. Inside `myModules.py`, a helper function (`_build_api_url`) dynamically constructs the correct, full URL by combining the `base_url`, the `context_path` (for DC), and the appropriate URL template from the `platform_config` dictionary. + - Uses `ThreadPoolExecutor` to fetch `export_view` HTML and attachments in parallel. + + - Calls `myModules.process_page_content` to sanitize HTML (BeautifulSoup). + +3. **Injection Phase:** + - Injects the pre-calculated Sidebar, Metadata, and CSS into every downloaded page. + -## How to Add a New Feature (e.g., "Add Comment") +### The Editor Workflow (`create_editor.py` & `patch_sidebar.py`) -If you want to add a new function that calls a new API endpoint, the process is simple and clean: +We treat the exported structure as mutable. -1. **Add Templates to `.ini`**: Open `confluence_products.ini` and add the new URL template to _both_ profiles: +- **`create_editor.py`**: Parses the `sidebar.md` and generates a standalone HTML Single-Page-Application using vanilla JavaScript. It allows Drag & Drop reordering. - ``` - [cloud] - ... - url_add_comment = /rest/api/content/{pageId}/child/comment +- **`patch_sidebar.py`**: Parses the modified Markdown and re-injects the new navigation tree into all existing HTML files. - [dc] - ... - url_add_comment = {context_path}/rest/api/content/{pageId}/child/comment - ``` + +## Key Files + +- **`confluenceDumpWithPython.py`**: Main entry point and orchestration. -2. **Add Function to `myModules.py`**: Create your new function (e.g., `add_comment`). Inside it, use the new config key by calling the internal helpers: +- **`myModules.py`**: API abstraction, BeautifulSoup logic, and HTML templating. - ``` - def add_comment(pageId, comment_body, base_url, platform_config, auth_info, context_path_override): - path_params = {'pageId': pageId} - url = _build_api_url( - base_url, - platform_config, - context_path_override, - 'url_add_comment', # This key must match the .ini - path_params - ) +- **`confluence_products.ini`**: URL templates for Cloud vs. DC. - payload = {"body": {"storage": {"value": comment_body, "representation": "storage"}}} +- **`create_editor.py`**: Tool to generate the visual sidebar editor. - # Use _execute_post_request (or similar) - # ... - ``` \ No newline at end of file +- **`patch_sidebar.py`**: Tool to apply structure changes. \ No newline at end of file diff --git a/README.md b/README.md index 51ed0cf..16c9511 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,41 @@ # Confluence Dump with Python -This script exports content from a Confluence instance (Cloud or Data Center) using various modes (single page, page tree, full space, all spaces, or by label). +This script exports content from a Confluence instance (Cloud or Data Center) using various modes. **Key Features:** -- **Visual Copy:** Fetches the rendered HTML (`export_view`) to preserve macros, tables, and formatting. +- **Visual Fidelity & Sidebar:** Creates a visually faithful copy of Confluence pages, including a **fully functional, static navigation sidebar** on the left—something even the standard Confluence export does not provide. -- **Offline Browsing:** Downloads embedded images/emoticons and rewrites links to be relative, creating a self-contained offline HTML archive. +- **Offline Browsing:** Localizes images and links, and downloads **all** attachments (PDFs, Office docs, etc.) for complete offline access. -- **Metadata:** Injects Confluence metadata (Page ID, Labels, Title) directly into the HTML headers. +- **Recursive Inventory:** Scans the tree hierarchy to ensure the **correct sort order** (manual Confluence order) in the sidebar. -- **Complete Archive:** Downloads _all_ page attachments, not just those displayed on the page. +- **Metadata Injection:** Automatically adds Page Title, Author, and Modification Date to the top of every page. -- **Multi-Format:** Exports as JSON (metadata + raw body), HTML (visual), and optional RST. +- **Versioning:** Automatically creates timestamped output subfolders (e.g., `2025-11-21 1400 Space IT`). This allows you to run the script repeatedly (e.g., after changes in Confluence) and maintain a history of snapshots without overwriting previous exports. - -## Platform Support - -This script supports both: - -- **Confluence Cloud** +- **Performance:** Supports **Multithreaded** downloading (`--threads`) to speed up the export of large spaces. -- **Confluence Data Center** +- **Tree Pruning:** Exclude specific branches with `--exclude-page-id` or `--exclude-label`. + +- **Index Sandbox:** Includes visual tools to manually restructure the navigation tree via Drag & Drop and apply it to the downloaded files without affecting Confluence. -The platform-specific API paths and authentication methods are defined in the `confluence_products.ini` file. +## Missing Features / Ideas + +- **Incremental Update:** Currently, the script always performs a full export. An update mode that only downloads changed pages would be a valuable addition. + ## Requirements - Python 3.x -- `requests` - -- `beautifulsoup4` (for HTML parsing and link rewriting) +- `requests`, `beautifulsoup4`, `tqdm` -- `pypandoc` (optional, for RST export or legacy HTML conversion) +- `pypandoc` (optional, only needed for RST export) -## Installation - ``` -git clone [https://github.com/jgoldin-skillz/confluenceDumpWithPython.git](https://github.com/jgoldin-skillz/confluenceDumpWithPython.git) -cd confluenceDumpWithPython pip install -r requirements.txt ``` @@ -66,25 +60,15 @@ export CONFLUENCE_TOKEN="YourPersonalAccessTokenHere" ## Exporting with CSS Styling -The script uses a robust **Two-Layer Styling Strategy** to ensure the exported HTML looks correct. +The script uses a robust **Two-Layer Styling Strategy**. ### Layer 1: Standard CSS (Default) -The project folder contains a `styles/` directory. This should contain a "Best Guess" CSS file (e.g., `site.css`) extracted from a standard Confluence instance. - -- **Automatic:** If a CSS file exists in the local `styles/` folder, it is **automatically applied** to every export. - -- **Maintenance:** You can update this file manually if Confluence changes its base layout significantly. - +The project folder contains a `styles/` directory. If a CSS file exists there (e.g., `styles/site.css`), it is **automatically applied** to every export. ### Layer 2: Custom CSS (Optional) -If you have specific styles for your Space (logos, colors, custom macros) that override the standard look, you can provide a second CSS file via the command line. - -- **Usage:** Use `--css-file "/path/to/my_custom.css"`. - -- **Behavior:** This file will be loaded **after** the standard CSS, allowing you to override specific styles without losing the basic formatting. - +Use `--css-file "/path/to/my_custom.css"` to apply specific overrides. This file will be loaded **after** the standard CSS. ## Usage @@ -94,52 +78,88 @@ If you have specific styles for your Space (logos, colors, custom macros) that o python3 confluenceDumpWithPython.py [GLOBAL_OPTIONS] [COMMAND_OPTIONS] ``` -### Command-Line Arguments - -Run `python3 confluenceDumpWithPython.py -h` to see all options. +### Global Options ``` -usage: confluenceDumpWithPython.py [-h] -o OUTDIR --base-url BASE_URL --profile PROFILE [--context-path CONTEXT_PATH] [-R] [--css-file CSS_FILE] {single,tree,space,all-spaces,label} ... - -Global Options: - -h, --help show this help message and exit -o OUTDIR, --outdir OUTDIR The output directory (will be created) - --base-url BASE_URL The full base URL. - --profile PROFILE Platform profile ('cloud' or 'dc'). - --context-path CONTEXT_PATH - (Data Center only) Manually override the context path. - -R, --rst Export pages as RST. - --css-file CSS_FILE Path to a local custom CSS file (applied AFTER standard CSS). + --base-url BASE_URL Confluence Base URL (e.g., '[https://confluence.corp.com](https://confluence.corp.com)') + --profile PROFILE Platform profile ('cloud' or 'dc') + --context-path PATH (DC only) Context path (e.g., '/wiki') + --threads THREADS, -t THREADS + Number of download threads (Default: 1) + --exclude-page-id ID Exclude a page ID and its children (can be repeated) + --no-vpn-reminder Skip the VPN check confirmation (DC only) + --css-file CSS_FILE Path to custom CSS file + -R, --rst Export pages as RST (requires pypandoc) ``` -### Examples +### Commands + +- **`space`**: Dumps an entire space. Starts at the Space Homepage and recurses down. + + - `-sp`, `--space-key`: The Key of the space. + +- **`tree`**: Dumps a specific page and all its descendants. + + - `-p`, `--pageid`: The Root Page ID. + +- **`single`**: Dumps a single page. + + - `-p`, `--pageid`: The Page ID. + +- **`label`**: Dumps pages by label ("Forest Mode"). Finds all pages with the label and treats them as roots for recursion. + + - `-l`, `--label`: The label to include. + + - `--exclude-label`: Exclude subtrees that have this specific label (e.g. 'archived'). + +- **`all-spaces`**: Dumps all visible spaces. + -#### 1\. Standard Dump (Uses default CSS) +### Examples -Dumps a page tree. Automatically applies `styles/site.css` if present in the script folder. +**1\. Data Center: Entire Space, 8 Threads, Exclude Archive** ``` python3 confluenceDumpWithPython.py \ - --base-url "[https://confluence.mycompany.com](https://confluence.mycompany.com)" \ - --profile "dc" \ + --base-url "[https://confluence.corp.com](https://confluence.corp.com)" \ + --profile dc \ --context-path "/wiki" \ - -o "./tree_dump" \ - tree \ - --pageid "67890" + -o "./dump_it" \ + -t 8 \ + --exclude-page-id "999999" \ + space -sp "IT" ``` -#### 2\. Customized Dump (Standard + Custom CSS) - -Dumps a page tree. Applies `styles/site.css` (standard) AND `my_overrides.css` (custom). +**2\. Cloud: Single Page Tree** ``` python3 confluenceDumpWithPython.py \ - --base-url "[https://confluence.mycompany.com](https://confluence.mycompany.com)" \ - --profile "dc" \ - --context-path "/wiki" \ - -o "./tree_dump" \ - --css-file "./my_overrides.css" \ - tree \ - --pageid "67890" -``` \ No newline at end of file + --base-url "[https://myteam.atlassian.net](https://myteam.atlassian.net)" \ + --profile cloud \ + -o "./dump_tree" \ + tree -p "12345" +``` + +## Index Restructuring Sandbox + +This additional toolset allows you to re-organize the pages and sub-pages structure (the index) of your export locally. This is useful for testing structural changes or cleaning up the navigation flow without touching Confluence or re-downloading pages. + +**The Workflow:** + +1. **Generate Editor:** Create a visual Drag & Drop editor for the index of all exported pages. + + ``` + python3 create_editor.py --site-dir "./output/2025-01-01 Space IT" + ``` + +2. **Edit:** Open `editor_sidebar.html` in your browser. Move pages, create folders, delete items. + +3. **Save:** Click "Copy Markdown" in the editor and paste the content into a new file `sidebar_edit.md` in the site directory. + +4. **Apply:** Patch the new index structure into all **downloaded** HTML files. + + ``` + python3 patch_sidebar.py --site-dir "./output/2025-01-01 Space IT" + ``` \ No newline at end of file diff --git a/confluenceDumpWithPython.py b/confluenceDumpWithPython.py index 2e74257..da13100 100644 --- a/confluenceDumpWithPython.py +++ b/confluenceDumpWithPython.py @@ -3,8 +3,14 @@ """ This script dumps content from a Confluence instance (Cloud or Data Center). -It fetches rendered HTML (export_view), processes it with BeautifulSoup to -localize images and links, downloads attachments, and optionally converts to RST/HTML. +Features: +- Recursive Inventory Scan (Correct Sort Order) +- Multithreaded Downloading +- HTML Processing with BeautifulSoup (Images, Links, Sidebar, Resizer) +- Static Sidebar Injection +- CSS Auto-Discovery +- Label-based Tree Pruning +- Automatic Timestamped Subdirectories """ import argparse @@ -13,6 +19,11 @@ import json import shutil import glob +import time +import re +from datetime import datetime +from pathlib import Path +from concurrent.futures import ThreadPoolExecutor, as_completed from confluence_dump import myModules # --- External Libraries --- @@ -24,205 +35,224 @@ try: from tqdm import tqdm except ImportError: - # Fallback if tqdm is not installed: simple iterator that prints nothing extra - print("Info: 'tqdm' not found. Progress bars will be disabled. (pip install tqdm)", file=sys.stderr) - - def tqdm(iterable, **kwargs): return iterable # --- Global Config & State --- platform_config = {} auth_info = {} -all_pages_metadata = [] # Stores dicts: {'id': str, 'title': str, 'parent_id': str} +all_pages_metadata = [] +seen_metadata_ids = set() +global_sidebar_html = "" + + +# --- Helper Functions --- + +def sanitize_filename(filename): + """ + Sanitizes a string to be safe for directory names. + Removes/replaces invalid characters for Windows/Linux/macOS. + """ + # Replace bad chars with underscore or space + # Invalid chars: < > : " / \ | ? * + s = re.sub(r'[<>:"/\\|?*]', '_', filename) + # Strip whitespace and dots from ends + return s.strip().strip('.') + + +def get_run_title(args, base_url, platform_config, auth_info): + """ Determines the semantic title for the output folder based on the command. """ + if args.command == 'all-spaces': + return "all spaces" + + elif args.command == 'space': + return f"Space {args.space_key}" + + elif args.command == 'label': + return f"Export {args.label}" + + elif args.command in ('single', 'tree'): + # For page-based commands, we need the page title. + # We perform a quick API fetch here. + print(f"Fetching title for page {args.pageid} to name the output folder...") + try: + # Assuming context path is needed for DC + context_path = args.context_path + page_data = myModules.get_page_basic(args.pageid, base_url, platform_config, auth_info, context_path) + if page_data and 'title' in page_data: + return page_data['title'] + else: + return f"Page {args.pageid}" # Fallback if title fetch fails + except Exception as e: + print(f"Warning: Could not fetch page title: {e}", file=sys.stderr) + return f"Page {args.pageid}" + + return "Export" # --- Processing Helpers --- def collect_page_metadata(page_full): - """ Collects metadata for the index generation. """ try: page_id = page_full.get('id') + if not page_id or page_id in seen_metadata_ids: + return title = page_full.get('title') ancestors = page_full.get('ancestors', []) parent_id = ancestors[-1]['id'] if ancestors else None - - if page_id: - all_pages_metadata.append({ - 'id': page_id, - 'title': title, - 'parent_id': parent_id - }) + all_pages_metadata.append({'id': page_id, 'title': title, 'parent_id': parent_id}) + seen_metadata_ids.add(page_id) except Exception as e: print(f"Warning: Could not collect metadata for index: {e}", file=sys.stderr) def save_page_attachments(page_id, attachments, base_url, auth_info): - """ Downloads all attachments listed in the API response for a page. """ - if not attachments or 'results' not in attachments: - return - + if not attachments or 'results' not in attachments: return for att in attachments['results']: download_path = att.get('_links', {}).get('download') filename = att.get('title') - if download_path and filename: if download_path.startswith('/'): full_url = base_url.rstrip('/') + download_path else: full_url = base_url.rstrip('/') + '/' + download_path - local_path = os.path.join(myModules.outdir_attachments, filename) myModules.download_file(full_url, local_path, auth_info) -def convert_html(page_id, page_title, page_body, outdir_pages, css_filename=None): - """ - Converts Confluence storage HTML to standard HTML via pandoc. - Uses --standalone to create full HTML files with head/body. - """ +def convert_rst(page_id, page_body, outdir_pages): if pypandoc is None: return + page_filename_rst = f"{outdir_pages}{page_id}.rst" + try: + pypandoc.convert_text(page_body, 'rst', format='html', outputfile=page_filename_rst) + except Exception as e: + print(f" Error converting RST for {page_id}: {e}", file=sys.stderr) - page_filename_html = f"{outdir_pages}{page_id}.html" - # Default CSS path relative to the HTML file - css_path = "../styles/site.css" - if css_filename: - css_path = f"../styles/{os.path.basename(css_filename)}" +# --- Tree Generation --- - pdoc_args = [ - '--standalone', - f'--css={css_path}', - '--metadata', f'title={page_title}' - ] +def build_tree_structure(target_ids): + tree_map = {} + pages_map = {} + relevant_pages = [p for p in all_pages_metadata if p['id'] in target_ids] + for page in relevant_pages: + pid = page['id'] + parent = page['parent_id'] + pages_map[pid] = page + if parent not in tree_map: tree_map[parent] = [] + tree_map[parent].append(pid) + downloaded_ids = set(pages_map.keys()) + root_ids = [] + for page in relevant_pages: + parent = page['parent_id'] + if parent is None or parent not in downloaded_ids: + root_ids.append(page['id']) + return tree_map, pages_map, root_ids - try: - output = pypandoc.convert_text( - page_body, - 'html', - format='html', - outputfile=page_filename_html, - extra_args=pdoc_args - ) - assert output == "" - except Exception as e: - print(f" Error converting HTML for {page_id}: {e}", file=sys.stderr) +def generate_tree_html(target_ids): + tree_map, pages_map, root_ids = build_tree_structure(target_ids) -def convert_rst(page_id, page_body, outdir_pages): - """ Converts processed HTML file to RST via pandoc """ - if pypandoc is None: return + def build_branch(parent_id): + if parent_id not in tree_map: return "" + html = "
    " + for child_id in tree_map[parent_id]: + if child_id not in pages_map: continue + child = pages_map[child_id] + title = child['title'] + link = f'{title}' + if child_id in tree_map: + sub_tree = build_branch(child_id) + html += f'
  • {link}{sub_tree}
  • ' + else: + html += f'
  • {link}
  • ' + html += "
" + return html - page_filename_rst = f"{outdir_pages}{page_id}.rst" - # print(f" Converting to RST: {page_filename_rst}") - try: - output = pypandoc.convert_text(page_body, 'rst', format='html', outputfile=page_filename_rst) - assert output == "" - except Exception as e: - print(f" Error converting RST for {page_id}: {e}", file=sys.stderr) + sidebar = '' + return sidebar -# --- Core Logic --- +def generate_tree_markdown(target_ids): + tree_map, pages_map, root_ids = build_tree_structure(target_ids) + md_lines = [] + pages_dir_abs = os.path.abspath(myModules.outdir_pages) + pages_uri = Path(pages_dir_abs).as_uri() -def create_error_placeholder(page_id, page_title, html_filename): - """ Creates a minimal HTML file indicating that the download failed. """ - try: - with open(html_filename, 'w', encoding='utf-8') as f: - f.write(f""" - - - - Download Failed: {page_title} - - - -
-

Download Failed

-

The content for page {page_id} could not be retrieved during export.

-

Please check the export logs for details.

-
- - - """) - print(f" -> Created placeholder for failed page: {page_id}") - except Exception as e: - print(f" Error creating placeholder: {e}", file=sys.stderr) + def build_branch_md(parent_id, level): + if parent_id not in tree_map: return + indent = " " * level + for child_id in tree_map[parent_id]: + if child_id not in pages_map: continue + child = pages_map[child_id] + md_lines.append(f"{indent}- [{child['title']}]({pages_uri}/{child_id}.html)") + if child_id in tree_map: + build_branch_md(child_id, level + 1) + for rid in root_ids: + if rid not in pages_map: continue + page = pages_map[rid] + md_lines.append(f"- [{page['title']}]({pages_uri}/{rid}.html)") + if rid in tree_map: + build_branch_md(rid, 1) -def process_page(page_id, global_args, active_css_files=None, exported_page_ids=None, verbose=True): - """ - Downloads and processes a single page. - :param verbose: If True, prints details to stdout. If False (for progress bars), stays silent except for errors. - """ - if verbose: - print(f"\nProcessing page ID: {page_id}") - - # 1. Get Page (with export_view) - page_full = myModules.get_page_full( - page_id, - global_args.base_url, - platform_config, - auth_info, - global_args.context_path - ) + return "\n".join(md_lines) - # Define filename early - html_filename = os.path.join(myModules.outdir_pages, f"{page_id}.html") - if not page_full: - # ERROR HANDLING: Create placeholder - print(f" Warning: Could not fetch page {page_id}. Creating placeholder.", file=sys.stderr) - create_error_placeholder(page_id, "Unknown Title", html_filename) - return +def save_sidebars(outdir, target_ids): + global global_sidebar_html + global_sidebar_html = generate_tree_html(target_ids) + with open(os.path.join(outdir, 'sidebar.html'), 'w', encoding='utf-8') as f: + f.write(global_sidebar_html) + + sidebar_md = generate_tree_markdown(target_ids) + with open(os.path.join(outdir, 'sidebar.md'), 'w', encoding='utf-8') as f: + f.write(sidebar_md) - # Collect Metadata for Index - collect_page_metadata(page_full) - page_title = page_full.get('title', 'Untitled') - if verbose: - print(f" Title: {page_title}") +# --- Core Logic --- + +def process_page(page_id, global_args, active_css_files=None, exported_page_ids=None, verbose=True): + if verbose: print(f"\nProcessing page ID: {page_id}") + page_full = myModules.get_page_full(page_id, global_args.base_url, platform_config, auth_info, + global_args.context_path) + if not page_full: + print(f" Warning: Could not fetch page {page_id}. Skipping.", file=sys.stderr) + return + if verbose: collect_page_metadata(page_full) - # 2. Get Raw HTML raw_html = page_full.get('body', {}).get('export_view', {}).get('value') if not raw_html: raw_html = page_full.get('body', {}).get('view', {}).get('value', '') - # 3. Process HTML (BeautifulSoup) processed_html = myModules.process_page_content( - raw_html, - page_full, - global_args.base_url, - auth_info, - active_css_files, - exported_page_ids + raw_html, page_full, global_args.base_url, auth_info, active_css_files, exported_page_ids, global_sidebar_html ) - # 4. Save HTML File html_filename = os.path.join(myModules.outdir_pages, f"{page_id}.html") with open(html_filename, 'w', encoding='utf-8') as f: f.write(processed_html) - # 5. Get & Download Attachments - page_attachments = myModules.get_page_attachments( - page_id, - global_args.base_url, - platform_config, - auth_info, - global_args.context_path - ) + page_attachments = myModules.get_page_attachments(page_id, global_args.base_url, platform_config, auth_info, + global_args.context_path) save_page_attachments(page_id, page_attachments, global_args.base_url, auth_info) - # 6. Save Metadata JSON json_filename = os.path.join(myModules.outdir_pages, f"{page_id}.json") page_full['body_processed'] = processed_html with open(json_filename, 'w', encoding='utf-8') as f: json.dump(page_full, f, indent=4, ensure_ascii=False) - # 7. Optional RST Export if global_args.rst: convert_rst(page_id, processed_html, myModules.outdir_pages) @@ -230,16 +260,8 @@ def process_page(page_id, global_args, active_css_files=None, exported_page_ids= # --- Index Generation --- def build_index_html(output_dir, css_files=None): - """ Generates an index.html file listing all downloaded pages hierarchically. """ - print("\nGenerating index.html...") - tree_map = {} - pages_map = {} - for page in all_pages_metadata: - pid = page['id'] - parent = page['parent_id'] - pages_map[pid] = page - if parent not in tree_map: tree_map[parent] = [] - tree_map[parent].append(pid) + print("\nGenerating global index.html...") + tree_map, pages_map, root_ids = build_tree_structure(set(p['id'] for p in all_pages_metadata)) def build_list_html(parent_id): if parent_id not in tree_map: return "" @@ -253,13 +275,6 @@ def build_list_html(parent_id): html += "" return html - downloaded_ids = set(pages_map.keys()) - root_ids = [] - for page in all_pages_metadata: - parent = page['parent_id'] - if parent is None or parent not in downloaded_ids: - root_ids.append(page['id']) - body_html = "

Confluence Export Index

    " for rid in root_ids: page = pages_map[rid] @@ -280,191 +295,216 @@ def build_list_html(parent_id): f.write(full_html) -# --- Handlers --- - -def handle_single(args, active_css_files=None): - target_ids = {args.pageid} - print(f"Starting 'single' dump for {args.pageid}") - # Single page -> No progress bar needed, verbose=True - process_page(args.pageid, args, active_css_files, target_ids, verbose=True) - +# --- Recursive Inventory & Scanning --- -def get_page_tree_recursive(page_id, args): - pids = [page_id] - children = myModules.get_page_children(page_id, args.base_url, platform_config, auth_info, args.context_path) - if children and 'results' in children: - for child in children['results']: - pids.extend(get_page_tree_recursive(child['id'], args)) - return pids +def recursive_scan(page_id, args, exclude_ids, scanned_count, exclude_label=None): + if page_id in exclude_ids: + print(f" [Excluded by ID] Pruning tree at page {page_id}", file=sys.stderr) + return [] + tree_ids = [page_id] + scanned_count[0] += 1 + if scanned_count[0] % 10 == 0: + sys.stderr.write(f"\rScanned {scanned_count[0]} pages...") + sys.stderr.flush() -def handle_tree(args, active_css_files=None): - print(f"Starting 'tree' dump for {args.pageid} (Inventory Phase)...") - all_ids = get_page_tree_recursive(args.pageid, args) - target_ids = set(all_ids) - - print(f"Found {len(all_ids)} pages in tree. Processing...") - # Progress bar loop - for pid in tqdm(all_ids, desc="Downloading Pages", unit="page"): - process_page(pid, args, active_css_files, target_ids, verbose=False) - - -def handle_space(args, active_css_files=None): - print(f"Starting 'space' dump for {args.space_key}") - print("Phase 1: Inventory Scan (Fetching Page IDs)...") - - target_ids = set() - all_pages_list = [] + while True: + children_data = myModules.get_child_pages(page_id, args.base_url, platform_config, auth_info, args.context_path) + if not children_data or 'results' not in children_data: break + children = children_data['results'] + if not children: break + + for child in children: + child_id = child['id'] + if exclude_label: + labels = [l['name'] for l in child.get('metadata', {}).get('labels', {}).get('results', [])] + if exclude_label in labels: + print(f" [Excluded by Label '{exclude_label}'] Pruning tree at page {child_id}", file=sys.stderr) + continue + collect_page_metadata(child) + tree_ids.extend(recursive_scan(child_id, args, exclude_ids, scanned_count, exclude_label)) + break + return tree_ids + + +def scan_space_inventory(args, exclude_ids): + print("Phase 1: Recursive Inventory Scan...") + scanned_count = [0] + homepage = myModules.get_space_homepage(args.space_key, args.base_url, platform_config, auth_info, + args.context_path) + if not homepage: + print("Error: Could not find Space Homepage.", file=sys.stderr) + return [], [] + root_id = homepage['id'] + collect_page_metadata(homepage) + all_ids_ordered = recursive_scan(root_id, args, exclude_ids, scanned_count) + print(f"\nInventory complete. Found {len(all_ids_ordered)} pages.") + return set(all_ids_ordered), all_ids_ordered + + +def scan_tree_inventory(root_id, args, exclude_ids): + print("Phase 1: Recursive Tree Scan...") + scanned_count = [0] + root_page = myModules.get_page_full(root_id, args.base_url, platform_config, auth_info, args.context_path) + if root_page: collect_page_metadata(root_page) + all_ids_ordered = recursive_scan(root_id, args, exclude_ids, scanned_count) + print(f"\nInventory complete. Found {len(all_ids_ordered)} pages.") + return set(all_ids_ordered), all_ids_ordered + + +def scan_label_forest_inventory(args, exclude_ids): + print(f"Phase 1: Label Forest Scan (Roots: '{args.label}')...") + scanned_count = [0] + root_pages = [] start = 0 - - # Phase 1: Scan (Spinner logic could be added here, but simple print is OK) while True: - res = myModules.get_pages_from_space(args.space_key, start, 200, args.base_url, platform_config, auth_info, - args.context_path) + res = myModules.get_pages_by_label(args.label, start, 200, args.base_url, platform_config, auth_info, + args.context_path) if not res or not res.get('results'): break + for p in res['results']: + if p['id'] in exclude_ids: continue + root_pages.append(p) + start += 200 - results = res['results'] - for p in results: - target_ids.add(p['id']) - all_pages_list.append(p['id']) + full_forest_ids = [] + exclude_label = getattr(args, 'exclude_label', None) + for root in root_pages: + collect_page_metadata(root) + branch_ids = recursive_scan(root['id'], args, exclude_ids, scanned_count, exclude_label) + full_forest_ids.extend(branch_ids) + unique_ordered = list(dict.fromkeys(full_forest_ids)) + print(f"\nInventory complete. Found {len(unique_ordered)} unique pages.") + return set(unique_ordered), unique_ordered - print(f" Scanned {len(results)} pages (Total found: {len(target_ids)})...") - start += 200 - print(f"Phase 2: Downloading & Processing {len(target_ids)} pages...") - # Progress bar loop - for pid in tqdm(all_pages_list, desc="Downloading Pages", unit="page"): - process_page(pid, args, active_css_files, target_ids, verbose=False) +# --- Mode Handlers --- +def run_download_phase(args, all_pages_list, target_ids, active_css_files): + print(f"Phase 2: Downloading & Processing {len(all_pages_list)} pages with {args.threads} threads...") + with ThreadPoolExecutor(max_workers=args.threads) as executor: + futures = [] + for pid in all_pages_list: + futures.append(executor.submit(process_page, pid, args, active_css_files, target_ids, verbose=False)) + for _ in tqdm(as_completed(futures), total=len(futures), desc="Downloading", unit="page"): + pass -def handle_label(args, active_css_files=None): - print(f"Starting 'label' dump for {args.label}") - print("Phase 1: Inventory Scan (Fetching Page IDs)...") - target_ids = set() - all_pages_list = [] - start = 0 +def handle_space(args, active_css_files, exclude_ids): + print(f"Starting 'space' dump for {args.space_key}") + target_ids, all_pages_list = scan_space_inventory(args, exclude_ids) + save_sidebars(args.outdir, target_ids) + run_download_phase(args, all_pages_list, target_ids, active_css_files) - while True: - res = myModules.get_pages_by_label(args.label, start, 200, args.base_url, platform_config, auth_info, - args.context_path) - if not res or not res.get('results'): break - results = res['results'] - for p in results: - target_ids.add(p['id']) - all_pages_list.append(p['id']) +def handle_tree(args, active_css_files, exclude_ids): + print(f"Starting 'tree' dump for {args.pageid}") + target_ids, all_pages_list = scan_tree_inventory(args.pageid, args, exclude_ids) + save_sidebars(args.outdir, target_ids) + run_download_phase(args, all_pages_list, target_ids, active_css_files) - print(f" Scanned {len(results)} pages (Total found: {len(target_ids)})...") - start += 200 - print(f"Phase 2: Downloading & Processing {len(target_ids)} pages...") - for pid in tqdm(all_pages_list, desc="Downloading Pages", unit="page"): - process_page(pid, args, active_css_files, target_ids, verbose=False) +def handle_label(args, active_css_files, exclude_ids): + print(f"Starting 'label' dump for {args.label}") + target_ids, all_pages_list = scan_label_forest_inventory(args, exclude_ids) + save_sidebars(args.outdir, target_ids) + run_download_phase(args, all_pages_list, target_ids, active_css_files) + + +def handle_single(args, active_css_files, exclude_ids): + print(f"Starting 'single' dump for {args.pageid}") + root = myModules.get_page_full(args.pageid, args.base_url, platform_config, auth_info, args.context_path) + if root: collect_page_metadata(root) + save_sidebars(args.outdir, {args.pageid}) + process_page(args.pageid, args, active_css_files, {args.pageid}, verbose=True) -def handle_all_spaces(args, active_css_files=None): +def handle_all_spaces(args, active_css_files, exclude_ids): print("Starting 'all-spaces' dump...") spaces = myModules.get_all_spaces(args.base_url, platform_config, auth_info, args.context_path) - if spaces and 'results' in spaces: for s in spaces['results']: print(f"\n--- Processing Space: {s['key']} ---") + global all_pages_metadata, global_sidebar_html, seen_metadata_ids + all_pages_metadata = [] + seen_metadata_ids = set() s_args = argparse.Namespace(**vars(args)) s_args.space_key = s['key'] - handle_space(s_args, active_css_files) + handle_space(s_args, active_css_files, exclude_ids) # --- Main --- def main(): - parser = argparse.ArgumentParser(description="Confluence Dump (Cloud/DC) with HTML Processing") - - # Global - g = parser.add_argument_group('Global') - g.add_argument('-o', '--outdir', required=True, help="Output directory") - g.add_argument('--base-url', required=True, help="Confluence Base URL") - g.add_argument('--profile', required=True, help="cloud or dc") - g.add_argument('--context-path', default=None, help="Context path (DC only)") - g.add_argument('--css-file', default=None, help="Path to custom CSS file (applied AFTER standard CSS)") - g.add_argument('-R', '--rst', action='store_true', help="Also export RST") - - # Subcommands - subs = parser.add_subparsers(dest='command', required=True) + parser = argparse.ArgumentParser(description="Confluence Dump") + g = parser.add_argument_group('Global Options') + g.add_argument('-o', '--outdir', required=True) + g.add_argument('--base-url', required=True) + g.add_argument('--profile', required=True) + g.add_argument('--context-path', default=None) + g.add_argument('--css-file', default=None) + g.add_argument('-R', '--rst', action='store_true') + g.add_argument('-t', '--threads', type=int, default=1) + g.add_argument('--exclude-page-id', action='append') + g.add_argument('--no-vpn-reminder', action='store_true') - p_single = subs.add_parser('single') - p_single.add_argument('-p', '--pageid', required=True) + subs = parser.add_subparsers(dest='command', required=True) + p_single = subs.add_parser('single'); + p_single.add_argument('-p', '--pageid', required=True); p_single.set_defaults(func=handle_single) - - p_tree = subs.add_parser('tree') - p_tree.add_argument('-p', '--pageid', required=True) + p_tree = subs.add_parser('tree'); + p_tree.add_argument('-p', '--pageid', required=True); p_tree.set_defaults(func=handle_tree) - - p_space = subs.add_parser('space') - p_space.add_argument('-sp', '--space-key', required=True) + p_space = subs.add_parser('space'); + p_space.add_argument('-sp', '--space-key', required=True); p_space.set_defaults(func=handle_space) - - p_label = subs.add_parser('label') - p_label.add_argument('-l', '--label', required=True) + p_label = subs.add_parser('label'); + p_label.add_argument('-l', '--label', required=True); + p_label.add_argument('--exclude-label'); p_label.set_defaults(func=handle_label) - - p_all = subs.add_parser('all-spaces') + p_all = subs.add_parser('all-spaces'); p_all.set_defaults(func=handle_all_spaces) args = parser.parse_args() - - # Setup global platform_config, auth_info active_css_files = [] - + exclude_ids = set(args.exclude_page_id) if args.exclude_page_id else set() try: platform_config = myModules.load_platform_config(args.profile) auth_info = myModules.get_auth_config(platform_config) + if args.profile == 'dc' and not args.no_vpn_reminder: + print("\n[!] DATA CENTER CHECK: Are you connected to the VPN/Intranet?") + input(" Press Enter to confirm...") + + # --- NEW: Auto-Subfolder Generation --- + timestamp = datetime.now().strftime("%Y-%m-%d %H%M") + run_title = get_run_title(args, args.base_url, platform_config, auth_info) + safe_title = sanitize_filename(run_title) + + # Update output dir to include timestamped folder + new_outdir = os.path.join(args.outdir, f"{timestamp} {safe_title}") + print(f"Creating new output directory: {new_outdir}") + args.outdir = new_outdir # Update arg for rest of script myModules.setup_output_directories(args.outdir) myModules.set_variables() - # --- CSS Strategy: Standard + Custom --- local_styles_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'styles') - standard_css_source = None - if os.path.exists(local_styles_dir): - possible_files = glob.glob(os.path.join(local_styles_dir, "*.css")) - if os.path.join(local_styles_dir, "site.css") in possible_files: - standard_css_source = os.path.join(local_styles_dir, "site.css") - elif possible_files: - standard_css_source = possible_files[0] - - if standard_css_source: - print(f"Found standard CSS: {standard_css_source}") - std_dest_name = os.path.basename(standard_css_source) - target_std = os.path.join(myModules.outdir_styles, std_dest_name) - shutil.copy(standard_css_source, target_std) - active_css_files.append(f"../styles/{std_dest_name}") - else: - print("Info: No standard CSS found in ./styles/. Base styling might be missing.") - - if args.css_file: - if os.path.exists(args.css_file): - print(f"Adding custom CSS: {args.css_file}") - custom_dest_name = os.path.basename(args.css_file) - if standard_css_source and custom_dest_name == os.path.basename(standard_css_source): - name, ext = os.path.splitext(custom_dest_name) - custom_dest_name = f"{name}_custom{ext}" - print(f" -> Renamed to {custom_dest_name} to avoid collision.") - target_custom = os.path.join(myModules.outdir_styles, custom_dest_name) - shutil.copy(args.css_file, target_custom) - active_css_files.append(f"../styles/{custom_dest_name}") - else: - print(f"Warning: Custom CSS file {args.css_file} not found.", file=sys.stderr) - + for f in glob.glob(os.path.join(local_styles_dir, "*.css")): + if "site.css" in f: + target = os.path.join(myModules.outdir_styles, os.path.basename(f)) + shutil.copy(f, target) + active_css_files.append(f"../styles/{os.path.basename(f)}") + if args.css_file and os.path.exists(args.css_file): + target = os.path.join(myModules.outdir_styles, os.path.basename(args.css_file)) + shutil.copy(args.css_file, target) + active_css_files.append(f"../styles/{os.path.basename(args.css_file)}") except Exception as e: print(f"Init Error: {e}", file=sys.stderr) sys.exit(1) - # Run try: - args.func(args, active_css_files) + args.func(args, active_css_files, exclude_ids) build_index_html(args.outdir, active_css_files) print(f"\nDump Complete. Output in {args.outdir}") except Exception as e: diff --git a/confluence_dump/myModules.py b/confluence_dump/myModules.py index cb71a19..8945bb5 100644 --- a/confluence_dump/myModules.py +++ b/confluence_dump/myModules.py @@ -2,7 +2,7 @@ """ Module to abstract Confluence API calls and provide local file/directory utilities. Supports both Confluence Cloud and Data Center platforms. -Includes BeautifulSoup logic for HTML processing (downloading assets, fixing links). +Includes BeautifulSoup logic for HTML processing (downloading assets, fixing links, injecting sidebar). """ import os @@ -12,7 +12,8 @@ import re from requests.auth import HTTPBasicAuth from urllib.parse import unquote, urlparse -from bs4 import BeautifulSoup +from bs4 import BeautifulSoup, Comment +from datetime import datetime # --- Globals for output directories --- outdir_base = "" @@ -108,6 +109,7 @@ def _build_api_url(base_url, platform_config, context_path_override, template_ke def _execute_get_request(url, auth_info, params=None): + """ Executes GET request. Prints ERRORS to stderr, but stays silent on success. """ headers = {"Accept": "application/json"} if isinstance(auth_info, dict): headers.update(auth_info) @@ -115,16 +117,23 @@ def _execute_get_request(url, auth_info, params=None): resp = requests.get(url, headers=headers, auth=auth_info if not isinstance(auth_info, dict) else None, params=params) resp.raise_for_status() + + # Robust check for HTML responses (SSO redirects) with specific hints if 'application/json' not in resp.headers.get('Content-Type', ''): - print("Error: Non-JSON response. Likely Auth/SSO issue.", file=sys.stderr) + print(f"Error: Non-JSON response from {url} (Content-Type: {resp.headers.get('Content-Type')})", + file=sys.stderr) + print("This often happens on authentication failure (redirect to HTML login page).", file=sys.stderr) + if isinstance(auth_info, dict): - print("[Hint]: Check VPN/Intranet connection for Data Center.", file=sys.stderr) + print("\n[Data Center Hint]: Are you connected to the VPN/Intranet?", file=sys.stderr) + print("Many companies block API access from outside the corporate network.", file=sys.stderr) print("Also ensure that Personal Access Tokens are not disabled by an SSO policy.", file=sys.stderr) - print("Please verify your CONFLUENCE_TOKEN environment variable.", file=sys.stderr) else: - print("\nPlease verify your CONFLUENCE_USER and CONFLUENCE_TOKEN environment variables.", + print("\n[Cloud Hint]: Please verify your CONFLUENCE_USER and CONFLUENCE_TOKEN environment variables.", file=sys.stderr) + return None + return resp.json() except Exception as e: print(f"Request Error: {e}", file=sys.stderr) @@ -139,9 +148,6 @@ def get_page_view_url(base_url, platform_config, context_path_override, spaceKey # --- Downloader --- def download_file(url, local_filename, auth_info): - """ - Downloads a file (image/attachment) from a URL to the local file system. - """ headers = {} auth_obj = None if isinstance(auth_info, dict): @@ -157,79 +163,301 @@ def download_file(url, local_filename, auth_info): f.write(chunk) return True except Exception as e: - print(f" Failed to download {url}: {e}", file=sys.stderr) + print(f"Download Error {url}: {e}", file=sys.stderr) return False # --- HTML Processor (The Core Logic) --- -def process_page_content(html_content, page_metadata, base_url, auth_info, css_files=None, exported_page_ids=None): +def inject_sidebar(soup, sidebar_html, current_page_id): """ - Parses the HTML content using BeautifulSoup. - 1. Injects Metadata. - 2. Downloads images. - 3. SMART LINK REWRITING: - - If link target IS in exported_page_ids -> Rewrite to ID.html (Offline link) - - If link target is NOT in exported_page_ids -> Keep/Make absolute URL (Online link) - 4. Injects CSS links. - - Returns: - str: The processed, standalone HTML. + Injects the sidebar HTML, wraps content in a layout, + and highlights the current page/opens parent folders. """ - if not html_content: - return "" + if not sidebar_html: return soup + + # 1. Parse Sidebar + sidebar_soup = BeautifulSoup(sidebar_html, 'html.parser') + + # 2. Highlight Current Page & Open Parents + target_href = f"{current_page_id}.html" + active_link = sidebar_soup.find('a', href=target_href) + + if active_link: + # Add active class + active_link['class'] = active_link.get('class', []) + ['active-page'] + + # Walk up the tree and set 'open' on all
    ancestors + parent = active_link.parent + while parent: + if parent.name == 'details': + parent['open'] = '' # Set attribute + parent = parent.parent - soup = BeautifulSoup(html_content, 'html.parser') + # 3. Create Layout Wrapper + if soup.body: + # Toggle Button + toggle_btn = soup.new_tag('button', id='sidebar-toggle', attrs={'title': 'Toggle Sidebar'}) + toggle_btn.string = "☰" + + layout_div = soup.new_tag('div', attrs={'class': 'layout-container'}) + + aside = soup.new_tag('aside', id='sidebar') + aside.append(Comment(" CONFLUENCE-SIDEBAR-START ")) + + if sidebar_soup.body: + for child in list(sidebar_soup.body.children): + aside.append(child) + else: + for child in list(sidebar_soup.children): + aside.append(child) + + aside.append(Comment(" CONFLUENCE-SIDEBAR-END ")) + + # JS Resizer Handle + resizer = soup.new_tag('div', id='resizer') + + main_content = soup.new_tag('main', id='content') + + # Move existing body content into main + for content in list(soup.body.contents): + main_content.append(content) + + layout_div.append(aside) + layout_div.append(resizer) + layout_div.append(main_content) + + soup.body.clear() + soup.body.append(toggle_btn) + soup.body.append(layout_div) + + # Inject Scripts (Toggle + Resizer + Persistence) + script = soup.new_tag('script') + script.string = """ + document.addEventListener('DOMContentLoaded', function() { + const btn = document.getElementById('sidebar-toggle'); + const sidebar = document.getElementById('sidebar'); + const resizer = document.getElementById('resizer'); + + const savedWidth = localStorage.getItem('sidebarWidth'); + if (savedWidth && sidebar) { + sidebar.style.width = savedWidth; + sidebar.style.flexBasis = savedWidth; + } + + if (btn && sidebar) { + btn.addEventListener('click', function() { + sidebar.classList.toggle('collapsed'); + }); + } + + if (resizer && sidebar) { + let isResizing = false; + resizer.addEventListener('mousedown', (e) => { + isResizing = true; + document.body.style.cursor = 'col-resize'; + resizer.classList.add('active'); + }); + document.addEventListener('mousemove', (e) => { + if (!isResizing) return; + let newWidth = e.clientX; + if (newWidth < 50) newWidth = 50; + if (newWidth > window.innerWidth * 0.6) newWidth = window.innerWidth * 0.6; + sidebar.style.width = newWidth + 'px'; + sidebar.style.flexBasis = newWidth + 'px'; + }); + document.addEventListener('mouseup', () => { + if (isResizing) { + localStorage.setItem('sidebarWidth', sidebar.style.width); + } + isResizing = false; + document.body.style.cursor = 'default'; + resizer.classList.remove('active'); + }); + } + }); + """ + soup.body.append(script) + + return soup + + +def process_page_content(html_content, page_metadata, base_url, auth_info, css_files=None, exported_page_ids=None, + sidebar_html=None): + """ + Parses the HTML content using BeautifulSoup. + 1. Injects Metadata (Head). + 2. Injects Page Title & Modification Info (Body Top). + 3. Downloads images & fixes links. + 4. Injects CSS & Sidebar. + """ + # FIX: Handle empty content gracefully by initializing soup with empty string. + # This ensures Title, Metadata, and Sidebar are still generated for folder-only pages. + soup = BeautifulSoup(html_content or "", 'html.parser') - # Ensure exported_page_ids is a set for fast lookup (or empty set if None) valid_ids = set(exported_page_ids) if exported_page_ids else set() + page_id = page_metadata.get('id') # 1. Metadata Injection (Head) - # Create head if missing (export_view usually just gives body fragments) if not soup.head: head = soup.new_tag('head') soup.insert(0, head) - # Title + title_string = page_metadata.get('title', 'Untitled') title_tag = soup.new_tag('title') - title_tag.string = page_metadata.get('title', 'Untitled') + title_tag.string = title_string soup.head.append(title_tag) - # Meta Tags - meta_id = soup.new_tag('meta', attrs={'name': 'confluence-page-id', 'content': page_metadata.get('id')}) + meta_id = soup.new_tag('meta', attrs={'name': 'confluence-page-id', 'content': page_id}) soup.head.append(meta_id) labels = [l['name'] for l in page_metadata.get('metadata', {}).get('labels', {}).get('results', [])] meta_labels = soup.new_tag('meta', attrs={'name': 'confluence-labels', 'content': ', '.join(labels)}) soup.head.append(meta_labels) - # CSS Links (Inject all provided CSS files) - if css_files: - for css_path in css_files: - link_css = soup.new_tag('link', attrs={'rel': 'stylesheet', 'href': css_path, 'type': 'text/css'}) - soup.head.append(link_css) - - # Body wrapper (if missing) + # --- Inject Title & Metadata in Body --- if not soup.body: body = soup.new_tag('body') + # Move any loose children to body (if any existed in empty string scenario) for element in list(soup.children): if element.name != 'head': body.append(element) soup.append(body) + # Construct Header Block + h1 = soup.new_tag('h1') + h1.string = title_string + + # Metadata Line + version_info = page_metadata.get('version', {}) + author_name = "Unknown" + date_str = "Unknown Date" + + if 'by' in version_info and 'displayName' in version_info['by']: + author_name = version_info['by']['displayName'] + + if 'when' in version_info: + try: + dt = datetime.strptime(version_info['when'].split('.')[0], "%Y-%m-%dT%H:%M:%S") + date_str = dt.strftime("%d. %b %Y") + except: + date_str = version_info['when'] + + meta_div = soup.new_tag('div', attrs={'class': 'page-metadata'}) + meta_ul = soup.new_tag('ul') + meta_li = soup.new_tag('li', attrs={'class': 'page-metadata-modification-info'}) + + meta_li.append("Zuletzt aktualisiert von ") + span_author = soup.new_tag('span', attrs={'class': 'author'}) + span_author.string = author_name + meta_li.append(span_author) + meta_li.append(" am ") + span_date = soup.new_tag('span', attrs={'class': 'last-modified'}) + span_date.string = date_str + meta_li.append(span_date) + + meta_ul.append(meta_li) + meta_div.append(meta_ul) + + soup.body.insert(0, meta_div) + soup.body.insert(0, h1) + + # CSS Injection + style_tag = soup.new_tag('style') + style_tag.string = """ + /* Global Reset */ + *, *::before, *::after { box-sizing: border-box; } + + body { margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } + .layout-container { display: flex; height: 100vh; overflow: hidden; } + + /* Sidebar Styling */ + #sidebar { + flex: 0 0 auto; + width: 350px; + min-width: 50px; + border-right: 1px solid #ddd; + overflow-y: auto; + padding: 10px; + padding-left: 15px; + padding-top: 60px; + padding-right: 4px; + background: #f4f5f7; + font-size: 14px; + resize: horizontal; + position: relative; + transition: width 0.2s, padding 0.2s; + } + + #sidebar.collapsed { + width: 0px !important; min-width: 0 !important; padding: 0; border: none; overflow: hidden; flex-basis: 0 !important; + } + + /* Resizer Handle */ + #resizer { + width: 5px; cursor: col-resize; background-color: transparent; border-left: 1px solid #eee; transition: background-color 0.2s; flex: 0 0 auto; z-index: 10; + } + #resizer:hover, #resizer.active { background-color: #4c9aff; } + + /* Toggle Button */ + #sidebar-toggle { + position: fixed; top: 15px; left: 15px; z-index: 9999; + background: rgba(255, 255, 255, 0.9); border: 1px solid #ccc; border-radius: 4px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); + font-size: 20px; cursor: pointer; color: #42526e; + width: 32px; height: 32px; line-height: 30px; text-align: center; padding: 0; + } + #sidebar-toggle:hover { background: #ebecf0; } + + /* Content Area */ + #content { + flex: 1; + overflow-y: auto; + padding: 40px 30px !important; + max-width: 100%; + } + + /* Metadata Styling */ + h1 { margin-top: 0; color: #172b4d; font-size: 2em; font-weight: 600; } + .page-metadata { margin-bottom: 20px; font-size: 12px; color: #6b778c; } + .page-metadata ul { list-style: none; padding: 0; margin: 0; } + .page-metadata li { display: inline-block; margin-right: 10px; } + + /* Sidebar Tree */ + #sidebar ul { list-style: none; padding-left: 28px; margin: 0; } + #sidebar li { margin: 4px 0; white-space: normal; word-wrap: break-word; } + #sidebar li.leaf { list-style: disc; margin-left: 18px; } + #sidebar li.folder { list-style: none; } + + #sidebar summary { cursor: pointer; font-weight: 500; margin-bottom: 2px; color: #42526e; outline: none; } + #sidebar summary > a { color: #42526e; text-decoration: none; } + #sidebar summary > a:hover { text-decoration: underline; color: #0052cc; } + + #sidebar a { text-decoration: none; color: #42526e; } + #sidebar a:hover { color: #0052cc; text-decoration: underline; } + #sidebar a.active-page { color: #0052cc; font-weight: bold; } + + #sidebar details > summary { list-style: none; } + #sidebar details > summary::-webkit-details-marker { display: none; } + #sidebar details > summary::before { content: '▶'; display: inline-block; font-size: 10px; margin-right: 6px; color: #6b778c; transition: transform 0.2s; } + #sidebar details[open] > summary::before { transform: rotate(90deg); } + """ + soup.head.append(style_tag) + + if css_files: + for css_path in css_files: + link_css = soup.new_tag('link', attrs={'rel': 'stylesheet', 'href': css_path, 'type': 'text/css'}) + soup.head.append(link_css) + # 2. Image Downloading & rewriting for img in soup.find_all('img'): src = img.get('src') - if not src: - continue + if not src: continue - # Construct full URL if relative if src.startswith('/'): full_url = base_url.rstrip('/') + src else: full_url = src - # Only download Confluence assets if '/download/' in src or '/images/icons/' in src: filename = unquote(os.path.basename(urlparse(src).path)) local_path = os.path.join(outdir_attachments, filename) @@ -239,62 +467,59 @@ def process_page_content(html_content, page_metadata, base_url, auth_info, css_f else: print(f" Warning: Could not download image {src}", file=sys.stderr) - # 3. Link Rewriting (The Smart Logic) + # 3. Link Rewriting for a in soup.find_all('a'): href = a.get('href') if not href: continue target_id = None - - # Attempt to extract Page ID from the link linked_id = a.get('data-linked-resource-id') resource_type = a.get('data-linked-resource-type') if linked_id and (not resource_type or resource_type == 'page'): target_id = linked_id elif '/pages/' in href: - # Data Center URL pattern detection match = re.search(r'/pages/(\d+)', href) if match: target_id = match.group(1) elif 'pageId=' in href: - # Query param detection try: target_id = re.search(r'pageId=(\d+)', href).group(1) except: pass - # Decision Logic if target_id and target_id in valid_ids: - # CASE A: Page is in our export -> Make relative offline link a['href'] = f"{target_id}.html" else: - # CASE B: Page is NOT in export (or external link) -> Ensure absolute online link - # If it's a relative link (starts with /), prepend the base_url if href.startswith('/'): a['href'] = base_url.rstrip('/') + href - # If it's already absolute (http...), leave it alone. - return str(soup) + # 4. Sidebar Injection + if sidebar_html: + soup = inject_sidebar(soup, sidebar_html, page_id) + return str(soup) -# --- API Calls (Updated for export_view) --- -# Note: Removed print statements to keep output clean for progress bars. +# ... (API Calls unchanged) ... def get_page_full(pageId, base_url, platform_config, auth_info, context_path_override): - # print(f"Fetching details for page: {pageId}") # DISABLED - params = {'expand': 'body.export_view,version,ancestors,space,metadata.labels'} + params_export = {'expand': 'body.export_view,version,ancestors,space,metadata.labels'} path_params = {'pageId': pageId} - url = _build_api_url(base_url, platform_config, context_path_override, 'url_get_page', path_params) + return _execute_get_request(url, auth_info, params=params_export) - data = _execute_get_request(url, auth_info, params=params) - if not data: return None - spaceKey = data.get('space', {}).get('key') - if spaceKey: - data['view_url'] = get_page_view_url(base_url, platform_config, context_path_override, spaceKey, pageId) +def get_child_pages(pageId, base_url, platform_config, auth_info, context_path_override): + url = _build_api_url(base_url, platform_config, context_path_override, 'url_get_child_pages', {'pageId': pageId}) + params = {'limit': 200, 'expand': 'ancestors,metadata.labels'} + return _execute_get_request(url, auth_info, params=params) - return data + +def get_space_homepage(spaceKey, base_url, platform_config, auth_info, context_path_override): + url = _build_api_url(base_url, platform_config, context_path_override, 'url_get_space', {'spaceKey': spaceKey}) + space_info = _execute_get_request(url, auth_info, {'expand': 'homepage'}) + if space_info and 'homepage' in space_info: + return space_info['homepage'] + return None def get_page_basic(pageId, base_url, platform_config, auth_info, context_path_override): @@ -304,14 +529,12 @@ def get_page_basic(pageId, base_url, platform_config, auth_info, context_path_ov def get_page_children(pageId, base_url, platform_config, auth_info, context_path_override): - # print(f"Fetching children for page: {pageId}") # DISABLED url = _build_api_url(base_url, platform_config, context_path_override, 'url_cql_search') - params = {'cql': f'parent={pageId}', 'limit': 200} + params = {'cql': f'parent={pageId}', 'limit': 200, 'expand': 'ancestors'} return _execute_get_request(url, auth_info, params=params) def get_page_attachments(pageId, base_url, platform_config, auth_info, context_path_override): - # print(f"Fetching attachment list for page: {pageId}") # DISABLED path_params = {'pageId': pageId} url = _build_api_url(base_url, platform_config, context_path_override, 'url_get_attachments', path_params) params = {'limit': 200} @@ -319,21 +542,18 @@ def get_page_attachments(pageId, base_url, platform_config, auth_info, context_p def get_pages_from_space(spaceKey, start, limit, base_url, platform_config, auth_info, context_path_override): - # print(f"Fetching pages for space '{spaceKey}' ({start}-{start+limit})") # DISABLED url = _build_api_url(base_url, platform_config, context_path_override, 'url_cql_search') - params = {'cql': f'space="{spaceKey}"', 'start': start, 'limit': limit} + params = {'cql': f'space="{spaceKey}"', 'start': start, 'limit': limit, 'expand': 'ancestors'} return _execute_get_request(url, auth_info, params=params) def get_pages_by_label(label, start, limit, base_url, platform_config, auth_info, context_path_override): - # print(f"Fetching pages with label '{label}' ({start}-{start+limit})") # DISABLED url = _build_api_url(base_url, platform_config, context_path_override, 'url_cql_search') - params = {'cql': f'label="{label}"', 'start': start, 'limit': limit} + params = {'cql': f'label="{label}"', 'start': start, 'limit': limit, 'expand': 'ancestors'} return _execute_get_request(url, auth_info, params=params) def get_all_spaces(base_url, platform_config, auth_info, context_path_override): - # print("Fetching all spaces...") # DISABLED url = _build_api_url(base_url, platform_config, context_path_override, 'url_get_all_spaces') params = {'limit': 200} return _execute_get_request(url, auth_info, params=params) \ No newline at end of file diff --git a/confluence_products.ini b/confluence_products.ini index 21ec98e..ff66113 100644 --- a/confluence_products.ini +++ b/confluence_products.ini @@ -1,12 +1,10 @@ [cloud] platform_type = cloud -# Cloud uses Basic Auth with User (Email) + API Token auth_method = basic_api_token -# Cloud has a fixed, non-configurable base path base_path = /wiki -# API / URL Templates -# (We assume the original script uses the v1 REST API) url_get_page = /rest/api/content/{pageId} +url_get_child_pages = /rest/api/content/{pageId}/child/page +url_get_space = /rest/api/space/{spaceKey} url_get_attachments = /rest/api/content/{pageId}/child/attachment url_cql_search = /rest/api/content/search url_get_all_spaces = /rest/api/space @@ -14,14 +12,12 @@ url_view_page = /spaces/{spaceKey}/pages/{pageId} [dc] platform_type = dc -# DC prefers Bearer Auth with a Personal Access Token (PAT) auth_method = bearer_pat -# DC has a variable context path; this is a sensible default default_context_path = /wiki -# API / URL Templates -# Note: {context_path} is a placeholder that will be filled in. url_get_page = {context_path}/rest/api/content/{pageId} +url_get_child_pages = {context_path}/rest/api/content/{pageId}/child/page +url_get_space = {context_path}/rest/api/space/{spaceKey} url_get_attachments = {context_path}/rest/api/content/{pageId}/child/attachment url_cql_search = {context_path}/rest/api/content/search url_get_all_spaces = {context_path}/rest/api/space -url_view_page = {context_path}/pages/viewpage.action?pageId={pageId} +url_view_page = {context_path}/pages/viewpage.action?pageId={pageId} \ No newline at end of file diff --git a/create_editor.py b/create_editor.py new file mode 100644 index 0000000..573e0c2 --- /dev/null +++ b/create_editor.py @@ -0,0 +1,659 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +Confluence Sidebar Editor Generator (Robust Concatenation Version) +---------------------------------------------------------------- +Generates a standalone HTML editor ('editor_sidebar.html') from 'sidebar.md'. +Uses direct string concatenation to avoid Python formatting issues with JS syntax. + +Usage: + python3 create_editor.py --site-dir "./output/TIMESTAMP Space X" +""" + +import os +import sys +import argparse +import re +import html +import shutil +from urllib.parse import unquote, urlparse + +# --- CSS CONTENT --- +CSS_CONTENT = """ + :root { + --bg-color: #f4f5f7; + --text-color: #172b4d; + --link-color: #0052cc; + --border-color: #dfe1e6; + --hover-color: #ebecf0; + --selected-color: #deebff; + --drop-target-color: #b3d4ff; + --danger-color: #de350b; + --folder-line-color: #999; /* Darker line for better visibility */ + --insert-line-color: #0052cc; + } + + * { box-sizing: border-box; } + + body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; padding: 0; margin: 0; background: var(--bg-color); height: 100vh; display: flex; flex-direction: column; } + + header { background: white; padding: 10px 20px; border-bottom: 1px solid var(--border-color); display: flex; align-items: center; justify-content: space-between; box-shadow: 0 1px 3px rgba(0,0,0,0.05); z-index: 10; flex: 0 0 auto; } + + .toolbar-group { display: flex; gap: 10px; align-items: center; } + + h1 { margin: 0; font-size: 1.1rem; color: var(--text-color); margin-right: 20px; } + + button { background: white; border: 1px solid var(--border-color); color: var(--text-color); padding: 6px 12px; border-radius: 3px; cursor: pointer; font-size: 13px; } + button:hover { background: var(--hover-color); } + button.primary { background: var(--link-color); color: white; border-color: var(--link-color); font-weight: 500; } + button.primary:hover { background: #0065ff; } + + input[type="text"] { padding: 6px 10px; border: 1px solid var(--border-color); border-radius: 3px; width: 200px; font-size: 13px; } + + .workspace { flex: 1; display: flex; overflow: hidden; } + .tree-panel { flex: 1; overflow-y: auto; padding: 20px; background: white; } + + /* Tree Structure Styling */ + ul { list-style: none; padding: 0; margin: 0; } + + /* Nested lists indentation logic: + Shift right and draw a border on the left to create the 'tree line' effect. + */ + ul li ul { + margin-left: 11px; /* Aligns line roughly with center of toggle icon above */ + padding-left: 20px; /* Push content away from the line */ + border-left: 1px solid var(--folder-line-color); + } + + #root-tree { border-left: none; margin-left: 0; } + + li { margin: 0; position: relative; } + + .node-row { + display: flex; align-items: center; + padding: 4px 8px; + border-radius: 3px; + border: 2px solid transparent; + margin-bottom: 2px; + cursor: default; + user-select: none; + transition: background 0.1s; + } + .node-row:hover { background: var(--hover-color); } + .node-row.deleted { opacity: 0.5; text-decoration: line-through; background: #fff0f0; } + + .dragging { opacity: 0.4; background: #eee; } + + /* Drop Zones */ + .drag-over-top { border-top: 3px solid var(--insert-line-color) !important; background: transparent !important; } + .drag-over-bottom { border-bottom: 3px solid var(--insert-line-color) !important; background: transparent !important; } + .drag-over-middle { background: var(--drop-target-color) !important; border: 2px dashed var(--insert-line-color) !important; opacity: 0.9; } + + .toggle-icon { width: 24px; height: 24px; text-align: center; cursor: pointer; color: #6b778c; font-size: 12px; line-height: 24px; margin-right: 2px; border-radius: 3px; } + .toggle-icon:hover { background: rgba(0,0,0,0.1); color: var(--text-color); } + .toggle-icon.leaf { visibility: hidden; } + + .drag-handle { cursor: grab; color: #b3bac5; margin-right: 8px; font-size: 16px; padding: 0 4px; } + .drag-handle:hover { color: var(--text-color); background: #eee; border-radius: 3px; } + + .node-icon { margin-right: 8px; font-size: 16px; } + .node-title { flex: 1; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding: 2px 5px; border-radius: 3px; border: 1px solid transparent; } + .node-title:focus { border-color: var(--link-color); background: white; outline: none; } + + .actions { display: none; margin-left: 10px; gap: 4px; align-items: center; } + .node-row:hover .actions { display: flex; } + .action-btn { padding: 2px 8px; font-size: 11px; border: 1px solid #ccc; background: #fff; color: #42526e; border-radius: 3px; cursor: pointer; } + .action-btn:hover { background: #ebecf0; color: var(--text-color); } + .btn-del:hover { background: #ffebe6; color: var(--danger-color); border-color: var(--danger-color); } + .btn-link { font-weight: bold; color: var(--link-color); } + + .hidden { display: none !important; } + + #toast { position: fixed; bottom: 20px; right: 20px; background: #333; color: white; padding: 10px 20px; border-radius: 4px; opacity: 0; transition: opacity 0.3s; pointer-events: none; } + #toast.show { opacity: 1; } + + #md-output-container { display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: white; padding: 20px; box-shadow: 0 5px 20px rgba(0,0,0,0.2); border-radius: 8px; z-index: 100; width: 80%; height: 80%; flex-direction: column; } + #md-textarea { flex: 1; width: 100%; margin-bottom: 10px; font-family: monospace; } + #overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 99; } +""" + +# --- 2. JS CONTENT --- +JS_CONTENT = """ +console.log("0. JS Block Started."); + +const app = {}; +app.dragSrcEl = null; +app.root = null; + +app.init = function() { + console.log("1. app.init() called"); + this.root = document.getElementById('root-tree'); + + if (!this.root) { + console.error("CRITICAL: #root-tree not found"); + return; + } + + this.root.addEventListener('click', (e) => { + const target = e.target; + if (target.classList.contains('toggle-icon')) { + this.toggle(target); + } else if (target.classList.contains('btn-del')) { + this.deleteNode(target); + } else if (target.classList.contains('btn-add')) { + this.addChild(target); + } else if (target.classList.contains('btn-exp')) { + this.toggleRecursive(target, true); + } else if (target.classList.contains('btn-col')) { + this.toggleRecursive(target, false); + } else if (target.classList.contains('btn-link')) { + const row = target.closest('.node-row'); + const titleDiv = row.querySelector('.node-title'); + const href = titleDiv.getAttribute('data-href'); + if (href) window.open(href, '_blank'); + } + }); + + this.refreshDnD(); + + const countEl = document.getElementById('node-count-display'); + if(countEl && window.EDITOR_NODE_COUNT) { + countEl.innerText = window.EDITOR_NODE_COUNT; + } + console.log("2. App initialized."); +}; + +app.updateFolderState = function(li) { + const ul = li.querySelector('ul'); + const toggle = li.querySelector('.node-row .toggle-icon'); + const icon = li.querySelector('.node-row .node-icon'); + + if (!ul || ul.children.length === 0) { + toggle.classList.add('leaf'); + toggle.innerText = '●'; + icon.innerText = '📄'; + } else { + toggle.classList.remove('leaf'); + if (ul.classList.contains('hidden')) { + toggle.innerText = '▶'; + } else { + toggle.innerText = '▼'; + } + icon.innerText = '📂'; + } +}; + +app.refreshDnD = function() { + const rows = document.querySelectorAll('.node-row'); + rows.forEach(row => { + row.setAttribute('draggable', 'true'); + row.ondragstart = this.handleDragStart.bind(this); + row.ondragover = this.handleDragOver; + row.ondragenter = this.handleDragEnter; + row.ondragleave = this.handleDragLeave; + row.ondrop = this.handleDrop.bind(this); + row.ondragend = this.handleDragEnd; + }); +}; + +app.handleDragStart = function(e) { + this.dragSrcEl = e.target.closest('li'); + e.dataTransfer.effectAllowed = 'move'; + e.dataTransfer.setData('text/html', e.target.innerHTML); + e.target.classList.add('dragging'); +}; + +app.handleDragOver = function(e) { + if (e.preventDefault) e.preventDefault(); + e.dataTransfer.dropEffect = 'move'; + + const row = e.currentTarget; + const rect = row.getBoundingClientRect(); + const relY = e.clientY - rect.top; + const height = rect.height; + + row.classList.remove('drag-over-top', 'drag-over-bottom', 'drag-over-middle'); + + if (relY < height * 0.25) { + row.classList.add('drag-over-top'); + } else if (relY > height * 0.75) { + row.classList.add('drag-over-bottom'); + } else { + row.classList.add('drag-over-middle'); + } + return false; +}; + +app.handleDragEnter = function(e) { + if (e.currentTarget.classList) e.currentTarget.classList.add('drag-over-middle'); +}; + +app.handleDragLeave = function(e) { + if (e.currentTarget.classList) e.currentTarget.classList.remove('drag-over-top', 'drag-over-bottom', 'drag-over-middle'); +}; + +app.handleDrop = function(e) { + if (e.stopPropagation) e.stopPropagation(); + + const targetRow = e.currentTarget; + const targetLi = targetRow.closest('li'); + + if (this.dragSrcEl === targetLi || this.dragSrcEl.contains(targetLi)) { + targetRow.classList.remove('drag-over-top', 'drag-over-bottom', 'drag-over-middle'); + return false; + } + + const rect = targetRow.getBoundingClientRect(); + const relY = e.clientY - rect.top; + const height = rect.height; + + if (relY < height * 0.25) { + targetLi.parentNode.insertBefore(this.dragSrcEl, targetLi); + } else if (relY > height * 0.75) { + targetLi.parentNode.insertBefore(this.dragSrcEl, targetLi.nextSibling); + } else { + let ul = targetLi.querySelector('ul'); + if (!ul) { + ul = document.createElement('ul'); + targetLi.appendChild(ul); + const toggle = targetRow.querySelector('.toggle-icon'); + toggle.classList.remove('leaf'); + toggle.innerText = '▼'; + const icon = targetRow.querySelector('.node-icon'); + icon.innerText = '📂'; + } + ul.classList.remove('hidden'); + ul.appendChild(this.dragSrcEl); + } + + this.dragSrcEl.querySelector('.node-row').classList.remove('dragging'); + this.updateFolderState(targetLi); + const oldParent = this.dragSrcEl.parentElement.closest('li'); + if (oldParent) this.updateFolderState(oldParent); + + targetRow.classList.remove('drag-over-top', 'drag-over-bottom', 'drag-over-middle'); + return false; +}; + +app.handleDragEnd = function(e) { + document.querySelectorAll('.node-row').forEach(row => { + row.classList.remove('drag-over-top', 'drag-over-bottom', 'drag-over-middle', 'dragging'); + }); +}; + +app.toggle = function(el) { + if (el.classList.contains('leaf')) return; + const li = el.closest('li'); + const ul = li.querySelector('ul'); + if (ul) { + if (ul.classList.contains('hidden')) { + ul.classList.remove('hidden'); + el.innerText = '▼'; + } else { + ul.classList.add('hidden'); + el.innerText = '▶'; + } + } +}; + +app.toggleRecursive = function(btn, expand) { + const rootLi = btn.closest('li'); + const processUl = (ul) => { if (expand) ul.classList.remove('hidden'); else ul.classList.add('hidden'); }; + const processToggle = (t) => { if (!t.classList.contains('leaf')) t.innerText = expand ? '▼' : '▶'; }; + + const rootUl = rootLi.querySelector('ul'); + const rootToggle = rootLi.querySelector('.node-row .toggle-icon'); + if (rootUl) processUl(rootUl); + if (rootToggle) processToggle(rootToggle); + + rootLi.querySelectorAll('ul').forEach(processUl); + rootLi.querySelectorAll('.toggle-icon').forEach(processToggle); +}; + +app.expandAll = function() { + document.querySelectorAll('ul.hidden').forEach(ul => ul.classList.remove('hidden')); + document.querySelectorAll('.toggle-icon:not(.leaf)').forEach(el => el.innerText = '▼'); +}; + +app.collapseAll = function() { + document.querySelectorAll('#root-tree ul').forEach(ul => ul.classList.add('hidden')); + document.querySelectorAll('.toggle-icon:not(.leaf)').forEach(el => el.innerText = '▶'); +}; + +app.expandToLevel = function(level) { + this.collapseAll(); + const expandRecursive = (ul, currentLevel) => { + if (currentLevel >= level) return; + + Array.from(ul.children).forEach(li => { + const childUl = li.querySelector('ul'); + const toggle = li.querySelector('.node-row .toggle-icon'); + + if (childUl) { + childUl.classList.remove('hidden'); + if (toggle && !toggle.classList.contains('leaf')) { + toggle.innerText = '▼'; + } + expandRecursive(childUl, currentLevel + 1); + } + }); + }; + if (this.root) expandRecursive(this.root, 0); +}; + +app.deleteNode = function(btn) { + const row = btn.closest('.node-row'); + row.classList.toggle('deleted'); +}; + +app.addChild = function(btn) { + const parentLi = btn.closest('li'); + let ul = parentLi.querySelector('ul'); + + if (!ul) { + ul = document.createElement('ul'); + parentLi.appendChild(ul); + } + ul.classList.remove('hidden'); + + const newLi = app.createNodeElement("New Page", null); + ul.prepend(newLi); + + this.updateFolderState(parentLi); + this.refreshDnD(); +}; + +app.newItem = function() { + const newLi = app.createNodeElement("New Root Item", null); + app.root.prepend(newLi); + app.refreshDnD(); +}; + +app.createNodeElement = function(title, href) { + const li = document.createElement('li'); + // FIX: Use JS ternary operator for optional href check, not Python 'if' + // And simple string concatenation for robustness + const displayStyle = href ? '' : 'style="display:none"'; + + li.innerHTML = ` +
    + + + 📄 +
    ${title}
    +
    + + + + + +
    +
    + `; + return li; +}; + +app.filter = function(term) { + term = term.toLowerCase(); + const items = document.querySelectorAll('li'); + + if (!term) { + items.forEach(li => li.classList.remove('hidden')); + return; + } + + items.forEach(li => li.classList.add('hidden')); + + document.querySelectorAll('.node-title').forEach(div => { + if (div.innerText.toLowerCase().includes(term)) { + let li = div.closest('li'); + li.classList.remove('hidden'); + let parent = li.parentElement.closest('li'); + while (parent) { + parent.classList.remove('hidden'); + const ul = parent.querySelector('ul'); + if (ul) ul.classList.remove('hidden'); + parent = parent.parentElement.closest('li'); + } + } + }); +}; + +app.generateMarkdown = function() { + let md = ""; + function walk(ul, level) { + Array.from(ul.children).forEach(li => { + const row = li.querySelector('.node-row'); + if (row.classList.contains('deleted')) return; + const titleDiv = row.querySelector('.node-title'); + const title = titleDiv.innerText.trim(); + const href = titleDiv.getAttribute('data-href'); + const indent = " ".repeat(level); + if (href) { + md += `${indent}- [${title}](${href})\\n`; + } else { + md += `${indent}- ${title}\\n`; + } + const childUl = li.querySelector('ul'); + if (childUl && childUl.children.length > 0) { + walk(childUl, level + 1); + } + }); + } + walk(this.root, 0); + const textarea = document.getElementById('md-textarea'); + textarea.value = md; + document.getElementById('overlay').style.display = 'block'; + document.getElementById('md-output-container').style.display = 'flex'; + textarea.select(); +}; + +app.copyToClipboard = function() { + const el = document.getElementById('md-textarea'); + el.select(); + document.execCommand('copy'); + const t = document.getElementById('toast'); + t.classList.add('show'); + setTimeout(() => t.classList.remove('show'), 2000); +}; + +app.closeModal = function() { + document.getElementById('overlay').style.display = 'none'; + document.getElementById('md-output-container').style.display = 'none'; +}; + +document.addEventListener('DOMContentLoaded', () => { + app.init(); +}); +""" + + +# --- Python Parser Logic --- + +class Node: + def __init__(self, title, href=None, level=0): + self.title = title + self.href = href + self.level = level + self.children = [] + + +def parse_markdown(md_content): + lines = md_content.splitlines() + root = Node("root", level=-1) + stack = [root] + node_count = 0 + + link_pattern = re.compile(r'\[(.*?)\]\((.*?)\)') + + for line in lines: + stripped = line.strip() + if not stripped or not stripped.startswith('-'): + continue + + raw_indent = line[:line.find('-')] + level = raw_indent.count('\t') + (raw_indent.count(' ') // 2) + content = stripped[1:].strip() + + match = link_pattern.search(content) + if match: + title = match.group(1) + raw_href = match.group(2) + filename = os.path.basename(unquote(urlparse(raw_href).path)) + href = f"pages/{filename}" + else: + title = content + href = None + + node = Node(title, href, level) + node_count += 1 + + while len(stack) > 1 and stack[-1].level >= level: + stack.pop() + + stack[-1].children.append(node) + stack.append(node) + + return root, node_count + + +def render_editor_html(node): + if not node.children: return "" + + ul_class = "hidden" if node.level >= 0 else "" + html_out = f"
      \n" + + for child in node.children: + has_children = len(child.children) > 0 + icon = "📂" if has_children else "📄" + arrow = "▶" if has_children else "▶" + toggle_class = "" if has_children else "leaf" + + safe_title = html.escape(child.title) + safe_href = html.escape(child.href) if child.href else "" + href_attr = f'data-href="{safe_href}"' if child.href else "" + + html_out += f'
    • \n' + html_out += f'
      \n' + html_out += f'{arrow}\n' + html_out += f'\n' + html_out += f'{icon}\n' + html_out += f'
      {safe_title}
      \n' + html_out += '
      \n' + + # Logic: Show link button only if href is present + # Since this is Python generating HTML string, we use Python 'if' + link_style = '' if child.href else 'style="display:none"' + html_out += f'\n' + + html_out += '\n' + html_out += '\n' + html_out += '\n' + html_out += '\n' + html_out += '
      \n' + html_out += '
      \n' # End row + + if has_children: + html_out += render_editor_html(child) + + html_out += "
    • \n" + + html_out += "
    \n" + return html_out + + +def main(): + parser = argparse.ArgumentParser(description="Generate Sidebar Editor") + parser.add_argument('--site-dir', required=True, help="Directory containing sidebar.md") + args = parser.parse_args() + + site_dir = args.site_dir + source_path = os.path.join(site_dir, "sidebar.md") + edit_path = os.path.join(site_dir, "sidebar_edit.md") + out_html_path = os.path.join(site_dir, "editor_sidebar.html") + + md_to_parse = source_path + if os.path.exists(edit_path): + print(f"Found working copy: {edit_path}") + md_to_parse = edit_path + elif os.path.exists(source_path): + print(f"Creating working copy from: {source_path}") + shutil.copy(source_path, edit_path) + md_to_parse = edit_path + else: + print(f"Error: No sidebar.md found in {site_dir}") + sys.exit(1) + + with open(md_to_parse, 'r', encoding='utf-8') as f: + root, count = parse_markdown(f.read()) + + tree_html = render_editor_html(root) + + # Fix root ul: ensure it's visible and has ID + tree_html = tree_html.replace("